Wątki bez odpowiedzi | Aktywne wątki Teraz jest 27 gru 2024, o 12:46



Odpowiedz w wątku  [ Posty: 30 ]  Przejdź na stronę 1, 2  Następna strona
Pomocy:) Programowanie - C 
Autor Wiadomość
SV Rider
Avatar użytkownika

Dołączył(a): 22 lip 2010, o 22:42
Posty: 908
Lokalizacja: Września/Poznań -> PWR/PO
Płeć: mężczyzna
Moto: SV 1000S
Post 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;
}

_________________
SV 650S Y --> SV 1000S K4


9 gru 2011, o 03:49
Zobacz profil
SV Rider

Dołączył(a): 23 paź 2010, o 11:52
Posty: 346
Płeć: mężczyzna
Moto: SV650 S2000, N2002
Post 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
Zobacz profil
Mister Apollo
Avatar użytkownika

Dołączył(a): 23 lut 2010, o 07:16
Posty: 5365
Lokalizacja: WGM
Płeć: mężczyzna
Moto: Z1000
Post 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

_________________
SV 650S - Błękitny Ogórek -> Z1000 - Ognista pomarańcza


9 gru 2011, o 12:18
Zobacz profil
rowerzysta

Dołączył(a): 1 lut 2011, o 23:33
Posty: 14
Płeć: kobieta
Moto: monster s2r
Post 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.

_________________
http://www.bikepics.com/members/reen84/


9 gru 2011, o 13:15
Zobacz profil
SV Rider

Dołączył(a): 15 gru 2010, o 16:13
Posty: 1083
Lokalizacja: [WZ] + [CIN]
Płeć: mężczyzna
Moto: SV 650S '01
Post 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.

_________________
Jeśli nie spróbujesz to nigdy nie dowiesz się czy było warto

SV 650S
Obrazek


9 gru 2011, o 13:37
Zobacz profil
SV Rider
Avatar użytkownika

Dołączył(a): 22 lip 2010, o 22:42
Posty: 908
Lokalizacja: Września/Poznań -> PWR/PO
Płeć: mężczyzna
Moto: SV 1000S
Post 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ź.

_________________
SV 650S Y --> SV 1000S K4


9 gru 2011, o 14:41
Zobacz profil
Mister Apollo
Avatar użytkownika

Dołączył(a): 23 lut 2010, o 07:16
Posty: 5365
Lokalizacja: WGM
Płeć: mężczyzna
Moto: Z1000
Post 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
Zobacz profil
SV Rider

Dołączył(a): 15 gru 2010, o 16:13
Posty: 1083
Lokalizacja: [WZ] + [CIN]
Płeć: mężczyzna
Moto: SV 650S '01
Post 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 :)

_________________
Jeśli nie spróbujesz to nigdy nie dowiesz się czy było warto

SV 650S
Obrazek


10 gru 2011, o 01:50
Zobacz profil
japoński tamburyniarz
Avatar użytkownika

Dołączył(a): 7 mar 2010, o 02:19
Posty: 292
Lokalizacja: RKR / Warszawa
Płeć: mężczyzna
Moto: SV650S 2006
Post 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
Zobacz profil
motorowerzysta

Dołączył(a): 11 lis 2011, o 11:51
Posty: 94
Lokalizacja: Tomaszów Maz.
Płeć: mężczyzna
Moto: SV650S 2003
Post 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.

_________________
...do pełna tankuj, cisza asfaltu...


10 gru 2011, o 20:03
Zobacz profil
SV Rider

Dołączył(a): 15 gru 2010, o 16:13
Posty: 1083
Lokalizacja: [WZ] + [CIN]
Płeć: mężczyzna
Moto: SV 650S '01
Post 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ą.

_________________
Jeśli nie spróbujesz to nigdy nie dowiesz się czy było warto

SV 650S
Obrazek


11 gru 2011, o 19:30
Zobacz profil
SV Rider
Avatar użytkownika

Dołączył(a): 23 maja 2011, o 08:54
Posty: 518
Lokalizacja: Łódź
Płeć: mężczyzna
Moto: SV650S 2003
Post 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
Zobacz profil
motorowerzysta

Dołączył(a): 11 lis 2011, o 11:51
Posty: 94
Lokalizacja: Tomaszów Maz.
Płeć: mężczyzna
Moto: SV650S 2003
Post 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
Zobacz profil
SV Rider
Avatar użytkownika

Dołączył(a): 22 lip 2010, o 22:42
Posty: 908
Lokalizacja: Września/Poznań -> PWR/PO
Płeć: mężczyzna
Moto: SV 1000S
Post 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
Zobacz profil
SV Rider

Dołączył(a): 23 paź 2010, o 11:52
Posty: 346
Płeć: mężczyzna
Moto: SV650 S2000, N2002
Post 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
Zobacz profil
SV Rider
Avatar użytkownika

Dołączył(a): 22 lip 2010, o 22:42
Posty: 908
Lokalizacja: Września/Poznań -> PWR/PO
Płeć: mężczyzna
Moto: SV 1000S
Post 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
Zobacz profil
motorowerzysta

Dołączył(a): 11 lis 2011, o 11:51
Posty: 94
Lokalizacja: Tomaszów Maz.
Płeć: mężczyzna
Moto: SV650S 2003
Post 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
Zobacz profil
SV Rider

Dołączył(a): 23 paź 2010, o 11:52
Posty: 346
Płeć: mężczyzna
Moto: SV650 S2000, N2002
Post 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 ;)

_________________
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
Zobacz profil
SV Rider

Dołączył(a): 23 paź 2010, o 11:52
Posty: 346
Płeć: mężczyzna
Moto: SV650 S2000, N2002
Post 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

_________________
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
Zobacz profil
SV Rider
Avatar użytkownika

Dołączył(a): 23 lut 2010, o 18:55
Posty: 2755
Post Re: Pomocy:) Programowanie - C
:omg: Ja pindolę, po chińsku piszą :wtf:

_________________
Sv 650N K7 Phantom Gray


16 sty 2012, o 23:12
Zobacz profil
Wyświetl posty nie starsze niż:  Sortuj wg  
Odpowiedz w wątku   [ Posty: 30 ]  Przejdź na stronę 1, 2  Następna strona

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

Szukaj:
Skocz do:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by STSoftware.
Przyjazne użytkownikom polskie wsparcie phpBB3 - phpBB3.PL