Pętla w kalkulatorze oraz błąd przy wpisywaniu znaków jako liczb

0

Witam, mam problem. Jeżeli chce ponownie liczyć nie wczytuje mi wyboru. A więc moje pytanie dlaczego? Oraz chciałbym dodać do programu jeżeli przy wczytywaniu liczb poda się znak wyskakuje błąd, że to nie jest liczba. Jak to zrobić?

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

int main()
{


    double a,b,wynik;
    char dzialanie;
    int zapytanie;

do
{
system("cls");

    printf("Co chcesz zrobic \n");
    printf("[1] Dodawac \n[2] Odejmowac \n[3] Mnozyc \n[4] Dzielic \n[5] Koniec programu\n");
    scanf("%c",&dzialanie);

    switch(dzialanie){
    case '1':
    printf("Podaj liczbe a \n");
    scanf("%lf",&a);

    printf("Podaj liczbe b \n");
    scanf("%lf",&b);
    wynik=a+b;
    printf("Wynik dodawania %lf i %lf wynisi %lf \n",a,b,wynik);
    break;

    case '2':
                printf("Podaj liczbe a \n");
    scanf("%lf",&a);

        printf("Podaj liczbe b \n");
    scanf("%lf",&b);
    wynik=a-b;
    printf("Wynik odejmowania %lf i %lf wynisi %lf \n",a,b,wynik);
    break;

    case '3':
                printf("Podaj liczbe a \n");
    scanf("%lf",&a);

        printf("Podaj liczbe b \n");
    scanf("%lf",&b);
    wynik=a*b;
    printf("Wynik mnozenia %lf i %lf wynisi %lf \n",a,b,wynik);
    break;

    case '4':
                printf("Podaj liczbe a \n");
    scanf("%lf",&a);

        printf("Podaj liczbe b \n");
    scanf("%lf",&b);
        if(b==0)
        {
            printf("Nie mozna dzielic przez 0");
        }

        else
        {
    wynik=a/b;
    printf("Wynik dzielenia %lf i %lf wynisi %lf \n",a,b,wynik);
        }
    break;

    case '5':
        printf("Dowidzenia");
        goto koniec;

    default:
    printf("Nie ma takiej opcji \n\n\n");
    break;

    }

   // char dzialanie=0;
printf("\n\nChcesz wyjsc z programu? \n1=tak/2=nie \n");
   scanf("%i",&zapytanie);
  //  printf("A wiec");


 /*   if(zapytanie==1)
{
    printf(" dowidzenia\n\n\n");

}
else
{
     printf(" jeszcze raz\n\n\n");
}
*/
}
while (zapytanie>1);
koniec:
return 0;
}
2
  1. Zapoznaj się z pojęciem formatowania kodu: http://4programmers.net/Forum/998482
  2. Pozbądź się goto
  3. http://4programmers.net/Forum/1100492
  4. Odradzam użycia do while, zmień go na while i wywal to pytanie, po kiego pytać: - "Chcesz wyjsc z programu?" - skoro masz [5] Koniec programu
0

przy zmianie kodu na

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

int main()
{


    double a,b,wynik;
    char dzialanie;
    int zapytanie=0;

while (zapytanie<1)
{
//system("cls");

        printf("\n\nCo chcesz zrobic \n");
        printf("[1] Dodawac \n[2] Odejmowac \n[3] Mnozyc \n[4] Dzielic \n[5] Koniec programu\n");
        scanf("%c",&dzialanie);

    switch(dzialanie)
    {

    case '1':
        printf("Podaj liczbe a \n");
        scanf("%lf",&a);
        printf("Podaj liczbe b \n");
        scanf("%lf",&b);
            wynik=a+b;
        printf("Wynik dodawania %lf i %lf wynisi %lf \n\n",a,b,wynik);
    break;

    case '2':
        printf("Podaj liczbe a \n");
        scanf("%lf",&a);
        printf("Podaj liczbe b \n");
        scanf("%lf",&b);
            wynik=a-b;
        printf("Wynik odejmowania %lf i %lf wynisi %lf \n",a,b,wynik);
    break;


    case '3':
        printf("Podaj liczbe a \n");
        scanf("%lf",&a);
        printf("Podaj liczbe b \n");
        scanf("%lf",&b);
            wynik=a*b;
        printf("Wynik mnozenia %lf i %lf wynisi %lf \n",a,b,wynik);
    break;


    case '4':
        printf("Podaj liczbe a \n");
        scanf("%lf",&a);

        printf("Podaj liczbe b \n");
        scanf("%lf",&b);

        if(b==0)
        {
            printf("Nie mozna dzielic przez 0\n");
        }

        else
        {
            wynik=a/b;
            printf("Wynik dzielenia %lf i %lf wynisi %lf \n",a,b,wynik);
        }
    break;


    case '5':
        printf("Dowidzenia");
        zapytanie=1;
    break;


    default:
        printf("Nie ma takiej opcji \n\n\n");
    break;

    }

}

return 0;
} 

Jak wstawie

system("cls");

Co prawda działa bo nie wyświetla tego, że nie wczytuje raz wyboru ale też nie wyświetla wyniku

1
int zapytanie=0;
 
while(zapytanie<1)  // od samego początku zapytanie=0 czyli zapytanie<1. zamienić na for(;;)

Oraz:

case '5': printf("Dowidzenia"); return 0;
0

Zamieniłem while na for(;;), to samo jak na zdjeciu

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

int main()
{


    double a,b,wynik;
    char dzialanie;
    int zapytanie=0;

for (;;)
{
//system("cls");

        printf("\n\nCo chcesz zrobic \n");
        printf("[1] Dodawac \n[2] Odejmowac \n[3] Mnozyc \n[4] Dzielic \n[5] Koniec programu\n");
        scanf("%c",&dzialanie);

    switch(dzialanie)
    {

    case '1':
        printf("Podaj liczbe a \n");
        scanf("%lf",&a);
        printf("Podaj liczbe b \n");
        scanf("%lf",&b);
            wynik=a+b;
        printf("Wynik dodawania %lf i %lf wynisi %lf \n\n",a,b,wynik);

    break;

    case '2':
        printf("Podaj liczbe a \n");
        scanf("%lf",&a);
        printf("Podaj liczbe b \n");
        scanf("%lf",&b);
            wynik=a-b;
        printf("Wynik odejmowania %lf i %lf wynisi %lf \n",a,b,wynik);

    break;


    case '3':
        printf("Podaj liczbe a \n");
        scanf("%lf",&a);
        printf("Podaj liczbe b \n");
        scanf("%lf",&b);
            wynik=a*b;
        printf("Wynik mnozenia %lf i %lf wynisi %lf \n",a,b,wynik);

    break;


    case '4':
        printf("Podaj liczbe a \n");
        scanf("%lf",&a);

        printf("Podaj liczbe b \n");
        scanf("%lf",&b);

        if(b==0)
        {
            printf("Nie mozna dzielic przez 0\n");
        }

        else
        {
            wynik=a/b;
            printf("Wynik dzielenia %lf i %lf wynisi %lf \n",a,b,wynik);

        }
    break;


    case '5':
        printf("Dowidzenia");
        return 0;

    default:
        printf("Nie ma takiej opcji \n\n\n");
    break;

    }
}

return 0;
}
2

To jeszcze scanf(" %c",&dzialanie);

0

Zrobione, została mi tylko 1 rzecz. A mianowicie, gdy wczytuje od użytkownika liczbę a lub b. Chcę jak się poda znak, żeby wywalał program, że to nie jest liczba.

1
if(scanf("%lf",&a)!=1) /*podałeś nie liczbę */
0

Niby działa ale trzeba podać 2 razy liczbę

0

Więc źle zastosowałeś tą radę.

0
    case '1':
        printf("Podaj liczbe a \n");
        scanf("%lf",&a);
            if(scanf("%lf",&a)!=1){
                printf("Nie podales liczby");
    return 0;}
        printf("Podaj liczbe b \n");
        scanf("%lf",&b);
            if(scanf("%lf",&b)!=1){
                printf("Nie podales liczby");
    return 0;}
            wynik=a+b;
        printf("Wynik dodawania %lf i %lf wynisi %lf \n\n",a,b,wynik);

    break; 
2
case '1':
        printf("Podaj liczbe a: ");
        if(scanf("%lf",&a)!=1){
            printf("Nie podales liczby\n");
            break;
        }
        printf("Podaj liczbe b: ");
        if(scanf("%lf",&b)!=1){
            printf("Nie podales liczby\n");
            break;
        }
        printf("Wynik dodawania %lf i %lf wynisi %lf \n\n",a,b,a+b);
break;
0

Znowu problem z wyborem

1

Pokaż kod lub zgłoś się do wróżbitów.

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

int main()
{


    double a,b,wynik;
    char dzialanie;
    int zapytanie;

for (;;)
{


        printf("\n\nCo chcesz zrobic \n");
        printf("[1] Dodawac \n[2] Odejmowac \n[3] Mnozyc \n[4] Dzielic \n[5] Koniec programu\n[6] Wyczysc ekran\n");
        scanf(" %c",&dzialanie);

    switch(dzialanie)
    {

    case '1':
        printf("Podaj liczbe a \n");
        if(scanf("%lf",&a)!=1){
            printf("Nie podales liczby");
    break;
    }
        printf("Podaj liczbe b \n");
        if(scanf("%lf",&b)!=1){
            printf("Nie podales liczby");
    break;
    }
            wynik=a+b;
        printf("Wynik dodawania %lf i %lf wynisi %lf \n\n",a,b,wynik);

    break;

    case '2':
       printf("Podaj liczbe a \n");
       if(scanf("%lf",&a)!=1){
            printf("Nie podales liczby");
    break;
    }
        printf("Podaj liczbe b \n");
        if(scanf("%lf",&b)!=1){
            printf("Nie podales liczby");
    break;
    }
            wynik=a-b;
        printf("Wynik odejmowania %lf i %lf wynisi %lf \n",a,b,wynik);

    break;


    case '3':
        printf("Podaj liczbe a \n");
        if(scanf("%lf",&a)!=1){
            printf("Nie podales liczby");
    break;
    }
        printf("Podaj liczbe b \n");
        if(scanf("%lf",&b)!=1){
            printf("Nie podales liczby");
    break;
    }
            wynik=a*b;
        printf("Wynik mnozenia %lf i %lf wynisi %lf \n",a,b,wynik);

    break;


    case '4':
        printf("Podaj liczbe a \n");
        if(scanf("%lf",&a)!=1){
           printf("Nie podales liczby");
    break;
    }
        printf("Podaj liczbe b \n");
        if(scanf("%lf",&b)!=1){
            printf("Nie podales liczby");
    break;
    }

        if(b==0)
        {
            printf("Nie mozna dzielic przez 0\n");
        }

        else
        {
            wynik=a/b;
            printf("Wynik dzielenia %lf i %lf wynisi %lf \n",a,b,wynik);

        }
    break;


    case '5':
        printf("Dowidzenia");
        return 0;

    case '6':
        printf("Wyczysc ekran \n");
        system("cls");

    break;

    default:
        printf("Nie ma takiej opcji \n\n\n");
    break;

    }
}

return 0;
}
1

W przypadku kiedy podano nie liczbę musisz wyczyścić bufor klawiatury ręcznie, np: while(getchar()!='\n') {}

1

Przenieś pobieranie liczb do jakiejś osobnej funkcji, bo teraz każdą zmianę musisz 10x powtarzać, a kod jest coraz mniej czytelny (co od początku nie było jego jakąś specjalną zaletą)

0

Wykracza się na ostatniej zamykającej klamrze
"error: expected declaration or statement at end of input"

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

 
double pobieranie_liczb()
{
    double a,b;
    printf("Podaj liczbe a \n");
        if(scanf("%lf",&a)!=1){
            printf("Nie podales liczby");

        printf("Podaj liczbe b \n");
        if(scanf("%lf",&b)!=1){
            printf("Nie podales liczby");
            return 0;

}

int main()
{


    double wynik;
    char dzialanie;

for (;;)
{


        printf("\n\nCo chcesz zrobic \n");
        printf("[1] Dodawac \n[2] Odejmowac \n[3] Mnozyc \n[4] Dzielic \n[5] Koniec programu\n[6] Wyczysc ekran\n");
        scanf(" %c",&dzialanie);

    switch(dzialanie)
    {

    case '1':
        pobieranie_liczb();
            wynik=a+b;
        printf("Wynik dodawania %lf i %lf wynisi %lf \n\n",a,b,wynik);

    break;

    case '2':
        pobieranie_liczb;
            wynik=a-b;
        printf("Wynik odejmowania %lf i %lf wynisi %lf \n",a,b,wynik);

    break;


    case '3':
        pobieranie_liczb;
            wynik=a*b;
        printf("Wynik mnozenia %lf i %lf wynisi %lf \n",a,b,wynik);

    break;


    case '4':
        pobieranie_liczb();
        if(b==0)
        {
            printf("Nie mozna dzielic przez 0\n");
        }

        else
        {
            wynik=a/b;
            printf("Wynik dzielenia %lf i %lf wynisi %lf \n",a,b,wynik);

        }
    break;


    case '5':
        printf("Dowidzenia");
        return 0;

    case '6':
        printf("Wyczysc ekran \n");
        system("cls");

    break;

    default:
        printf("Nie ma takiej opcji \n\n\n");
    break;

    }
}

return 0;
}

0
double pobieranie_liczb()
{
    double a,b;
    printf("Podaj liczbe a \n");
        if(scanf("%lf",&a)!=1){
            printf("Nie podales liczby");
 
        printf("Podaj liczbe b \n");
        if(scanf("%lf",&b)!=1){
            printf("Nie podales liczby");
            return 0;
 
}

nie zamykasz ifów.

0

Pokaż cały kod. Swoją drogą, pobierasz od użytkownika 2 liczby w funkcji pobieranie_liczb, ale nigdzie ich nie zwracasz. Ponadto nie reagujesz poprawnie na wpisanie tekstu zamiast liczby.

Najlepiej zrób nową funkcję pobierz_jedna_liczbe(), która zwróci double czy co tam i jej użyj dwa razy.

0

1 raz używam funkcji więc trochę tylko łapie dlatego błędy przez to pewnie

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


double pobieranie_liczb()
{
    double a,b;
    printf("Podaj liczbe a \n");
        if(scanf("%lf",&a)!=1)
            {
            printf("Nie podales liczby");
            }
        printf("Podaj liczbe b \n");
        if(scanf("%lf",&b)!=1)
            {
            printf("Nie podales liczby");
            return 0;
            }
}

int main()
{


    double wynik;
    char dzialanie;

for (;;)
{


        printf("\n\nCo chcesz zrobic \n");
        printf("[1] Dodawac \n[2] Odejmowac \n[3] Mnozyc \n[4] Dzielic \n[5] Koniec programu\n[6] Wyczysc ekran\n");
        scanf(" %c",&dzialanie);

    switch(dzialanie)
    {

    case '1':
        pobieranie_liczb();
            wynik=a+b;
        printf("Wynik dodawania %lf i %lf wynisi %lf \n\n",a,b,wynik);

    break;

    case '2':
        pobieranie_liczb;
            wynik=a-b;
        printf("Wynik odejmowania %lf i %lf wynisi %lf \n",a,b,wynik);

    break;


    case '3':
        pobieranie_liczb;
            wynik=a*b;
        printf("Wynik mnozenia %lf i %lf wynisi %lf \n",a,b,wynik);

    break;


    case '4':
        pobieranie_liczb();
        if(b==0)
        {
            printf("Nie mozna dzielic przez 0\n");
        }

        else
        {
            wynik=a/b;
            printf("Wynik dzielenia %lf i %lf wynisi %lf \n",a,b,wynik);

        }
    break;


    case '5':
        printf("Dowidzenia");
        return 0;

    case '6':
        printf("Wyczysc ekran \n");
        system("cls");

    break;

    default:
        printf("Nie ma takiej opcji \n\n\n");
    break;

    }
}

return 0;
}
1

W sumie radzę zrobić w ten deseń:

#include <stdio.h>

int main()
  {
   double a,b;
   char op; 
   for(;;)
     {
      printf("Podasj wyrazenie np 10+8 (!-koniec): ");
      if(scanf("%lf %c %lf",&a,&op,&b)==3)
        {
         switch(op)
           {
            case '+': printf("%lg %c %lg = %lg\n",a,op,b,a+b); break;
            case '-': printf("%lg %c %lg = %lg\n",a,op,b,a-b); break;
            case '*': printf("%lg %c %lg = %lg\n",a,op,b,a*b); break;
            case '/': 
               if(b) printf("%lg %c %lg = %lg\n",a,op,b,a/b);
               else printf("Cholero, nie dziel przez zero\n");
            break;
            default: printf("Nie ma takiej operacji\n");
           }
        }
      else if((scanf("%c",&op)!=1)||(op!='!')) printf("Niepoprawne wyrazenie\n");
      else return 0;
      while(getchar()!='\n') {}
     }
   return 0;
  }
1

W takim razie:

  1. zapraszam do dowolnego tutoriala, rozdział funkcje.
  2. Formatuj kod. http://format.krzaq.cc jak to dla Ciebie problem.
0

_13th_Dragon
Fajnie ale chce dokończyć już na tym co zacząłem i udoskonalam z waszą pomocą, dużo idzie się nauczyć :)

kq
To lecę zobaczyć co i jak dokładniej z tymi funkcjami
Fajne formatowanie. Polecam :)

To później się jeszcze odezwę jak się udało

1 użytkowników online, w tym zalogowanych: 0, gości: 1