| Autor | Správa |
svejk
 Užívateľ
 Založený: 18.03.2007 Príspevky: 251
 | Zaslal: Ne 15.01.12 11:33 |   |
zdravim snazil som sa naprogramovat jednoduchu kalkulacku: | kód: | #include <stdio.h>
#include <stdlib.h>
#include <string.h>
float cislo1, cislo2;
char operand;
float vysledek;
int main (void){
puts("this is calculator from SVEJK");
puts("=============================\n\n\n");
scanf("%f%c%f", &cislo1, &operand, &cislo2);
vypocet();
return 0;
}
void vypocet (){
switch(operand){
case'+':
vysledek=cislo1+cislo2;
printf("%f\n", vysledek);
scanf("%c%f", &operand, &cislo2);
vypocet();
case'/':
vysledek=cislo1/cislo2;
printf("%f", vysledek);
scanf("%c%f", &operand, &cislo2);
vypocet();
case'*':
vysledek=cislo1*cislo2;
printf("%f", vysledek);
scanf("%c%f", &operand, &cislo2);
vypocet();
case'-':
vysledek=cislo1-cislo2;
printf("%f", vysledek);
scanf("%c%f", &operand, &cislo2);
vypocet();
}
} |
no je tu jeden problem.. najskor nacita cislo+operand+cislo, pokracujefunkciou vypocet kde sa podla operandu prevedie vypocet. dalej som chcel aby znovu nacital operand+cislo, a pokracoval funkciou vypocet, aby to fungovalo jak nekonecna kalkulacka..
lenze scanf("%c%f", &operand, &cislo2); poda kontrolnych vypisou nenacitava dbre znak operand. neviete niektopreco??
som zaciatocnik.. sorry za mozno debilne otazky  |
| |
   |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1052
 | Zaslal: Ne 15.01.12 14:31 |   |
1.) kedze nepouzivas prikaz break po kazdom navesti v prikaze switch, po kazdom navesti sa jednoducho prejde na dalsie navestie. Prejavi sa to sice az uplne na konci, ak zadas napr iny znak, ako + - * / , kedze pouzivas rekurziu, ale je to velmi casta chyba a zaciatocnici ju dost tazko hladaju. Nikdy preto na break nezabudaj, ak nie je nutne vykonat viac navesti - v tomto pripade to nutne nie je, prave naopak, je to chyba.
2.) predopkladam, ze ak zadavas dalsie moznosti hned po prvej, kde uz citas iba operand a cislo, chces nadvazovat na predchadzajuci vysledok. Ty ale nikde nepouzivas tento vysledok, stale pocitas odznova.
3.) tu je hlavny povodca chyby - opat zabudas, ze scanf nacitava aj znak enter a ten robi pri dalsom citani neplechu. Radu, ako sa s tym vysporiadat, som ti dal v tejto teme. Takze mozes pouzit %*c aby ho ignorovalo, kedze vravis, ze funkcia, ktoru som ti poradil, je pre teba tazkopadna.
Vysledny funkcny program:
| kód: | #include <stdio.h>
#include <stdlib.h>
#include <string.h>
void vypocet ();
float cislo1, cislo2;
char operand;
float vysledek;
int main (void){
puts("this is calculator from SVEJK");
puts("=============================\n\n\n");
scanf("%f%c%f%*c", &cislo1, &operand, &cislo2);
vysledek = cislo1;
vypocet();
return 0;
}
void vypocet (){
switch(operand){
case'+':
vysledek=vysledek+cislo2;
printf("%f\n", vysledek);
scanf("%c%f%*c", &operand, &cislo2);
vypocet();
break;
case'/':
vysledek=vysledek/cislo2;
printf("%f\n", vysledek);
scanf("%c%f%*c", &operand, &cislo2);
vypocet();
break;
case'*':
vysledek=vysledek*cislo2;
printf("%f\n", vysledek);
scanf("%c%f%*c", &operand, &cislo2);
vypocet();
break;
case'-':
vysledek=vysledek-cislo2;
printf("%f\n", vysledek);
scanf("%c%f%*c", &operand, &cislo2);
vypocet();
break;
}
} |
|
| |
   |
 |
svejk
 Užívateľ
 Založený: 18.03.2007 Príspevky: 251
 | Zaslal: Ne 15.01.12 17:45 |   |
dakujem, na ten enter stale zabudam..
este by som ta prosil o vysvetlenie ohladom jedneho caseu ktory som dorobil. mal by vyrabat mocninu len hlasi ze je zly navratovy typ, no on je dobry tu je ta cast: | kód: | case'n':
vysledek=mocnina(vysledek, cislo2);
printf("%f", vysledek);
scanf("%c%f%*c", &operand, &cislo2);
vypocet();
break;
}
return 0;
}
float mocnina (float cislo, float exponent){
float umocnene;
for(int n=exponent; n>0; n--){
umocnene=cislo*cislo;
}
return umocnene;
} |
to vyladovanie programou mi nejde..
// pridané po 6 minútach od posledného príspevku
alebo dalsi moznost: | kód: | case'n':
vysledek=mocnina();
printf("%f", vysledek);
scanf("%c%f%*c", &operand, &cislo2);
vypocet();
break;
}
return 0;
}
float mocnina (){
for(int n=cislo2; n>1; n--){
vysledek=vysledek*vysledek;
}
return vysledek;
} |
// pridané po 7 minútach od posledného príspevku
no uz mi to funguje: | kód: | case'n':
vysledek=pow(vysledek, cislo2);
printf("%f\n", vysledek);
scanf("%c%f%*c", &operand, &cislo2);
vypocet();
break;
}
return 0;
} |
jaka bola chyba v tych funkciach?
diki |
| |
   |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1052
 | Zaslal: Ne 15.01.12 22:13 |   |
Pretoze funkcia mocnina() bola sice definovana ( telo funkcie ), ale zrejme nebola deklarovana - v programe nebolo zavedene jej meno. Je spravne uviest prototypy ( deklaracie ) funkcii na zaciatku programu, ak nepouzivas hlavickove subory, ktore to maju za ulohu. Priklad tvojho riesenia:
| kód: | #include <stdio.h>
#include <stdlib.h>
#include <string.h>
void vypocet ();
float mocnina (float cislo, float exponent);
/* pokracovanie programu ... */ |
|
| |
   |
 |
vychytraly
 Užívateľ
 Založený: 29.09.2011 Príspevky: 143 Bydlisko: Letanovce Vek: 17
 | Zaslal: Ut 17.01.12 16:18 |   |
ak sa mozem spytat v akom jazyku je to? |
_________________ Coolermaster Elite 335 • Intel DH57DD • Intel i7 870 3,3 GHz • Noctua NH-D14 • Kingston HyperX Grey Series 2x4GB DDR3 1600MHz • Sapphire Radeon HD6950 Flex 2GB 800 MHz / 5200 MHz • Seagate Barracuda XT 2TB 7200 ot. • Cougar CMX 700 • Windows 7 Professional 64bit | |
  |
 |
Ďuri
 Administrátor
 Založený: 11.08.2007 Príspevky: 3785 Bydlisko: Brno
 | Zaslal: Ut 17.01.12 16:24 |   |
|
    |
 |
vychytraly
 Užívateľ
 Založený: 29.09.2011 Príspevky: 143 Bydlisko: Letanovce Vek: 17
 | Zaslal: Ut 17.01.12 16:33 |   |
Dakujem |
_________________ Coolermaster Elite 335 • Intel DH57DD • Intel i7 870 3,3 GHz • Noctua NH-D14 • Kingston HyperX Grey Series 2x4GB DDR3 1600MHz • Sapphire Radeon HD6950 Flex 2GB 800 MHz / 5200 MHz • Seagate Barracuda XT 2TB 7200 ot. • Cougar CMX 700 • Windows 7 Professional 64bit | |
  |
 |
|
Nemôžete pridávať nové témy do tohto fóra. Nemôžete odpovedať na témy v tomto fóre. Nemôžete upravovať svoje príspevky v tomto fóre. Nemôžete mazať svoje príspevky v tomto fóre. Nemôžete hlasovať v tomto fóre.
|
|