» »

C (Izračun povprečja)

C (Izračun povprečja)

minghags ::

Bi mi lahko mogoče kdo pomagal pri tej nalogi?

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

Spura ::

Aritmetricno povprecje je sestevek stevil deljeno s stevilom stevil.

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:
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:

#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.
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.

minghags ::

Ja ampak nevem kaj bi naj s tem atoi... Hvala za pomoč

joze67 ::

atoi() ... ascii to integer

minghags ::

Ja to sem pregledal, ampak nevem kje oz. kak bi ga uporabil... pa zakaj...

Spura ::

Ker so commandline argumenti stringi, ti rabis pa stevila za izracun povprecja.

joze67 ::

Program pokličeš takole:
 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

minghags ::

Na žalost mi ne uspe, nikoli mi nič ne izpiše ve :S

win64 ::

Kaj pa, če se bi na računalniškem faksu naučil osnove programiranja?
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/...

#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:

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 ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C] Procesi

Oddelek: Programiranje
6970 (879) Cvenemir
»

[C] Vsota števil v polju

Oddelek: Programiranje
51270 (1208) Cvenemir
»

[c] Enaki datoteki

Oddelek: Programiranje
71033 (893) Spura
»

C - pomoč

Oddelek: Programiranje
111451 (1191) Thagirion
»

[C++][Naloga] Tekstovne datoteke, realna števila

Oddelek: Programiranje
254018 (3634) Gundolf

Več podobnih tem