दिए गए निर्देश में, मुझे केवल लूप के दौरान उपयोग करना है। लक्ष्य उपयोगकर्ता को स्वीकार्य इनपुट का चयन करने के लिए प्रेरित करना है। यदि गलत इनपुट दिया जाता है, तो प्रोग्राम उपयोगकर्ता को उपयुक्त इनपुट का चयन करने के लिए बाध्य करता है। प्रोग्राम तब तक चलता रहता है जब तक उपयोगकर्ता एक बहुत विशिष्ट इनपुट का चयन करके अस्तित्व का चयन नहीं करता है जो मेरे मामले में ऊपरी या निचला मामला "ई" है।

समस्या ऊपरी या निचले मामले "ई" का चयन करने के बाद भी है, मेरा प्रोग्राम चलता रहता है। मैं अपने जबकि लूप के लिए शर्त के रूप में "i" चर का उपयोग कर रहा हूं। उदाहरण के लिए, मैंने वेरिएबल को 2 से इनिशियलाइज़ किया, और अपने लूप को 2 पर सेट किया, जिसका अर्थ है कि कंडीशन सही है और जबकि लूप चलता रहेगा। मैंने अपने "i" वेरिएबल को 3 में बदल दिया है उदाहरण के लिए केवल जब अपर या लोअर केस "E" दबाया जाता है। यह मेरी सोच के अनुसार लूप को झूठा बनाना चाहिए और अनिवार्य रूप से अब लूप नहीं चलाना चाहिए, लेकिन मेरा लूप चलता रहता है

#include<stdio.h>

int main()
{
    char selection;
    float length, width, area, base, height, apothem, side;
    int i=2;
    while (i=2)
    {
    printf("Press R to calculate the area of a rectangle\nPress T to calculate the area of a right angled triangle\nPress M to calculate the area of a polygon\nPress E to exit the program\n");
    scanf(" %c", &selection);
    switch (selection)
    {
    case 'R':
    case 'r':
        printf("Enter the length of the rectangle\n");
        scanf("%f", &length);
        printf("Enter the width of the rectangle\n");
        scanf("%f", &width);
        area=length*width;
        printf("The area of the rectangle is %f\n", area);
        break;
    case 'T':
    case 't':
        printf("Enter the base of the triangle\n");
        scanf("%f", &base);
        printf("Enter the height of the triangle\n");
        scanf("%f", &height);
        area=(0.5)*base*height;
        printf("The area of the triangle is %f\n", area);
        break;
    case 'M':
    case 'm':
        printf("Enter the length of one side of the polygon\n");
        scanf("%f", &length);
        printf("Enter the apothem of the polygon\n");
        scanf("%f", &apothem);
        printf("Enter the number of sides of the polygon\n");
        scanf("%f", &side);
        area=0.5*length*side*apothem;
        printf("The area of the polygon is %f\n", area);
        break;
    case 'E':
    case 'e':
        printf("You are exiting the program\n");
        i=3;
        break;
    default:
        printf("You have selected an invalid input\n");
        break;
    }
    }
    return 0;
}
0
codingisfun 24 अक्टूबर 2020, 13:26

3 जवाब

सबसे बढ़िया उत्तर

आपका मूल कोड काम कर सकता है लेकिन आपको बस थोड़ी देर के लिए साइन = से == बदलना होगा।

2
Bryz 24 अक्टूबर 2020, 21:00

आपको होना चाहिए:

  • सभी इनपुट सत्यापन की जाँच कर रहा है। अर्थात। यह मत मानिए कि scanf हमेशा काम करता है।
  • अगले बाहरी लूप पर आगे बढ़ते समय सभी संभावित अमान्य डेटा साफ़ करें

जैसे कुछ इस तरह:

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

int main() 
{
    bool quit = false;
    while (!quit)
    {
        fputs("Press R to calculate the area of a rectangle\n"
              "Press T to calculate the area of a right angled triangle\n"
              "Press M to calculate the area of a polygon\n"
              "Press E to exit the program\n", stdout);

        char selection;
        if (scanf(" %c", &selection) == 1)
        {
            float length, width, area, base, height, apothem, side;
            int c;

            switch (selection)
            {
            case 'R':
            case 'r':
                printf("Enter the length of the rectangle\n");
                if (scanf("%f", &length) == 1)
                {
                    printf("Enter the width of the rectangle\n");
                    if (scanf("%f", &width) == 1)
                    {
                        area = length*width;
                        printf("The area of the rectangle is %f\n", area);
                        break;
                    }
                }
                fputs("invalid input\n", stderr);
                while ((c = fgetc(stdin)) != '\n' && c != EOF);
                break;

            case 'T':
            case 't':
                printf("Enter the base of the triangle\n");
                if (scanf("%f", &base) == 1)
                {
                    printf("Enter the height of the triangle\n");
                    if (scanf("%f", &height) == 1)
                    {
                        area = (0.5f)*base*height;
                        printf("The area of the triangle is %f\n", area);
                        break;
                    }
                }
                fputs("invalid input\n", stderr);
                while ((c = fgetc(stdin)) != '\n' && c != EOF);
                break;

            case 'M':
            case 'm':
                printf("Enter the length of one side of the polygon\n");
                if (scanf("%f", &length) == 1)
                {
                    printf("Enter the apothem of the polygon\n");
                    if (scanf("%f", &apothem) == 1)
                    {
                        printf("Enter the number of sides of the polygon\n");
                        if (scanf("%f", &side) == 1)
                        {
                            area = 0.5f*length*side*apothem;
                            printf("The area of the polygon is %f\n", area);
                            break;
                        }
                    }
                }
                fputs("invalid input\n", stderr);
                while ((c = fgetc(stdin)) != '\n' && c != EOF);
                break;

            case 'E':
            case 'e':
                printf("You are exiting the program\n");
                quit = true;
                break;

            default:
                printf("You have selected an invalid input\n");
                break;
            }
        }
        else
        {
            quit = true;
        }
    }

    return 0;
}

यह ज्यादातर उचित है, और संभवतः जो पूछा जा रहा है उसके लिए पर्याप्त से अधिक होगा। इन्हें विशेष नोट दें:

  • सफलता के लिए प्रत्येक scanf की जाँच करना।
  • आपके मेनू तर्क को पढ़ने के लिए " %c" प्रारूप विनिर्देशक। अग्रणी स्थान सुनिश्चित करता है कि चरित्र में खींचने से पहले इनपुट स्ट्रीम पर किसी भी सफेद जगह को छोड़ दिया जाए।
  • while ((c = fgetc(stdin)) != '\n' && c != EOF); का उपयोग वर्तमान इनपुट लाइन पर सब कुछ साफ़ करने के लिए किया जाता है, जो पहले scanf में संभावित रूप से विफल होने वाली किसी भी चीज़ को प्रभावी ढंग से हटा देता है।

मैंने कहा कि यह ज्यादातर उचित है। और भी बहुत कुछ किया जा सकता है, लेकिन तथ्य यह है कि कोई भी आपको बता रहा है कि उपयोगकर्ता-इनपुट प्रसंस्करण तुच्छ है झूठ बोलना; यह नहीं है। जब भी मानवीय संपर्क शामिल होता है, चीजें जल्दी दक्षिण की ओर जा सकती हैं। कई, अनेक सूक्ष्म चीजें हैं जो गलत हो सकती हैं। यह उनमें से अधिकांश को कवर करता है।

1
WhozCraig 24 अक्टूबर 2020, 13:52

कार्यक्रम में अपरिभाषित व्यवहार है क्योंकि पहले लूप की स्थिति में अप्रारंभीकृत चर selection का उपयोग किया जाता है

char selection;
float length, width, area, base, height, apothem, side;
while (!(selection == 'R' || selection == 'r') && !(selection == 'T' || selection == 't') && !(selection == 'M' || selection == 'm') && !(selection == 'E' || selection == 'e'))

आपको लूप से पहले वेरिएबल selection को इनिशियलाइज़ करना होगा। आप इसे उदाहरण के लिए निम्न तरीके से कर सकते हैं:

char selection = '\0';

और जबकि लूप की स्थिति में केवल यही अभिव्यक्ति होनी चाहिए

while (!(selection == 'E' || selection == 'e') )

अन्य सभी दर्ज किए गए मानों को स्विच स्टेटमेंट के भीतर चेक किया जाता है।

और इस कॉल के बजाय

scanf("%c", &selection);

उपयोग

scanf(" %c", &selection);
      ^^^^ 

अन्यथा भी व्हाइट स्पेस कैरेक्टर उदाहरण के लिए नया लाइन कैरेक्टर '\n' भी इनपुट किया जाएगा।

और इन अनावश्यक कॉलों को हटा दें

getchar();
1
Vlad from Moscow 24 अक्टूबर 2020, 14:40