zdravím dostali jsme ukol se zněním :
z klavesnice zadejte cela cisla kladna,zaporna a nulu (cisla mensi nez 100) a vypocitejte prumer a soucet cisel co ste vlozili
a to tak že program zvlášť sečte kladné čísla (a udělá prumer ), zaporné čísla(a udela prumer) , a počet nul
zadavání čísel se ukončí když vložíte číslo 1e3.
má to být pomocí while
je tu nekdo kdo by mi prosim pomohl ? sem totalne tupy (aspon cast jak tam vložit na zacatek podminky a hlavne jak tam dat podminku aby se to ukončilo když vložím to 1e3 zbytek zvládnu díky).
Fórum › C / C++
Soucet a prumer cisel (while)
nerozumim te ukoncovaci podmince: program se ukonci kdyz zadate cislo 1e3. to ma byt hexadecimalne? nejak takhle:
int in, klad_poc=0, zap_poc=0, klad_souc=0, zap_souc=0, poc_nul=0;
do{
scanf("%d",&in);
if(in>0) klad_souc+=in,klad_poc++;
else if(in<0) zap_souc+=in,zap_poc++;
else if(in == 0x1e3) break; //!!!
else poc_nul++;
}
printf("Prumer kladnych=%f, prumer zapornych=%f, pocet nul=%d\n",(float)klad_souc/klad_poc, (float)zap_souc/zap_poc, poc_nul);
Jinak (tedy predpokladam, ze se budou zadavat cisla mensi nez 100 A VETSI NEZ -100) by stacil datovy typ char (i kdyz to by zase neodpovidalo ani me teorii ze 1e3 je 1000 a ani te, ze 1e3 je 483, jelikoz signed char je tusim od -128 do 128..)
To tmi: nemelo byt tam byt misto "do" "while"?
To Zelenáč : jo nakonci melo bejt while(1);, nejak mi to vypadlo... 1e3==1000 me taky nedoslo... ale stejne mi to logicky nesedi, jak by potom program reagoval na cisla 101 atd... napada me ze se ma ukoncit spis pri vsutpu>=1e2 || <=-1e2... a pak by skutecne stacil signed char. ale ta pametova uspora je nepatrna, navic se pri aritmetickych vyrazech celociselne typy stejne konvertujou na int
Hmm, je tu uz kod v C, uvedu jeste v C++.
Pokud bys to chtel umlatit jen pomoci while, pak:
#include <iostream>
using namespace std;
int main()
{
int pocet = 0, cislo = 0;
int kladny_soucet = 0, kladny_pocet = 0;
int pocet_nul = 0;
int zaporny_soucet = 0, zaporny_pocet = 0;
while((cislo < 100)&&(cislo > -100))
{
pocet = pocet + 1;
cout <<" " <<pocet <<". cislo: ";
cin >> cislo;
while((cislo > 0)&&(cislo < 100))
{
kladny_soucet = kladny_soucet + cislo;
kladny_pocet = kladny_pocet + 1;
break;
}
while(cislo == 0)
{
pocet_nul = pocet_nul + 1;
break;
}
while((cislo < 0)&&(cislo > -100))
{
zaporny_soucet = zaporny_soucet + cislo;
zaporny_pocet = zaporny_pocet + 1;
break;
}
}
cout <<endl <<" Soucet kladnych cisel: " <<kladny_soucet <<endl;
while(kladny_pocet > 0)
{
cout <<" Prumer: " <<kladny_soucet / kladny_pocet <<endl <<endl;
break;
}
cout <<" Pocet nul: " <<pocet_nul <<endl <<endl
<<" Soucet zapornych cisel: " <<zaporny_soucet <<endl;
while(zaporny_pocet > 0)
{
cout <<" Prumer: " <<zaporny_soucet / zaporny_pocet;
break;
}
//Muze byt prumer zaporny ??
cin.get();
cin.get();
return 0;
}
Jsem na nej pysny, je to jeden z mych prvnich fungujicich programu.. :smile2:
...
tak nejak nechapu logiku toho programu. proc tam pouzivas jen while? je jasne ze se telo provede pouze jedenkrat, tak tim ctenare akorat mates... a proc tam mas promennou pocet? neni pozadovana a navic jeji hodnota je v kazdem kroku programu soucet pocet_kladnych+pocet_zapornych + pocet_nul. a u meho kodu neni specifikovano jestli je v C nebo v C++, zkompilovat by se dal v obojim... navic jediny rozdil je v tom jaky input/output se pouzije... a myslim ze je lepsi psat programy na 9 radku nez programy na 55 radku)
To tmi :
h2so4 psal, ze to ma byt pomoci while, tak me zajimalo, jestli to jde "jen" pomoci while..
Cekal jsem, ze na ten program budou reakce.. Urcite neni dokonaly, ja jsem rad, ze funguje.
Jakmile nekde vidim "printf", tak to povazuju za C ..
Z toho vseho vyplyva, ze by to mozna chtelo forum pro zacatecniky, kde by se mohlo diskutovat o jednoduchych vecech a kde by se mysky a novacci nestydeli za to pridat tam svuj prispevek..
To Jeyekomon : Ale mne se to reseni pomoci "while" moc libi :smile2: Me samotneho by to nenapadlo, je to takove... originalni ;-) Na muj kod se take vzdy okamzite sesypou stiznosti od Jury, sn3d apod. na "priserny navrh".. Zastavam nazor, ze zivot je moc kratky na to, aby clovek programoval a jeste se zabyval navrhem sveho kodu. Zkratka neco dotahnu do podoby, kdy to funguje, a pokud to za to stoji, pak se teprve snazim kod zkratit, zprehlednit, pridelat nejake komentare...
To Jeyekomon : ale tak se nestyd, ja sem to nemyslel jako nejaky vysmech, spis jako objektivni kritiku... kdyz sem byl malej tak sem psaval strasny prasarny (a myslim ze sem nebyl sam...). klidne sem pis vsechno co te napadne (aspon se tu bude neco dit), a my ti rekneme jak to napsat efektivneji (nebo spis jak si myslime ze to je efketivnejsi, a ne vzdy mame pravdu)).
To Zelenáč : na zprehlednovani kodu jsem nikdy nemel zaludek... vzhledem k tomu ze mam tendenci psat na co nejmin radku to bejva dost nechutne nahusteny (operator ',' rulez))
Tak to ja, at napisu sebevetsi prasarnu, musi to byt dokonale "typograficky spravne". Vsechno odsazuji minimalne po dvou mezerach, lepe vsak po ctyrech ci pomoci tabulatoru, za kazdym parametrem musi byt mezera, mezi operatory pisu zasadne mezeru.. Absolutne nesnasim "jednoradkove" if bez slozenych zavorek nebo dokonce na jednom radku.. Ackoli jsem "normalne" desnej bordelar, na "strukture" kodu si doopravdy zakladam. Naopak s navrhem se opravdu nikdy nezabyvam. Zkratka pisu to, co mi zrovna vytane na mysli, nijak nad tim nepremyslim - jestli bych tenhle objekt nemel rozdelit, jestli by tahle metoda nemela byt soukroma nebo proc ta funkce kolize, od ktere ocekavam logickou hodnotu, vraci long int...
tak to to si taky rikam, ale kdyz se ti potom kod roztece pres sto radku a porad nema smysl delit ho do vic souboru tak si rikam ze to uz prestava bejt prehledny...
jednoradkovy if & while & for pouzivam pokud jejich telo obsahuje jeden prikaz, to mi pride rozhodne lepsi.
a slozeny zavorky tam tez pisu, ale vetsinou jim nevyhrazuju volnej radek, clovek to odlisi pomoci odsazeni (to se snazim mit taky striktne)
nejlepsi je podle me psat husty bloky navzajem souvisejiciho kodu, ktery pak oddelis jednim-dvema prazdnejma radkama, v tom se pak celkove snaz orientuje... nesnasim lidi ktery delaj prazdnej radek snad po kadzdym prikazu...
tak v tom pripade by to muj program zezral, jen by bylo treba nahradit
else poc_nul++;
radky
else if(in==0)poc_null++;
else printf("Cislo mimo rozsah\n");
a odstranit to 0x ze zapisu cisla 1e3
#include<stdio.h>
#include<stdlib.h>
int main ()
{
int in, klad_poc=0, zap_poc=0, klad_souc=0, zap_souc=0, poc_nul=0;
do{
scanf("%d",&in);
if(in>0) klad_souc+=in,klad_poc++;
else if(in<0) zap_souc+=in,zap_poc++;
else if(in == 1e3)
break; //!!!
else if(in==0)poc_nul++;
else printf("Cislo mimo rozsah\n");
}
while (1);
printf("Prumer kladnych=%f, prumer zapornych=%f, pocet nul=%d\n",(float)klad_souc/klad_poc, (float)zap_souc/zap_poc, poc_nul);
system("pause");
return 0;
}
když toto vložim tak se to ukoončí ale už se nic nevypíše vlastne se to jakoby sekne
To Zelenáč : ??? proc by tam 1e3 byt nemohlo? to se prelozi naprosto ok. je to sice realne cislo, ale porovnavat realna a desetina lze ... rovnost u realnych byva osemetna, ale vzhledem k tomu ze to realne je konstanta ktera se porovnava s celym cislem to nemuze bejt problem, normalne se to pri zadani 1000 ukonci
To h2so4 : no ono by to ani nic vypsat zprvu nemelo, protoze prvni instrukce ke ktere se po inicializaci dostane je funkce scanf, ktera ceka na uzivatelsky vstup. nebo jak presne se to chovalo? zkousel si tam zadat cisla...?
To h2so4 [#54604]: no ono by to ani nic vypsat zprvu nemelo, protoze prvni instrukce ke ktere se po inicializaci dostane je funkce scanf, ktera ceka na uzivatelsky vstup. nebo jak presne se to chovalo? zkousel si tam zadat cisla...?
no když zadam ty cisla pak stisknu 1e3 a už se nedá zadat ani jine cislo ani to nic nevypíše jedine co se da udelat je že to zavřu.
To h2so4 [#54604]: no ono by to ani nic vypsat zprvu nemelo, protoze prvni instrukce ke ktere se po inicializaci dostane je funkce scanf, ktera ceka na uzivatelsky vstup. nebo jak presne se to chovalo? zkousel si tam zadat cisla...?
no když zadam ty cisla pak stisknu 1e3 a už se nedá zadat ani jine cislo ani to nic nevypíše jedine co se da udelat je že to zavřu.
tak problem je v tom ze kdyz zadas 1e3 tak on to nepochopi jako cele cislo, ale jako desetine, coz je v rozporu s implementaci. toto by se dalo zaridit tak ze bys misto do promenne typu int nacital do promenne typu float(double..), tedy fuknce scanf by vypadala takto: scanf("%f",&in), a podminka testovani rovnosti s nulou by vypadala takto: if(int(in) == 0)... protoze realne cislo 0 neni vzdy nula). jinak by to melo byt v poradku.
ovsem to je castecne v rozporu se zadanim, kde se mluvi o cislech celych. to by se dalo vyresit takto:
float temp;
int in.
do{
scanf("%f",&temp);
in = int(temp);
... a dal uz normalne
//zadavejte z klavesnice cela cisla - kladna, zaporna, 0 mensi nez 100.
//vkladani ukoncite cislem 1e3
//vypoctete pocet a prumer kladnych cisel
//pocet a prumer zapornych cisel a pocet nul
//cislo 1e3 nesmim ani spracovavat
#include <stdio.h>
#include<stdlib.h>
main ()
{
float prumer_klad,prumer_zap;
int pocet_kl,poc_nul,poc_zap,soucet_klad,soucet_zap,cislo,;
prumer_klad =0;
prumer_zap=0;
pocet_kl=0;
poc_nul=0;
poc_zap=0;
soucet_klad=0;
soucet_zap=0;
cislo = 0;
printf ("zadavejte cisla,zadavani ukoncete cislem 1e3");
while ((cislo !=1e3) && (cislo > -100) && (cislo < 100))
scanf ("%d",&cislo);
if (cislo !=0)
{
if (cislo<0)
{
poc_zap=poc_zap+1;
soucet_zap=soucet_zap+cislo;
prumer_zap=soucet_zap/poc_zap;
}
if (cislo == 0)
{
poc_nul=cislo+1;
}
if (cislo >0)
{
pocet_kl=pocet_kl+1;
soucet_klad=soucet_klad+cislo;
prumer_klad=soucet_klad/pocet_kl;
}
}
printf ("pocet kladnych cisel %d\n",pocet_kl);
printf ("soucet kladnych cisel je %d\n",soucet_klad);
printf ("prumer kladnych cisel je %d\n",prumer_klad);
printf ("pocet zapornych cisel %d\n",poc_zap);
printf ("soucet zapornych cisel je %d\n",soucet_zap);
printf ("prumer zapornych cisel je %d\n",prumer_zap);
printf ("pocet nul je %d\n",poc_nul);
system("pause");
return 0;
}
prosim hodte radu proč to nejede diky
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Prumer lichych cisel v intervalu — založil Adam
Aritmetický průměr více čísel — založil vitas01
Vektor čísel a jejcih výskyt + průměr — založil katerinaa1
Posloupnost čísel, lichá čísla,průměr — založil Karel
Součet čísel ze souboru — založil Axik
Moderátoři diskuze