3 svar
139 visningar
HiMate123 är nöjd med hjälpen
HiMate123 352
Postad: 10 okt 2021 21:16

Varför är min meny fel?

Hej, 
Nån som vet varför min meny inte fungerar? 
När jag har lagd till en Bana (alternativ L), så önskar jag att jag får meny en gång till. 
Så jag kan välja om jag vil lägga till en ny bana, se alla banor eller avsluta. 


    #include<stdio.h>             // printf, scanf, fil-håndtering.
    #include<string.h>      // Håndtering av char-arrayer, tekster, strenger.
    #include <stdlib.h>         //  srand, rand
    #include <stdbool.h>        //  bool
    #include <ctype.h>          //  toupper

    #define MAXBANER 18
    #define STRLEN 100

/**
 *  Hovedprogrammet:
 */

    int main() {

    char baneBeskrivelse [MAXBANER][STRLEN] = {"Mange trær og kratt","Flatt terreng"};   // Beskrivelse av banene.
    int baneLengde[MAXBANER] ={150,300};                  // Banenes lengde (i meter).
    int banePar[MAXBANER] = {3,7};                     // Forventet antall kast (par)
                                               // for hver enkelt bane.
    bool baneOB[MAXBANER] = {1,0};                     // Har banene OB eller ei.
    char valg;
    char valgOB;                                 // Brukersvar L, S eller Q
    int antallBaner = 2, i, sumPar;

//  Leser og sikrer at kun 'L'/'S'/'Q' godtas


        do{
        do{
            printf("\nMenyvalg\n");
            printf("\tL - Legge til bane\n");
            printf("\tS - Se alle baner\n");
            printf("\tQ - Avslutt\n");
            scanf(" %c", &valg);   valg = toupper(valg);

/* gjør om små bokstaver til store */

            if (valg == 'L' ||  valg == 'S'){
            printf("Valg: %c", valg);
            }else if (valg == 'Q')
                printf("Du har valgt å avslutte programmet");
            else (printf("Vennligst velg L, S eller Q"));

            }while(valg != 'L' && valg != 'S' && valg != 'Q');
            switch(valg){

                case 'L':

            if (antallBaner < MAXBANER){
            for (i = antallBaner; antallBaner < MAXBANER; i++){

            do{
            printf("\n\nHvor mange meter er banen?  ", i+1);
            scanf("%i", &baneLengde [antallBaner]);

            }while (baneLengde[i] < 0);

        if (baneLengde[i] > 0){

            do{
            printf("\nPar på bane nr %i(2-8): ", 1+i);
            scanf("%i", &banePar[i]);
            if (banePar > 2 || banePar <8){
            printf("\n\tDin inntastning: %2i", banePar[i]);
            }else printf("tallet må være mellom 2 og 8\n");
            }while(banePar[i] < 2 || banePar[i] > 8);

            do{getchar();
            printf("\nEr bane %i OB? (J/N): ", 1+i);
            scanf(" %c", &valgOB); valgOB = toupper(valgOB);
            if (valgOB = 'J'){
                baneOB[i] = true;
            }else baneOB[i] = false;
            printf("Din inntastning: %2c", valgOB);
            printf("True eller false: %i", baneOB[i]);
            }while (valgOB!= 'J' && valgOB != 'N');

            printf("\nBeskriv banen%i: ", i+1);
            getchar();
            fgets(baneBeskrivelse[i], STRLEN, stdin);
            printf("Din beskrivelse: %s", baneBeskrivelse[i]);
            antallBaner++;
        }else printf("Banen må vare storre enn 0");
            break; }
                }else printf("Du har lagt inn for mange baner");
                break;

            case 'S':
        for (i = 0; i < antallBaner; ++i){
         printf("\nBane %i\n", i+1);
         printf("\tLengde: %i meter\n", baneLengde[i]);
         printf("\tPar: %i\n", banePar [i]);
         if (baneOB[i]=true){
                  printf("\tMed OB\n)");
           } else printf("\tUten OB\n");
         printf("\tBeskrivelse: %s\n\n\n", baneBeskrivelse[i]);
        }
        sumPar = 0;
        for (i= 0; i < antallBaner; i++){
            sumPar = (sumPar+=banePar[i]);}
            printf("Antall baner: %i ", antallBaner);
            printf("Summen av antall par er: %i", sumPar);
        break;
        while(valg == 'L' || valg=='S');

        case 'Q':
            exit(0);
        break;

        default:
            printf("Ulovlig valg!");
        }}while(valg == 'Q');

        return 0;
        }
Lindehaven 820 – Lärare
Postad: 11 okt 2021 00:19

Jag gissar på att do-loopen avslutas p g a villkoret på denna rad:

}}while(valg == 'Q');

Ska antagligen vara:

}}while(valg != 'Q');

Till att börja med behöver du indentera koden så att den blir lättare att läsa

Lindehaven 820 – Lärare
Postad: 11 okt 2021 09:33

Även med väl indenterad kod så är den komplex och därmed svår att läsa och testa

Laguna Online 28457
Postad: 11 okt 2021 10:06

Här har jag fixat till indenteringen så du ser hur det ska vara. Själv använder jag lite större indentering än så.

#include<stdio.h>             // printf, scanf, fil-håndtering. 
#include<string.h>      // Håndtering av char-arrayer, tekster, strenger.
#include <stdlib.h>         //  srand, rand
#include <stdbool.h>        //  bool
#include <ctype.h>          //  toupper

#define MAXBANER 18
#define STRLEN 100

/**
 *  Hovedprogrammet:
 */

int main() {

  char baneBeskrivelse [MAXBANER][STRLEN] = {"Mange trær og kratt","Flatt terreng"};   // Beskrivelse av banene.
  int baneLengde[MAXBANER] ={150,300};                  // Banenes lengde (i meter).
  int banePar[MAXBANER] = {3,7};                     // Forventet antall kast (par)
  // for hver enkelt bane.
  bool baneOB[MAXBANER] = {1,0};                     // Har banene OB eller ei.
  char valg;
  char valgOB;                                 // Brukersvar L, S eller Q
  int antallBaner = 2, i, sumPar;

  //  Leser og sikrer at kun 'L'/'S'/'Q' godtas


  do{
    do{
      printf("\nMenyvalg\n");
      printf("\tL - Legge til bane\n");
      printf("\tS - Se alle baner\n");
      printf("\tQ - Avslutt\n");
      scanf(" %c", &valg);   valg = toupper(valg);

      /* gjør om små bokstaver til store */

      if (valg == 'L' ||  valg == 'S'){
        printf("Valg: %c", valg);
      } else if (valg == 'Q') {
        printf("Du har valgt å avslutte programmet");
      } else {
        printf("Vennligst velg L, S eller Q");
      }

    } while(valg != 'L' && valg != 'S' && valg != 'Q');

    switch(valg){

    case 'L':

      if (antallBaner < MAXBANER){
        for (i = antallBaner; antallBaner < MAXBANER; i++){

          do{
            printf("\n\nHvor mange meter er banen?  ", i+1);
            scanf("%i", &baneLengde [antallBaner]);

          }while (baneLengde[i] < 0);

          if (baneLengde[i] > 0){

            do{
              printf("\nPar på bane nr %i(2-8): ", 1+i);
              scanf("%i", &banePar[i]);
              if (banePar > 2 || banePar <8){
                printf("\n\tDin inntastning: %2i", banePar[i]);
              }else {
                printf("tallet må være mellom 2 og 8\n");
              }
            }while(banePar[i] < 2 || banePar[i] > 8);

            do{
              getchar();
              printf("\nEr bane %i OB? (J/N): ", 1+i);
              scanf(" %c", &valgOB); valgOB = toupper(valgOB);
              if (valgOB = 'J'){
                baneOB[i] = true;
              }else {
                baneOB[i] = false;
              }
              printf("Din inntastning: %2c", valgOB);
              printf("True eller false: %i", baneOB[i]);
            }while (valgOB!= 'J' && valgOB != 'N');

            printf("\nBeskriv banen%i: ", i+1);
            getchar();
            fgets(baneBeskrivelse[i], STRLEN, stdin);
            printf("Din beskrivelse: %s", baneBeskrivelse[i]);
            antallBaner++;
          }else {
            printf("Banen må vare storre enn 0");
          }
          break; 
        }
      }else {
        printf("Du har lagt inn for mange baner");
      }
      break;

    case 'S':
      for (i = 0; i < antallBaner; ++i){
        printf("\nBane %i\n", i+1);
        printf("\tLengde: %i meter\n", baneLengde[i]);
        printf("\tPar: %i\n", banePar [i]);
        if (baneOB[i]=true){
          printf("\tMed OB\n)");
        } else {
          printf("\tUten OB\n");
        }
        printf("\tBeskrivelse: %s\n\n\n", baneBeskrivelse[i]);
      }
      sumPar = 0;
      for (i= 0; i < antallBaner; i++){
        sumPar = (sumPar+=banePar[i]);
      }
      printf("Antall baner: %i ", antallBaner);
      printf("Summen av antall par er: %i", sumPar);
      break;

    case 'Q':
      exit(0);
      break;

    default:
      printf("Ulovlig valg!");
    }
  } while(valg == 'Q');

  return 0;
}
Svara Avbryt
Close