Zadrhel v programe – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Zadrhel v programe – C / C++ – Fórum – Programujte.comZadrhel v programe – C / C++ – Fórum – Programujte.com

 

lacino880
Duch
23. 3. 2015   #1
-
0
-

Na začiatku maš zadať sumu ktoru maš zaplatiť potom zadaš bankovky, sčita bankovky a vyda ti tiež v bankovkach.

Neviete prečo mi neide tá podmienka, aby suma bola vačšia ako 0 a menšia ako 10000 ? Keď dam vačšie čislo jak 10000 tak nevypiše že vrong imput ale pokračuje ďalej.

DAKUJEM

Program:


#include <stdio.h>
#include <stdlib.h>
#include <math.h>


/*
 * 
 */

   double zaokruhli(double x)
{
   int temp = floor(100*x +0.5); //double na int
   return (double)temp/100; //z int na double
}
   
int main(int argc, char** argv) {

     double h,i,x = 100;
     double vydavok[100];
     double suma = 0;
     double vlozene = 0;
     int a = 0,c=0;
     
     int abcint,b,d,e,f;
     double abc;
    
     
    
   printf("Enter value of your bill: ");

           scanf("%lf", &suma);
           if(suma > 10000 || suma < 0){
        printf("Wrong input! ");
       getch();
        return 0;
        }    
    printf("Insert money for payment: ");
   
    
    while(h > 0){   
    scanf("%lf", &h);
    
   
    if(h == 0.01 || h == 0.02 || h == 0.05 || h == 0.1 || h == 0.2 || h == 0.5 || h == 0.1 || h == 1 || h == 2 || h == 5 ||  h == 10 || h == 20 || h == 50 || h == 100 || h == 0 ){
       
    }else{ 
        f=h;{
        if(h-f==0)printf("%.0f is invalid!\n ", h);
        else
        printf("%.2f is invalid!\n ", h); 
        }
        system("PAUSE");
        return 0;
    }
    vlozene = vlozene + h;
    }
{
            d=vlozene;
            if(vlozene-d==0) printf("You have inserted: %.0lf ",vlozene);
            else printf("You have inserted: %.2lf ",vlozene);

   
if(suma > vlozene){
        printf("\nNot enough money!\n ");
       system("PAUSE");
        return 0;
        }
        
abc=vlozene-suma;
abcint=abc;
e=vlozene-suma;


if(abc-abcint==0) printf("\nTo return: %.0lf",abc);
if(abc-abcint!=0) {
    if (e==0) printf("\nTo return: %.0lf",abc);
    else printf("\nTo return: %.2lf",abc);
}
   vlozene =zaokruhli(vlozene);
   suma =zaokruhli(suma);
   suma = suma+0.001;
   //suma = Truncate(suma * 1000) / 1000suma;
   i =  vlozene - suma; 
   i = zaokruhli(i);

   
do{
      if(i >= x){
            vydavok[a] = x; 
            i= i-x;
             a++;
             i = zaokruhli(i);
             }
       
        
     while (1){  
     if(i>=100){x= 100; break;}  
     else if(i>=50){x= 50; break;}  
     else if(i>=20){x= 20; break;}  
     else if(i>=10){x= 10; break;}  
     else if(i>=5){x= 5; break;}  
     else if(i>=2){x= 2; break;}  
     else if(i>=1){x= 1; break;}  
     else if(i>=0.5){x= 0.5; break;}  
     else if(i>=0.2){x= 0.2;break;}  
     else if(i>=0.1){x= 0.1; break;}  
     else if(i>=0.05){x= 0.05; break;}  
     else if(i>=0.02){x= 0.02; break;}  
     else if(i>=0.01){x= 0.01;  break;} 
      else if(i < 0.01){ break;}  
     }
       
  }while(i > 0.00999);
  
      if(a!=0) {
            printf("\nCollect your payback: ");      
       for(c; c < a; c++){
             b=vydavok[c];
            if(vydavok[c]-b==0) printf("%.0lf ", vydavok[c]);
            else printf ("%.2lf ", vydavok[c]);
}}
printf("\n");
   return 0;
}

Nahlásit jako SPAM
IP: 188.120.18.–
PiranhaGreg0
Stálý člen
23. 3. 2015   #2
-
0
-

Vůbec nekontroluješ, jestli se to číslo správně načetlo. Pokud tam zadáš nějaký nesmysl, tak se do sumy nic neuloží a zůstane tam nějaký bordel, např. 0, takže ti to podmínkou projde. Správně by jsi to měl řešit takto. 

printf("Enter value of your bill: ");

if (scanf("%lf", &suma) != 1 || suma > 10000 || suma < 0) {
	fprintf(stderr, "Wrong input!\n");
	return 1;	
}
Nahlásit jako SPAM
IP: 109.81.210.–
lacino880
Duch
23. 3. 2015   #3
-
0
-

Vdaka za radu, ale aj tak sa sprava tak isto. Nevypiše wrong imput

Nahlásit jako SPAM
IP: 188.120.18.–
PiranhaGreg0
Stálý člen
23. 3. 2015   #4
-
0
-

#3 lacino88
To je zvláštní. U mě to přes tu podmínku neprojde. Na čem to kompiluješ/spouštíš?

Nahlásit jako SPAM
IP: 109.81.210.–
lacino880
Duch
23. 3. 2015   #5
-
0
-

Cez školsky server

Nahlásit jako SPAM
IP: 188.120.18.–
lacino880
Duch
23. 3. 2015   #6
-
0
-

Na omegu to davame, cez putty

Nahlásit jako SPAM
IP: 188.120.18.–
PiranhaGreg0
Stálý člen
23. 3. 2015   #7
-
0
-

Tak zkus pro začátek jen výřez programu, který dělá problémy. Např. 

#include <stdio.h>

int main(void) {
	double suma = 0;
		
	printf("Enter value of your bill: ");

	if (scanf("%lf", &suma) != 1 || suma > 10000 || suma < 0) {
		fprintf(stderr, "Wrong input!\n");
		return 1;	
	}

	printf("Good input!\n");
	return 0;
}
Nahlásit jako SPAM
IP: 109.81.210.–
lacino880
Duch
23. 3. 2015   #8
-
0
-

Tak to ide ked len tu časť dam

Nahlásit jako SPAM
IP: 188.120.18.–
PiranhaGreg0
Stálý člen
23. 3. 2015   #9
-
0
-

Tak zkus postupně přidávat, dokud se to nepokazí.. Líp asi neporadím. Jinak u mě ten tvlj zdroják generuje ohromný množství warningů, tak nezapomeň, že pokud je tam i nějaký error, kompilátor nic nezkompiluje a nechá tam ten původní soubor. Tak jestli třeba nespouštíš nějakou starší verzi...

Nahlásit jako SPAM
IP: 109.81.210.–
lacino880
Duch
23. 3. 2015   #10
-
0
-

Ak by mal niekto este nejake napady, navrhy ako to spojazdnit, prosim sem s nimi. Zajtra to mam odovzdat a po pravde v programovani nie som na 100% doma. 

Nahlásit jako SPAM
IP: 188.120.18.–
ingiraxo+15
Grafoman
23. 3. 2015   #11
-
0
-

Co ten program má vůbec dělat? 

Jinak to načítání může být i takto (funguje pouze na čísla)

double nactiDluznouCastku()
{
    double sum = 0;

    while(true) {
        printf("Zadej dluznou castku: ");
        scanf("%lf", &sum);

        if (sum < 1 || sum >= 10000) {
            printf("Spatna hodnota!\n");
        }
        else return sum;
    }
}
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
lacino880
Duch
23. 3. 2015   #12
-
0
-

#11 ingiraxo
na začiatku sa napíše  suma ktoru treba zaplatiť. potom napisať bankovky ktore sa potom spočitaju, Vypočita sa kolko sa má vydať a vypíše vydané bankovky.

Nahlásit jako SPAM
IP: 178.18.71.–
ingiraxo+15
Grafoman
23. 3. 2015   #13
-
0
-

#12 lacino88
aha, já to pochopil spíš tak, že zadáš dlužnou castku a ono ti to vrátí bankovky (třeba od nejvyšší 1000,500,200,100,50,20,10,5,2,1)

hlavně musí to být double? nastačí int?

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
lacino880
Duch
23. 3. 2015   #14
-
0
-

#13 ingiraxo
presne tak ale dlžnu čiastku treba zadať s bankovkami

Nahlásit jako SPAM
IP: 178.18.71.–
ingiraxo+15
Grafoman
23. 3. 2015   #15
-
0
-

#14 lacino88
Celkem pěknej úkol 

static int g_bankovky[] { 1000, 500, 200, 100, 50, 20, 10, 5, 2, 1 };

int nastavDluznouCastku()
{
    int suma;

    while (true) {
        printf("Zadej dluznou castku: ");
        scanf("%d", &suma);

        if (suma < 1 || suma >= 10000) {
            printf("Spatna hodnota!\n");
        } else return suma;
    }
}

bool jeBankovkaPlatna(int bankovka)
{
    if (bankovka > 0) {
        for (int i = 0; i < sizeof(g_bankovky) / sizeof(int); i++) {
            if (g_bankovky[i] == bankovka) {
                return true;
            }
        }
    }
    return false;
}

void vratitPreplatek(int preplatek)
{
    printf("Vraceno:\n");

    int pocet;
    for (int i = 0; i < sizeof(g_bankovky) / sizeof(int) && preplatek > 0; i++) {
        pocet = preplatek / g_bankovky[i];
        preplatek %= g_bankovky[i];

        if (pocet > 0) {
            printf("%d\n", g_bankovky[i]);
        }
    }
}

void zaplat(int dluh)
{
    int n, suma = 0;

    while (suma < dluh) {
        printf("Zadej bankovku: ");
        scanf("%d", &n);

        if (jeBankovkaPlatna(n)) {
            suma += n;

            if (suma > dluh) {
                printf("Mate preplatek %d.\n", suma - dluh);
                vratitPreplatek(suma - dluh);
            } else if (suma == dluh) {
                printf("Dluh byl splacen.");
            } else {
                printf("Zbyva zaplatit: %d\n", dluh - suma);
            }
        } else {
            printf("Bankovka %d neexistuje!\n", n);
        }
    }
}

int main()
{
    int dluh = nastavDluznouCastku();
    zaplat(dluh);

    return EXIT_SUCCESS;
}

Výstup jako 

Zadej dluznou castku: 1234
Zadej bankovku: 5
Zbyva zaplatit: 1229
Zadej bankovku: 8
Bankovka 8 neexistuje!
Zadej bankovku: 1000
Zbyva zaplatit: 229
Zadej bankovku: 500
Mate preplatek 271.
Vraceno:
200
50
20
1
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
24. 3. 2015   #16
-
0
-

Ještě pozn. k porovnávání float point. Všiml jsem si, že taztel porovnává float point hodnoty. Číslo v paměti počítače lze uložit s určitou přesností, tím vznikne rozdíl mezi skutečnou a uloženou hodnotou. To pak způsobuje situace, kdy rovnost nikdy nenastane. Proto se porovnávají tak, že se určí "pásmo necitlivosti" - interval, uvnitř kterého se čísla považují za rovná. 

hu

Nahlásit jako SPAM
IP: 2001:67c:1222:800:db7:a89...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 15 hostů

Podobná vlákna

Otvoriť v programe ... — založil mephi

Otáčanie v programe — založil letsthrowq

Rada v programe c++ — založil koral000

ComboBox v programe — založil kotlas6667

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý