Forum Suzuki SV - SVforum.pl
https://suzukisv.com.pl/

Pomocy:) Programowanie - C
https://suzukisv.com.pl/viewtopic.php?f=13&t=5481
Strona 1 z 2

Autor:  silver [ 9 gru 2011, o 03:49 ]
Tytuł:  Pomocy:) Programowanie - C

Witam,
Bawię się ostatnio w języku C (mam na studiach podstawy) i nie ogarniam jednej rzeczy:
Program poniżej wyrzuca macierz 2x3 z kolejnymi liczbami. Może mi ktoś wyjaśnić, dlaczego gdy umieszczę funkcję printf w pierwszej pętli (tam gdzie jest "//" )wyrzuca kolejno liczby a ta sama funkcja wpisana w drugiej pętli daje normalnie ładną macierz. Na czym polega różnica? dlaczego właściwie trzeba tworzyć drugą pętle i wpisać niemal to samo? nie mogę uchwycić tej dyskretnej różnicy :) jak na to wpływa wyrażenie "k=k+1"? może niech ktoś kompetentny wytłumaczy mi krok po kroku co tak na prawdę napisałem, bo mam wrażenie, że używam czegoś a do końca nie wiem jak działa. Łopatologicznie proszę :)

Kod:
#include <stdio.h>
#define W 3
#define K 2
int main (void){
        int t[W][K];
        int k=1;
        int i,j;
                for (i=0;i<W;i++){
                        for (j=0;j<K;j++){
                        t[i][j]=k;
                        k=k+1;
//                      printf("%d",t[i][j]);
                        }
                }
        for (i=0;i<W;i++){
                for (j=0;j<K;j++){
                printf("%d ",t[i][j]);
                }
        printf("\n");
        }
return 0;
}

Autor:  lpmop [ 9 gru 2011, o 08:41 ]
Tytuł:  Re: Pomocy:) Programowanie - C

Dziwne u mnie działa.

Autor:  kacperski [ 9 gru 2011, o 12:18 ]
Tytuł:  Re: Pomocy:) Programowanie - C

Kod:
printf("%d ",t[i][j]);
printf("\n");
W drugiej pętli masz zawarty znak łamania tekstu, a między pobraniem zmiennych masz biały znak - spację :mlotek:
PS. Zastrzel mnie, za cholerę nie wiem/pamiętam co tutaj ma robić %d :P

Autor:  aaaAga [ 9 gru 2011, o 13:15 ]
Tytuł:  Re: Pomocy:) Programowanie - C

silver napisał(a):
Witam,
Bawię się ostatnio w języku C (mam na studiach podstawy) i nie ogarniam jednej rzeczy:
Program poniżej wyrzuca macierz 2x3 z kolejnymi liczbami. Może mi ktoś wyjaśnić, dlaczego gdy umieszczę funkcję printf w pierwszej pętli (tam gdzie jest "//" )wyrzuca kolejno liczby a ta sama funkcja wpisana w drugiej pętli daje normalnie ładną macierz. Na czym polega różnica?

W drugiej pętli przechodzisz do nowej linii po każdej kolumnie
silver napisał(a):
dlaczego właściwie trzeba tworzyć drugą pętle i wpisać niemal to samo? nie mogę uchwycić tej dyskretnej różnicy :) jak na to wpływa wyrażenie "k=k+1"? może niech ktoś kompetentny wytłumaczy mi krok po kroku co tak na prawdę napisałem, bo mam wrażenie, że używam czegoś a do końca nie wiem jak działa. Łopatologicznie proszę. :)


k = k+1; to to samo co k++;
zamień kolejnością 2 pętle i zobaczysz różnice.

Autor:  Erazer [ 9 gru 2011, o 13:37 ]
Tytuł:  Re: Pomocy:) Programowanie - C

silver napisał(a):
może niech ktoś kompetentny wytłumaczy mi krok po kroku co tak na prawdę napisałem, bo mam wrażenie, że używam czegoś a do końca nie wiem jak działa. Łopatologicznie proszę.

Rozpisać Ci linijka po linijce?? :>

kacperski napisał(a):
PS. Zastrzel mnie, za cholerę nie wiem/pamiętam co tutaj ma robić %d :P

Reprezentacja liczby Double - ma wyświetlać liczbę całkowitą. Spokojnie można by użyć %i jako że reprezentację w macierzy masz jako int'y.

Autor:  silver [ 9 gru 2011, o 14:41 ]
Tytuł:  Re: Pomocy:) Programowanie - C

Na początek dziękuje wszystkim za odpowiedzi.

Cytuj:
Rozpisać Ci linijka po linijce?? :>


Tak :) jeśli można.

a to %d to wydawało mi się, że to właśnie reprezentacja "Int" :) double to już liczba zmiennoprzecinkowa, chyba że się mylę?

Cytuj:
zamień kolejnością 2 pętle i zobaczysz różnice


będę się bawił wieczorem, dzięki za podpowiedź.

Autor:  kacperski [ 9 gru 2011, o 15:00 ]
Tytuł:  Re: Pomocy:) Programowanie - C

Rozpisywanie tego nie ma sensu. Rzuć okiem na pierwszy lepszy manual dot. składni pętli for(,,).
Potem zrób sobie jakiś prosty algorytm (na 1 wymierze!) np sortowanie bąbelkowe EDIT: Niech cię ręka boska broni przed używaniem kody ze strony, gucio się tak nauczysz.
Jak już to ogarniesz, pierwszy zestaw pętli przypisuje wartości w tablicy (zewnętrzna pętla to kolejne wiersze), drugi je odczytuje na ekran. Potem pójdzie z górki ;)

Autor:  Erazer [ 10 gru 2011, o 01:50 ]
Tytuł:  Re: Pomocy:) Programowanie - C

silver napisał(a):
a to %d to wydawało mi się, że to właśnie reprezentacja "Int" :) double to już liczba zmiennoprzecinkowa, chyba że się mylę?

Kurcze, rzeczywiście - złapałeś mnie :P
%d i %i są zamienne w użyciu w printf, a double jest reprezentowany poprzez %f (float)

kacperski napisał(a):
Rozpisywanie tego nie ma sensu.

Kiedy ja zaczynałem przygodę z programowaniem, to szukałem właśnie prostych przykładów z opisem zasad działania (a wierz mi, że nie było to w tamtych czasach łatwe zadanie :P ). Zresztą z opisem jest o wiele prościej zrozumieć zasadę i się nauczyć, niż klepać przykłady. Jak zrozumiesz zasadę, to przykładami sobie to poćwiczysz.

EDIT:
Opis linijka po linijce poszedł na priv, coby nie zaśmiecać forum, a >> tu << masz jeszcze przykłady użycia printf z różnymi schematami literkowymi :)

Autor:  wojtek [ 10 gru 2011, o 13:59 ]
Tytuł:  Re: Pomocy:) Programowanie - C

Jeśli dobrze pamiętam, to w compilatorach jest możliwość prześledzenia wykonania kodu programu iteracyjnie krok po kroku, w tym przypadku mogło by Ci to pomóc w zrozumieniu jak działa program.

Autor:  mariusz_tm [ 10 gru 2011, o 20:03 ]
Tytuł:  Re: Pomocy:) Programowanie - C

Erazer mącisz trochę.
%d to int
%f to float
%lf to double

float i double to dwie inne bajki. float ma 4 bajty a double 8

silver napisał(a):
Może mi ktoś wyjaśnić, dlaczego gdy umieszczę funkcję printf w pierwszej pętli (tam gdzie jest "//" )wyrzuca kolejno liczby a ta sama funkcja wpisana w drugiej pętli daje normalnie ładną macierz. Na czym polega różnica? dlaczego właściwie trzeba tworzyć drugą petle i wpisać niemal to samo?


Nie ma żadnej różnicy i nie musisz mieć tej drugiej pętli. Będzie wszystko ok jeśli do tej zewnętrznej pętli dopiszesz printf("\n") - czyli przejście to nowej linii.

Autor:  Erazer [ 11 gru 2011, o 19:30 ]
Tytuł:  Re: Pomocy:) Programowanie - C

mariusz_tm napisał(a):
Erazer mącisz trochę.
%d to int
%f to float
%lf to double

float i double to dwie inne bajki. float ma 4 bajty a double 8

No zgodzę się, %f jest rzeczywiście mniej dokładny od %lf, jednak obie reprezentują liczbę zmiennoprzecinkową, ale jeśli
podasz pełnego doubla to %f też go wyświetli, tyle że z mniejszą dokładnością.

Autor:  exo [ 11 gru 2011, o 20:20 ]
Tytuł:  Re: Pomocy:) Programowanie - C

Z tego co pamiętam to można ustawiać dokładność double więc to nie problem %f czy %lf

Autor:  mariusz_tm [ 11 gru 2011, o 21:16 ]
Tytuł:  Re: Pomocy:) Programowanie - C

Nie wnikam jakie są dokładności po przecinku dla float i double. Zasadnicza różnica jest w max wartości jaką może reprezentować dany typ.

Autor:  silver [ 20 gru 2011, o 23:12 ]
Tytuł:  Re: Pomocy:) Programowanie - C

Witam,
Trochę poćwiczyłem i zatrzymałem się na następującym problemie:
trzeba napisać skrypt który będzie wczytywał Z zestawów macierzy W*K znajdujących się w jednym pliku. Na razie dla uproszczenia Z=2, więc mój plik "dane0.txt" wygląda tak:

0 1 2
1 2 3
2 4 5
3 6 7
0 8 9
1 1 2
2 3 4
3 5 6
itd.
Pierwsza kolumna oznacza numer np. pomiaru, kolumny 2 i 3 wartości w ogólności mogą być różne.

Skrypt ma to wczytać, uśrednić i zapisać wynik do pliku. Powinienem więc dostać jedną macierz z uśrednionymi wartościami. U mnie nie uśrednia poprawnie, wyrzuca jakieś wartości z kosmosu. Co jest źle?
kod:

Kod:
#include <stdio.h>
#define Z 2
#define W 4
#define K 3
int main (void){
        int x[W][K];
        double avgx[W][K];
        int i,j,k;
        FILE *f;

        f=fopen ("dane0.txt","r");
//      printf("%s\n","wczytana");
        for (k=0;k<Z;k++){
                for (i=0;i<W;i++){
                        for (j=0;j<K;j++){
                                fscanf (f,"%d",&x[i][j]);
//                              printf ("%d ",x[i][j]);
                        }
                        fscanf (f,"\n");
//              printf("\n");
                }
        }

        fclose(f);

        for (k=0;k<Z;k++){
                for (i=0;i<W;i++){
                        for (j=0;j<K;j++){
                                avgx[i][j]=avgx[i][j]+(double)x[i][j];
                        }
                        for (j=0;j<K;j++){
                                avgx[i][j]=avgx[i][j]/(double)Z;
                        }
                }
        }

        FILE *h;
        h=fopen ("pr7w.txt","w");
        for(i=0;i<W;i++){
                for(j=0;j<K;j++){
                        if(j==0){
                                avgx[i][j]=(double)x[i][j];
                                fprintf(h,"%d ",(int)avgx[i][j]);
                        }
                        else{
                                avgx[i][j]=avgx[i][j]/(double)Z;
                                fprintf(h,"%lf ",avgx[i][j]);
                        }
                }
                fprintf(h,"\n");
        }
        fclose(h);
return 0;
}


Autor:  lpmop [ 21 gru 2011, o 00:11 ]
Tytuł:  Re: Pomocy:) Programowanie - C

Ja bym napisał o tak ;)
Kod:
#include <stdio.h>
#include <stdlib.h>
#define Z 2
#define W 4
#define K 3
int main (void)
{
    int x[W][K];
    //double avgx[W][K];
    int i,j,k,tm=0 ;
    FILE *f;
    // wyzerowanie tabeli w c nalezy o tym pamiętać w innych językach już nie tak bardzo.
   for (i=0;i<W;i++)
   {
      for (j=0;j<K;j++)
      {
         x[i][j]=(j==0?i:0);
      }
   }
    f=fopen ("dane0.txt","r");
    for (k=0;k<Z;k++)
   {
        for (i=0;i<W;i++)
      {
            for (j=0;j<K;j++)
         {
                fscanf (f,"%d",&tm);//odczytanie do zmiennej
                x[i][j]+=(j?tm:0);// sumowanie
            }
            fscanf (f,"\n");
        }
    }
    fclose(f);
    FILE *h;
    //zapis do pliku
    h=fopen ("pr7w.txt","w");
    for(i=0;i<W;i++)
   {
        for(j=0;j<K;j++)
      {
         if(j==0)
               fprintf(h,"%d ",x[i][j]);
         else
             fprintf(h,"%lf ",((double)x[i][j]/(double)Z));
        }
        fprintf(h,"\n");
    }
    fclose(h);
   system("pause");
   return 0;
}


0 4.500000 5.500000
1 1.500000 2.500000
2 3.500000 4.500000
3 5.500000 6.500000


Jeśli chodzi o Twój kod zabrakło Ci jednego wymiaru w tablicach.
fscanf (f,"%d",&x[i][j]); <- zapisywałeś 2x do tej samej tabeli na tą samą pozycję.
Dalsza analiza kodu nie ma sensu.
Moja propozycja rozpisz sobie na kartce linijka po linijce jaka wartość jest w jakiej zmiennej i tak przeanalizuj cały kod.

Co do samego kodu to jeśli nie musisz czegoś zapisywać do zmiennej to po prostu tego nie rób.
Pamiętaj idealna sytuacja jest wtedy kiedy nie ma kodu -> im mniej kodu tym lepiej ;)
Jeśli chcesz się bawić w programowanie polecił bym przesiadkę na c# jest prostszy i ma garbage collector co się przydaje jeśli chcesz komuś program do czegoś napisać.
Jak co pisz ;)
pozdro

Autor:  silver [ 21 gru 2011, o 00:45 ]
Tytuł:  Re: Pomocy:) Programowanie - C

Działa! wielkie dzięki :)
Co do języka programowania, to takiego na razie się uczymy na informatyce więc taki chwilowo muszę umieć :)
Jeszcze jedna rzecz, możesz proszę wyjaśnić mi te zapisy?
x[i][j]=(j==0?i:0)
x[i][j]+=(j?tm:0)
Pierwszy raz się z takimi spotykam. Łopatologicznie jeśli można :)

Autor:  mariusz_tm [ 21 gru 2011, o 02:24 ]
Tytuł:  Re: Pomocy:) Programowanie - C

Z tego co pamiętam jest to wyrażenie warunkowe, które sprawdza czy j jest równe zero. Jeśli tak to do x[i][j] wpisuje wartość i a jeśli nie to wpisuje 0. A to += to chodzi o to, że jak masz np. a+=b to to jest to samo co a=a+b.

Autor:  lpmop [ 21 gru 2011, o 09:23 ]
Tytuł:  Re: Pomocy:) Programowanie - C

@silver tylko przeanalizuj kod i zastanów się dlaczego tak a nie inaczej ;) i naucz się korzystać z debugera :P
@mariusz_tm dokładnie tak ;)

Autor:  lpmop [ 16 sty 2012, o 23:04 ]
Tytuł:  Re: Pomocy:) Programowanie - C

to nie c tylko php z cyklu jak utrudnić sobie życie
Kod:
foreach($shCp as $tm )
{
   $toEval2[]='"<td class=\"'.$tm.' db1".($eq=((($isSet1=(isset($tab1[$uField]) && isset($tab1[$uField][\''.$tm.'\'])))& ($isSet2=(isset($tab2[$uField]) && isset($tab2[$uField][\''.$tm.'\']))))&&($tab1[$uField][\''.$tm.'\'] == $tab2[$uField][\''.$tm.'\']))?"":" notEqu")."\">".($isSet1?$tab1[$uField][\''.$tm.'\']:"--")."</td><td class=\"'.$tm.' db2$eq\">".($isSet2?$tab2[$uField][\''.$tm.'\']:"--")."</td>" ';
   $out .= "<td>$tm [1]</td><td>$tm [2]</td>";
}

chodzi o fragment:
Kod:
($eq=((($isSet1=(isset($tab1[$uField]) && isset($tab1[$uField][\''.$tm.'\'])))& ($isSet2=(isset($tab2[$uField]) && isset($tab2[$uField][\''.$tm.'\']))))&&($tab1[$uField][\''.$tm.'\'] == $tab2[$uField][\''.$tm.'\']))?"":" notEqu")

i użycie &, && , ?: :)
Ktoś to ogarnia :D

Autor:  Bartosz [ 16 sty 2012, o 23:12 ]
Tytuł:  Re: Pomocy:) Programowanie - C

:omg: Ja pindolę, po chińsku piszą :wtf:

Strona 1 z 2 Strefa czasowa: UTC + 1 [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/