Prawdopodobnie najlepsze na świecie forum Suzuki SV 650 / SV 1000 ;)
Pomocy:) Programowanie - C
Autor |
Wiadomość |
silver
SV Rider
Dołączył(a): 22 lip 2010, o 22:42 Posty: 908 Lokalizacja: Września/Poznań -> PWR/PO
Płeć: mężczyzna
Moto: SV 1000S
|
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ę
_________________ SV 650S Y --> SV 1000S K4
|
9 gru 2011, o 03:49 |
|
|
lpmop
SV Rider
Dołączył(a): 23 paź 2010, o 11:52 Posty: 346
Płeć: mężczyzna
Moto: SV650 S2000, N2002
|
Re: Pomocy:) Programowanie - C
Dziwne u mnie działa.
_________________ Suma ilorazu inteligencji ludzi na świecie jest stała tylko liczba bydła przybywa !#.... sv 650 s 00r ->sv 650 n 99r
|
9 gru 2011, o 08:41 |
|
|
kacperski
Mister Apollo
Dołączył(a): 23 lut 2010, o 07:16 Posty: 5365 Lokalizacja: WGM
Płeć: mężczyzna
Moto: Z1000
|
Re: Pomocy:) Programowanie - C
W drugiej pętli masz zawarty znak łamania tekstu, a między pobraniem zmiennych masz biały znak - spację PS. Zastrzel mnie, za cholerę nie wiem/pamiętam co tutaj ma robić %d
_________________ SV 650S - Błękitny Ogórek -> Z1000 - Ognista pomarańcza
|
9 gru 2011, o 12:18 |
|
|
aaaAga
rowerzysta
Dołączył(a): 1 lut 2011, o 23:33 Posty: 14
Płeć: kobieta
Moto: monster s2r
|
Re: Pomocy:) Programowanie - C
W drugiej pętli przechodzisz do nowej linii po każdej kolumnie k = k+1; to to samo co k++; zamień kolejnością 2 pętle i zobaczysz różnice.
_________________ http://www.bikepics.com/members/reen84/
|
9 gru 2011, o 13:15 |
|
|
Erazer
SV Rider
Dołączył(a): 15 gru 2010, o 16:13 Posty: 1083 Lokalizacja: [WZ] + [CIN]
Płeć: mężczyzna
Moto: SV 650S '01
|
Re: Pomocy:) Programowanie - C
Rozpisać Ci linijka po linijce?? 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.
_________________ Jeśli nie spróbujesz to nigdy nie dowiesz się czy było warto
SV 650S
|
9 gru 2011, o 13:37 |
|
|
silver
SV Rider
Dołączył(a): 22 lip 2010, o 22:42 Posty: 908 Lokalizacja: Września/Poznań -> PWR/PO
Płeć: mężczyzna
Moto: SV 1000S
|
Re: Pomocy:) Programowanie - C
Na początek dziękuje wszystkim za odpowiedzi. 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ę? będę się bawił wieczorem, dzięki za podpowiedź.
_________________ SV 650S Y --> SV 1000S K4
|
9 gru 2011, o 14:41 |
|
|
kacperski
Mister Apollo
Dołączył(a): 23 lut 2010, o 07:16 Posty: 5365 Lokalizacja: WGM
Płeć: mężczyzna
Moto: Z1000
|
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
_________________ SV 650S - Błękitny Ogórek -> Z1000 - Ognista pomarańcza
|
9 gru 2011, o 15:00 |
|
|
Erazer
SV Rider
Dołączył(a): 15 gru 2010, o 16:13 Posty: 1083 Lokalizacja: [WZ] + [CIN]
Płeć: mężczyzna
Moto: SV 650S '01
|
Re: Pomocy:) Programowanie - C
Kurcze, rzeczywiście - złapałeś mnie %d i %i są zamienne w użyciu w printf, a double jest reprezentowany poprzez %f (float) 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 ). 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
_________________ Jeśli nie spróbujesz to nigdy nie dowiesz się czy było warto
SV 650S
|
10 gru 2011, o 01:50 |
|
|
wojtek
japoński tamburyniarz
Dołączył(a): 7 mar 2010, o 02:19 Posty: 292 Lokalizacja: RKR / Warszawa
Płeć: mężczyzna
Moto: SV650S 2006
|
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.
_________________ SV 650 S K6
|
10 gru 2011, o 13:59 |
|
|
mariusz_tm
motorowerzysta
Dołączył(a): 11 lis 2011, o 11:51 Posty: 94 Lokalizacja: Tomaszów Maz.
Płeć: mężczyzna
Moto: SV650S 2003
|
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 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.
_________________ ...do pełna tankuj, cisza asfaltu...
|
10 gru 2011, o 20:03 |
|
|
Erazer
SV Rider
Dołączył(a): 15 gru 2010, o 16:13 Posty: 1083 Lokalizacja: [WZ] + [CIN]
Płeć: mężczyzna
Moto: SV 650S '01
|
Re: Pomocy:) Programowanie - C
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ą.
_________________ Jeśli nie spróbujesz to nigdy nie dowiesz się czy było warto
SV 650S
|
11 gru 2011, o 19:30 |
|
|
exo
SV Rider
Dołączył(a): 23 maja 2011, o 08:54 Posty: 518 Lokalizacja: Łódź
Płeć: mężczyzna
Moto: SV650S 2003
|
Re: Pomocy:) Programowanie - C
Z tego co pamiętam to można ustawiać dokładność double więc to nie problem %f czy %lf
_________________ Nie ma kobiet idealnych. Są tylko takie, które swoje wady potrafią przysłonić swoim biustem.
|
11 gru 2011, o 20:20 |
|
|
mariusz_tm
motorowerzysta
Dołączył(a): 11 lis 2011, o 11:51 Posty: 94 Lokalizacja: Tomaszów Maz.
Płeć: mężczyzna
Moto: SV650S 2003
|
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.
_________________ ...do pełna tankuj, cisza asfaltu...
|
11 gru 2011, o 21:16 |
|
|
silver
SV Rider
Dołączył(a): 22 lip 2010, o 22:42 Posty: 908 Lokalizacja: Września/Poznań -> PWR/PO
Płeć: mężczyzna
Moto: SV 1000S
|
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; }
| | | | |
_________________ SV 650S Y --> SV 1000S K4
|
20 gru 2011, o 23:12 |
|
|
lpmop
SV Rider
Dołączył(a): 23 paź 2010, o 11:52 Posty: 346
Płeć: mężczyzna
Moto: SV650 S2000, N2002
|
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
_________________ Suma ilorazu inteligencji ludzi na świecie jest stała tylko liczba bydła przybywa !#.... sv 650 s 00r ->sv 650 n 99r
|
21 gru 2011, o 00:11 |
|
|
silver
SV Rider
Dołączył(a): 22 lip 2010, o 22:42 Posty: 908 Lokalizacja: Września/Poznań -> PWR/PO
Płeć: mężczyzna
Moto: SV 1000S
|
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
_________________ SV 650S Y --> SV 1000S K4
|
21 gru 2011, o 00:45 |
|
|
mariusz_tm
motorowerzysta
Dołączył(a): 11 lis 2011, o 11:51 Posty: 94 Lokalizacja: Tomaszów Maz.
Płeć: mężczyzna
Moto: SV650S 2003
|
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.
_________________ ...do pełna tankuj, cisza asfaltu...
|
21 gru 2011, o 02:24 |
|
|
lpmop
SV Rider
Dołączył(a): 23 paź 2010, o 11:52 Posty: 346
Płeć: mężczyzna
Moto: SV650 S2000, N2002
|
Re: Pomocy:) Programowanie - C
@silver tylko przeanalizuj kod i zastanów się dlaczego tak a nie inaczej i naucz się korzystać z debugera @mariusz_tm dokładnie tak
_________________ Suma ilorazu inteligencji ludzi na świecie jest stała tylko liczba bydła przybywa !#.... sv 650 s 00r ->sv 650 n 99r
|
21 gru 2011, o 09:23 |
|
|
lpmop
SV Rider
Dołączył(a): 23 paź 2010, o 11:52 Posty: 346
Płeć: mężczyzna
Moto: SV650 S2000, N2002
|
Re: Pomocy:) Programowanie - C
to nie c tylko php z cyklu jak utrudnić sobie życie chodzi o fragment: i użycie &, && , ?: Ktoś to ogarnia
_________________ Suma ilorazu inteligencji ludzi na świecie jest stała tylko liczba bydła przybywa !#.... sv 650 s 00r ->sv 650 n 99r
|
16 sty 2012, o 23:04 |
|
|
Bartosz
SV Rider
Dołączył(a): 23 lut 2010, o 18:55 Posty: 2755
|
Re: Pomocy:) Programowanie - C
Ja pindolę, po chińsku piszą
_________________ Sv 650N K7 Phantom Gray
|
16 sty 2012, o 23:12 |
|
|
Kto przegląda forum |
Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość |
|
Nie możesz rozpoczynać nowych wątków Nie możesz odpowiadać w wątkach Nie możesz edytować swoich postów Nie możesz usuwać swoich postów
|
|