Jezyk C. Pętla while nie dokonca dziala

0

Hej! Pisze program ktory ma za zadanie wczytac operator potem dane i to obliczyc. prosty kalkulator. Takie zadanie :)

Mam problem z zapętleniem programu w kilku miejscach. Najlepiej wkleję kod i ScreenShot.

Kod:

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

int main(int argc, char *argv[])
{
char wybor,oper;
double a, b, d, c;
printf("[P]Przejdz do dzialania\n[Q]Wyjscie");
printf("\n: %c",wybor);
scanf("%c",&wybor);

switch (wybor)
{
case 'p':
case 'P':
		
		{
	
			printf("\nPodaj operator do dzialania: ");
			printf("\nMozliwe operatory to: +,-,*,(znak procetu)\n:");    //!tutaj się buguje!!!
			scanf("%c",&oper);
			scanf("%c",&oper);
					while (oper!=43||oper!=45||oper!=42||oper!=37||oper!=47)
							{
							printf("\nWybierz jakis operator\n:");								
							scanf("%c", &oper);
							}
				if (oper==43)
			{	printf("\nPodaj a i b:\n");
				printf("\na: ");
				scanf("%lf", &a);
				printf("b: ");
				scanf("%lf", &b);
				printf("\nDzialanie: %lf %c %lf = ",a,oper,b);
				printf("%f",a+b);
			}
				else if (oper==45)
			{	printf("\nPodaj a i b:\n");
				printf("\na: ");
				scanf("%lf", &a);
				printf("b: ");
				scanf("%lf", &b);
				printf("\nDzialanie: %lf %c %lf = ",a,oper,b);
				printf("%f",a-b);					
			}
				else if (oper==42)
			{	printf("\nPodaj a i b:\n");
				printf("\na: ");
				scanf("%lf", &a);
				printf("b: ");
				scanf("%lf", &b);
				printf("\nDzialanie: %lf %c %lf = ",a,oper,b);
				printf("%f",a*b);					
			}
				else if (oper==37)
			{	printf("\nPodaj a i b:\n");
				printf("\na: ");
				scanf("%lf", &a);
				printf("b: ");
				scanf("%lf", &b);
						while (b == 0)
							{
							printf("\nb nie moze byc rowne zero.");
							printf("\nPodaj inne b: ");
							scanf("%lf", &b);
							}
				printf("\nDzialanie: %lf %c %lf.\n",a,oper,b);
				printf("\na to %lf procent b",a*100/b);					
			}
				else if (oper==47)
			{	printf("\nPodaj a i b:\n");
				printf("\na: ");
				scanf("%lf", &a);
				printf("b: ");
				scanf("%lf", &b);
						while (b == 0)
							{
							printf("\nb nie moze byc rowne zero.");
							printf("\nPodaj inne b: ");
							scanf("%lf", &b);
							}
				printf("\nDzialanie: %lf %c %lf = ",a,oper,b);
				printf("%f",a/b);					
			}
				else
			{
				printf("Nie wybrales zadnego operandu!");
			}
			break;	
		 }	
		 
}
return 0;

}

to jest jedna rzecz druga to jest to ze chcialbym zapętlic caly program to znaczy ze po wykonaniu ktoregos dzialania program wraca do początku najlepeiej zeby sie wyswietlilo jako kolejny krok te mini menu : printf("[P]Przejdz do dzialania\n[Q]Wyjscie"); . Jak na razie z tym tyle. Zapewne mozna bylo ten program napisac duzo prosciej ja jednak lubie kombinowac gdyz jestem poczatkujacy a takie kombinowanie mam nadzieje chociaz troche rozwija : )
W takim razie co mi poradzicie? :)

Pozdrawiam!

0

Ja to dałbym

do
{

przed

printf("[P]Przejdz do dzialania\n[Q]Wyjscie");

i

} while( wybor != 'q' && wybor != 'Q'); 

przed

return 0;
2

Nie, takie kombinowanie nie rozwija, a od patrzenia na tą ilość printf i scanf to aż niedobrze mi się zrobiło.

Nie możesz normalnie wczytać operatora i liczb na początku pętli(a nie w każdym if pisac tą litanię scanf i printf), a później switchem wybrac odpowiednie działanie dla podanego operatora i ewentualnie tam sprawdzić warunek czy b==0 ?

0

Dziekuje za odpowiedzi i cenną rade od some_ONE.
Przerobilem trochę program.

Kod zrodlowy:

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

int main(int argc, char* argv[]) {
  char wybor, oper;
  double a, b, d, c;
  do {
    printf("[P]Przejdz do dzialania\n[Q]Wyjscie");
    printf("\n: ");
    scanf("%c", &wybor);
    printf("\n");

    switch (wybor) {
      case 'p':
      case 'P':

      {
        printf("\nPodaj operator do dzialania: ");
        printf("\nMozliwe operatory to: +,-,*,/,(znak procetu)\n:");
        scanf("%c", &oper);
        scanf("%c", &oper);
        printf("\nPodaj a i b:\n");
        printf("\na: ");
        scanf("%lf", &a);
        printf("b: ");
        scanf("%lf", &b);

        if (oper == 43) {
          printf("\nDzialanie: %lf %c %lf = ", a, oper, b);
          printf("%f", a + b);
        } else if (oper == 45) {
          printf("\nDzialanie: %lf %c %lf = ", a, oper, b);
          printf("%f", a - b);
        } else if (oper == 42) {
          printf("\nDzialanie: %lf %c %lf = ", a, oper, b);
          printf("%f", a * b);
        } else if (oper == 37) {
          while (b == 0) {
            printf("\nb nie moze byc rowne zero.");
            printf("\n\nPodaj inne b: ");
            scanf("%lf", &b);
          }
          printf("\nDzialanie: %lf %c %lf.\n", a, oper, b);
          printf("\na to %lf procent b", a * 100 / b);
        } else if (oper == 47) {
          while (b == 0) {
            printf("\nb nie moze byc rowne zero.");
            printf("\n\nPodaj inne b: ");
            scanf("%lf", &b);
          }
          printf("\nDzialanie: %lf %c %lf = ", a, oper, b);
          printf("%f", a / b);
        } else {
          printf("Bledny operator!\n\n");
        }
        break;
      }
      case 'q':
      case 'Q': {
        exit(0);
      }
      default:
        printf("Podaj P lub Q!\n");
    }
  } while (wybor != 'q' && wybor != 'Q');
  return 0;
}

działa Prawie tak jak powinien z tym ze podwaja(?) pętle. najlepiej widac to na screenshot. Co na to mogę poradzic?

1
  1. Wrzuć ten kod do jakiegoś formatera, np: http://format.krzaq.cc/
  2. Edytuj post, wklejając kod z formatera między <code class="cpp">TUTAJ_KOD</code>
if (oper==43)

Co to jest 43? Czy za rok o 3 nad ranem bez patrzenia do tablicy ASCII będziesz w stanie to powiedzieć? Używaj

if (oper == '+')

i wszystko jasne.

Ze screenshota wygląda, że pod koniec wcisnąłeś enter bez podania żadnej opcji, więc program wykonuje:

default: printf("Podaj P lub Q!\n");

i wraca na początek pętli.

0

Dziękuje twonek za odp. programuje od niespelna 3ch tygodni i zaczyna mi sie to coraz bardziej podobac :) znalazlem błąd i byl on calkowicie innej natury. Naprawde nie wiem co to zmienia ale dałem spacje przed %c w

 scanf(" %c", &wybor);

i nie podwaja tego"mini menu". zapętliłem go tez w troche inny sposó . dosc to namieszałem ale działa poprawnie. Wkleję ostateczną wersje i jezeli to nie problem to powiedzcie co o tym myslicie.

Kod:

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

int main(int argc, char* argv[])
{
    char wybor, oper;
    double a, b;

    while (wybor != 'q' && wybor != 'Q') {
        printf("[P]Przejdz do dzialania\n[Q]Wyjscie");
        printf("\n:");
        scanf(" %c", &wybor);
        printf("\n");

        switch (wybor) {
        case 'p':
        case 'P':

        {
            printf("\nPodaj operator do dzialania: ");
            printf("\nMozliwe operatory to: +,-,*,/,(znak procetu)\n:");
            scanf("%c", &oper);
            scanf("%c", &oper);
            printf("\nPodaj a i b:\n");
            printf("\na: ");
            scanf("%lf", &a);
            printf("b: ");
            scanf("%lf", &b);

            if (oper == '+') {
                printf("\nDzialanie: %lf %c %lf = ", a, oper, b);
                printf("%f\n\n", a + b);
            } else if (oper == '-') {
                printf("\nDzialanie: %lf %c %lf = ", a, oper, b);
                printf("%f\n\n", a - b);
            } else if (oper == '*') {
                printf("\nDzialanie: %lf %c %lf = ", a, oper, b);
                printf("%f\n\n", a * b);
            } else if (oper == '%') {
                while (b == 0) {
                    printf("\nb nie moze byc rowne zero.");
                    printf("\n\nPodaj inne b: ");
                    scanf("%lf\n\n", &b);
                }
                printf("\nDzialanie: %lf %c %lf.\n", a, oper, b);
                printf("\na to %lf procent b\n\n", a * 100 / b);
            } else if (oper == '/') {
                while (b == 0) {
                    printf("\nb nie moze byc rowne zero.");
                    printf("\n\nPodaj inne b: ");
                    scanf("%lf", &b);
                }
                printf("\nDzialanie: %lf %c %lf = ", a, oper, b);
                printf("%f\n\n", a / b);
            } else {
                printf("Bledny operator!\n\n");
            }
            break;
        }
        case 'q':
        case 'Q': {
            exit(0);
        }
        default:
            printf("Podaj P lub Q! \n");
        }
    }

    return 0;
}

Pozdrawiam!

1

Może jeszcze to: while (wybor != 'q' && wybor != 'Q')
zamień na to: for(;;)

0

Podłączam się do tego zadania. Z tym, że chciałabym go wykonać przy pomocy while, switch, if oraz getch() do wczytania x . Poniżej kod, który jednak nie chce wracać na początek pętli po pierwszym, dobrze wykonanym działaniu. Gdzie może być błąd? Z góry dzięki

#include <stdio.h>
#include <conio.h>
int main()
{
    char x;
    int a, b;
    while (x != "q") {
        printf("Wczytaj z klawiatury jeden ze znakow: +,-,*,/ lub %c, a nastepnie podaj\ndwie liczby calkowite. W celu zakonczenia programu wybierz q:\n", 37);
        x = getchar();
        scanf("%d%d", &a, &b);
        switch (x) {
        case '+':
            printf("%d+%d=%d\n", a, b, a + b);
            break;
        case '-':
            printf("%d-%d=%d\n", a, b, a - b);
            break;
        case '*':
            printf("%d*%d=%d\n", a, b, a * b);
            break;
        case '/': {
            if (b != 0)
                printf("%d/%d=%d\n", a, b, a / b);
            else
                printf("Nie mozna dzielic przez 0");
        } break;
        case '%': {
            if (b != 0)
                printf("%d%c%d=%d\n", a, 37, b, a % b);
            else
                printf("Nie mozna dzielic przez 0");
        } break;
        case 'q':
            getch();
            return 0;
        default:
            printf("Bledny operator");
            break;
        }
    }
    getch();
    return 0;
}
1
  1. Nie potrzebujesz: while (x != "q") wystarczy: for(;;)
  2. Nie potrzebujesz: getch(); i return 0; na końcu funkcji
  3. Po switch potrzebujesz wiersz while(getchar()!='\n') {}
  4. Powinieneś przejrzeć forum na przedmiot podobnych kodów/pytań: http://4programmers.net/Forum/C_i_C++/241438-kalkulator_podstawowy?p=1080388#id1080388
1
printf("%%"); //wyświetla znak '%'

http://www.cplusplus.com/reference/cstdio/printf/

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