Program liczący pola figur – gdzie jest błąd?

Wątek przeniesiony 2019-01-02 09:08 z Newbie przez Adam Boduch.

0

Witam, muszę napisać w C program liczący za pomocą funkcji void pole prostokąta (a), koła (b) i trójkąta (c) posiadający menu umożliwiające wariantowe i wielokrotne wykonywanie obliczeń. Mam błąd, którego nie mogę wykryć, program kompiluje się normalnie; po obliczeniu pierwszego pola menu powinno się wyświetlić 2 raz, na obecnym etapie pole liczy się ok, jednak zamiast menu wyświetla się 2 raz prośba o podanie dł. boków prostokąta (lub promienia koła, lub wymiarów trójkąta), próbowałam w funkcji main przed przedostatnią klamerką wpisać wybor=menu(); wtedy menu wyświetla się ponownie, ale 2 razy i nie chce nic liczyć :/ Gdzie tkwi błąd - w funkcji main, fflush(stdin) czy gdzieś indziej? Proszę o pomoc :,(

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

char menu(void);
void pole_prostokata(void);
void pole_kola(void);
void pole_trojkata(void);

int main()
    {
    char wybor;
    wybor=menu();
    while(wybor!='q')
	{
	switch(wybor)
	    {
	    case 'a': pole_prostokata();
		break;
	    case 'b': pole_kola();
		break;
	    case 'c': pole_trojkata();
		break;
	    default: menu();
	    }
	}
    return(0);
    }
    
char menu(void)
    {
    char w;
    
    puts("Program obliczajacy pola wybranych figur");
    puts("a) pole prostokata");
    puts("b) pole kola");
    puts("c) pole trojkata");
    puts("q) zakoncz");
    
    fflush(stdin);
    scanf("%c",&w);
    return w;
    }

void pole_prostokata(void)
    {
    float a,b,P;
    printf("Podaj dlugosci bokow a i b prostokata: ");
    scanf("%f%f",&a,&b);
    P=a*b;
    printf("Pole prostokata jest rowne: %f\n", P);
    }

void pole_kola(void)
    {float r,P;
    printf("Podaj dlugosc promienia r kola: ");
    scanf("%f",&r);
    P=3.1415*r*r;
    printf("Pole kola jest rowne: %f\n", P);
    }

void pole_trojkata(void)
    {
    float a,h,P;
    printf("Podaj dlugosc a boku oraz wysokosc h trojkata: ");
    scanf("%f%f",&a,&h);
    P=(a*h)/2.0;
    printf("Pole trojkata jest rowne: %f\n", P);
    }
2

Tak działa:

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
 
void menu(void);
void pole_prostokata(void);
void pole_kola(void);
void pole_trojkata(void);
 
int main()
    {
    char wybor;
    
    while(1)
    {
	puts("Program obliczajacy pola wybranych figur");
    puts("a) pole prostokata");
    puts("b) pole kola");
    puts("c) pole trojkata");
    puts("q) zakoncz");
    fflush(stdin);
    scanf("%c",&wybor);
    switch(wybor)
        {
        case 'a': pole_prostokata();
        break;
        case 'b': pole_kola();
        break;
        case 'c': pole_trojkata();
        break;
        default: menu();
        }
    if (wybor == 'q') break;
    }
    return(0);
    }
 
void menu(void)
    {
    char w;
 
    puts("Bye\n");
    }
 
void pole_prostokata(void)
    {
    float a,b,P;
    printf("Podaj dlugosci bokow a i b prostokata: ");
    scanf("%f%f",&a,&b);
    P=a*b;
    printf("Pole prostokata jest rowne: %f\n", P);
    }
 
void pole_kola(void)
    {float r,P;
    printf("Podaj dlugosc promienia r kola: ");
    scanf("%f",&r);
    P=3.1415*r*r;
    printf("Pole kola jest rowne: %f\n", P);
    }
 
void pole_trojkata(void)
    {
    float a,h,P;
    printf("Podaj dlugosc a boku oraz wysokosc h trojkata: ");
    scanf("%f%f",&a,&h);
    P=(a*h)/2.0;
    printf("Pole trojkata jest rowne: %f\n", P);
    }
0

Zauważ, że wywołanie funkcji menu() jest poza pętlą, więc pierwszy wybór jest powielany bez pytania.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.