Forum » Programiranje » C (Izračun povprečja)
C (Izračun povprečja)
minghags ::
Bi mi lahko mogoče kdo pomagal pri tej nalogi?
Hvala
Z uporabo urejevalnika vi ustvarite zbirko 'program_E1061392.c' in v programskem jeziku C (in ne C++) napišite funkcijo za izračun povprečja števil, ki jih podamo kot vhodne argumente (za pretvorbo niza v število uporabite funkcijo atoi). V glavnem programu preverite koliko argumentov je prisotnih. Če vhodni argumenti programa niso podani naj program izpiše rezultat 0, v nasprotnem primeru pa izračunano število. Izvorni program prevedite z prevajalnikom gcc z uporabo stikala -g3. Program zaženite z ukazom ./a.out. Nato s programom valgrind preverite pravilnost delovanja vašega programa.
Hvala
mallard ::
int main(int argc, char** argv) { }
Začni tukaj. argc je število vhodnih argumentov, argv pa kazalec do nizov z vhodnimi argumenti.
joze67 ::
C program se začne z:
argc je pozitiven in argv[0] je ime programa. To spustiš.
Sedaj pa za vse ostale (argv@1], argv[2], ...argv[argc-1]) uporabiš na vsakem atoi(), da dobiš celo število, in sproti seštevaš. Potem deliš z argc-1 in dobiš povprečje.
Paziti moraš na posebnosti:
LP
int main(int argc, char* argv[])
argc je pozitiven in argv[0] je ime programa. To spustiš.
Sedaj pa za vse ostale (argv@1], argv[2], ...argv[argc-1]) uporabiš na vsakem atoi(), da dobiš celo število, in sproti seštevaš. Potem deliš z argc-1 in dobiš povprečje.
Paziti moraš na posebnosti:
- argc je pozitiveen, lahko pa je 1 (ni argumentov). Seštevanje je odveč, deljenje pogubno. Navodilo je jasno - v tem posebnem primeru (kar boš torej testiral takoj na začetku) izpiši 0.
- deljenje celoštevilske vsote s celoštevilskim številom sumandov ti bo dalo celoštevilsko povprečje - ki je manj kot dejansko povprečje (povprečje 1 in 2 je 1,5 in ne 1). Zato moraš enega od teh dveh spremeniti v double. Vsota se kar sama ponuja za tako akrobacijo.
- Naj te ne zanese - če že seštevaš v double, obstaja funkcija atof(), ki bi prenesla tudi realna števila - a naloga je na tem mestu jasna!
- In kaj se bo zgodilo, če argument ne bo celo število? Odvisno od tečaja lahko to zanemariš ali pa ne. atoi() bo dal vse od sebe (to pomeni, da bo pretvarjal število, dokler bo celo), verjetno je to kar dovolj.
LP
minghags ::
Največ do kam sem prišel je to:
Na C se ne spoznam :S Prosim za pomoč... Hvala
#include <stdio.h> #include <stdarg.h> double average(double v1 , double v2,...); int main() { printf("\n Average = %lf", average(3.5, 4.5, 0.0)); printf("\n Average = %lf", average(1.0, 2.0)); printf("\n Average = %lf\n", average(0.0,1.2,1.5)); } double average( double v1, double v2,...) { va_list parg; double sum = v1+v2; double value = 0; int count = 2; va_start(parg,v2); while((value = va_arg(parg, double)) != 0.0) { sum += value; printf("\n in averge = %.2lf", value); count++; } va_end(parg); return sum/count; }
Na C se ne spoznam :S Prosim za pomoč... Hvala
joze67 ::
Predaleč. Najprej funkcija average() zahteva vsaj dva elementa - kaj pa 0 in 1? Potem pa si se ustrelil v nogo, ker moraš sedaj polje nizov pretvoriti v va_list. In tvoji primeri - samo eden od treh pravilno kliče funkcijo (z 0.0 na koncu); s tem, da ti naloga ne da licence, da 0 obravnavaš posebej.
Gre mnogo enostavneje - in pazi, tudi main() je funkcija.
Razen če ne veš še česa, česar mi ne. Npr kako deluje valgrind.
Gre mnogo enostavneje - in pazi, tudi main() je funkcija.
int main(int argc, char*argv[]) { double sum = 0.0; int i; /* argc > 0; ce je 1, ni argumentov */ if (argc == 1) { printf("\n0"); } else { for (i=1; i<argc; i++) { sum += atoi(argv[i]); } printf("\n%lf", sum/(argc-1)); } return 0; /* naj bi pomenilo OK */ }
Razen če ne veš še česa, česar mi ne. Npr kako deluje valgrind.
joze67 ::
Program pokličeš takole:
Ko prideš v funkcijo main(), velja:
In sedaj imaš problem. Ker bi želel sešteti teh pet števil, ampak v roki imaš pet nizov. Zato pretvoriš z atoi:
Sedaj pa imaš v roki nekaj, kar lahko sešteješ.
Lahko seveda kompliciraš tudi takole:
Sedaj imaš v polju iargv skupaj argc-1 števil (ker si šel od 1 naprej in ne kot je v C navada od 0 - to pa zato, ker argv[0] ni podatek, ki ga hočeš), ki jih lahko vržeš v drugo funkcijo (ne kot va_list, ampak kot navadno polje, pa še argument za dolžino polja - kot main()):
in pokličeš
LP
a.out 1 2 3 4 5
Ko prideš v funkcijo main(), velja:
argc==6 argv[0]=="a.out" argv[1]=="1" argv[2]=="2" argv[3]=="3" argv[4]=="4" argv[5]=="5"
In sedaj imaš problem. Ker bi želel sešteti teh pet števil, ampak v roki imaš pet nizov. Zato pretvoriš z atoi:
atoi(argv[1])==1 atoi(argv[2])==2 atoi(argv[3])==3 atoi(argv[4])==4 atoi(argv[5])==5
Sedaj pa imaš v roki nekaj, kar lahko sešteješ.
Lahko seveda kompliciraš tudi takole:
int * iargv; iargv = (int*)malloc(sizeof(int) * (argc-1)); for(i=1; i<argc;i++) { iargv[i-1]=atoi(argv[i]); }
Sedaj imaš v polju iargv skupaj argc-1 števil (ker si šel od 1 naprej in ne kot je v C navada od 0 - to pa zato, ker argv[0] ni podatek, ki ga hočeš), ki jih lahko vržeš v drugo funkcijo (ne kot va_list, ampak kot navadno polje, pa še argument za dolžino polja - kot main()):
double average(int count, int* number) { double sum=0.0; int i; for (i=0; i<count; i++) { sum += number[i]; } return count == 0 ? 0 : sum/count; }
in pokličeš
average(argc-1, iargv);
LP
win64 ::
Kaj pa, če se bi na računalniškem faksu naučil osnove programiranja?
Polja, zanke, pretvorbe
Polja, zanke, pretvorbe
amacar ::
Evo ti mojo lansko, čeprav bi se lahko malo potrudil sam. Tudi nam ni bilo lani nič jasno, ker s c-jem nismo nič delali, pa vseeno, smo neko bolj pocarsko kodo zrihtali.
Link do celotne naloge: http://www12.zippyshare.com/v/44898867/...
Link do celotne naloge: http://www12.zippyshare.com/v/44898867/...
#include <stdio.h> void Povprecje (int argc, char *argv[]) { int max; int j; int st = 0; double povp = 0.0; for (j = 1; j < argc; j++) { povp = povp + atoi(argv[j]); st++; } povp = povp/st; printf("%lf", povp); printf("\n"); } int main(int argc, char *argv[]) { int st_arg; int i; st_arg=0; for (i = 1; i < argc; i++) { st_arg++; } if(st_arg > 0) { Povprecje(argc, argv); } else { int argumenti=0; printf("%d",argumenti); printf("\n"); } return 0; }
Zgodovina sprememb…
- spremenil: amacar ()
joze67 ::
Šala meseca:
namesto
(ne spuščam se v to, ali st_arg potrebuje ali ne).
st_arg=0; for (i = 1; i < argc; i++) { st_arg++; }
namesto
st_arg = argc-1;
(ne spuščam se v to, ali st_arg potrebuje ali ne).
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [C] ProcesiOddelek: Programiranje | 975 (884) | Cvenemir |
» | [C] Vsota števil v poljuOddelek: Programiranje | 1283 (1221) | Cvenemir |
» | [c] Enaki datotekiOddelek: Programiranje | 1038 (898) | Spura |
» | C - pomočOddelek: Programiranje | 1457 (1197) | Thagirion |
» | [C++][Naloga] Tekstovne datoteke, realna številaOddelek: Programiranje | 4051 (3667) | Gundolf |