Ir ao conteúdo
  • Cadastre-se

Problema com switch


AloneSmile

Posts recomendados

Galera estou criando um alg aqui para lançamento das médias anuais de turmas do ensino médio, e inicialmente queria fazer uma estrutura igual a de baixo que no inicio mostre as opções  1 - Prosseguir  4 - Encerrar, para iniciar o programa após a escolha, há submenus com as opções de(1 ...... CADASTRO, 2 ...... CALCULAR, 3 ...... IMPRIMIR e 4 ...... VOLTAR AO INICIO), porém quando escolha a op 1, o alg não quer parar para que eu possa informar o que desejo, alguém sabe o porque deste ocorrido? Desde já,Obrigado!
 
 
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <locale>
#include <iostream>
 
int main (int argc, char *argv[]){
int op,op2,pergunta, sairdosubmenu = 0;
char nome[50];
setlocale(LC_ALL ,"Portuguese");
system("cls");   
   
   while(true){
    printf("                    OLÁ SEJA BEM-VINDO AO PROGRAMA DE                        \n\n");
    printf("                    LANÇAMENTO DE MÉDIAS ANUAL DE UMA                          ");
  printf("                          TURMA DO ENSINO MÉDIO \n\n");
  printf(" * Escolha uma opção:  \n\n");
  printf("1 - Prosseguir  4 - Encerrar\n");
    scanf("%i", &op);
    system("cls"); 
   
    if(op == 4)
return 0;
 
    if (op==1){//ini op 1
    do{//ini do
    system("cls");     
  printf("                            1 ...... CADASTRO\n");
      printf("                            2 ...... CALCULAR\n");
  printf("                            3 ...... IMPRIMIR\n");
  printf("                            4 ...... VOLTAR AO INICIO\n");
  printf("................................................................................\n");
  scanf("%i", &op2);
 
    switch(op2){//ini switch 
    case 1:
    system("cls");
    printf("               OPÇÃO 1..............CADASTRO: \n\n");
    //Desenvolvimento
   
    printf("Informe o nome do aluno: \n");
    scanf("%c", &nome);
    //Não quer parar para eu cadastrar pelo menos um aluno, já esta indo direto a outra pergunta:
    //"...........1 - Voltar ao ínicio  4 - Voltar...............\n"
   
    printf("...........1 - Voltar ao ínicio  4 - Voltar...............\n");
    scanf("%i", &pergunta);
    system("cls");
    break; 
   
    case 2:
    system("cls");
    printf("               OPÇÃO 2..............CALCULAR: \n\n");
    //Processamento
    printf("........................CALCULO CONCLUIDO COM SUCESSO..........................\n");
    printf("...........1 - Voltar ao ínicio  4 - Voltar...............\n");
    scanf("%i", &pergunta);
    system("cls");
    break;
   
    case 3:
    system("cls");
    printf("               OPÇÃO 3..............IMPRIMIR: \n\n");
    //Desenvolvimento
    printf("...........1 - Voltar ao ínicio  4 - Voltar...............\n");
    scanf("%i", &pergunta);
    system("cls");
    break;
   
    case 4:
    sairdosubmenu = 1; 
break;
     }//fim switch 
       
if(sairdosubmenu){//ini if sairdosubmenu
    system("cls");
    sairdosubmenu = 0;
    break;
}//fim if sairdosubmenu
      }//fim do
while (pergunta!=1);    
  }//fim op 1
   
   }
   return 0;  
}

 

Link para o comentário
Compartilhar em outros sites

scanf("%c", &nome);

 

nome é uma string, então deveria usar %s em vez de %c.

Além disso, por ele ser uma string, ele já guarda o endereço base do array, então não precisa usar o &.

 

--> scanf("%s", nome);

 

Uma dica que eu te dou, não relacionada a esse topico, é que divida o programa em funções.

Nunca é uma boa ideia deixar todo o processamento dentro do switch. Fica ruim de manter e de corrigir os erros.

 

Prefira sempre algo assim:

void cadastro(...) {    ...} void calcular(...) {     ...} void imprimeMenu() {    ...} ... int main() {    ...    while (true) {        imprimeMenu();        scanf("%i", &op);         if (op == 4) return;        ...         switch (op2) {        case 1:            cadastro();        case 2:            calcular();        etc...        }    }    return 0;}

Quanto mais modular for o teu programa, mais fácil vai ser pra adicionar coisas futuras ou pra corrigir os erros que aparecem.

(e o seu professor agradecerá também)

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Seguindo a linha do algoritmo. Você deve usar " %c" no scanf e fflush(stdin); apos.

Altere as case. Assim;

case 1: para case '1': e assim por diante

Ate todas opções, a última delas será;

default:

puts( "nada exite no menu para essa escolha!" );

Esse default vai executar sempre que não houver opção no menu ou o usuários errar na digitação.

Eu acho bem melhor assim.

Link para o comentário
Compartilhar em outros sites

Testa ai e digita letras no lugar de números e veja o loop desgra.. que ira ficar.

Digita uma nota com virgula ex: 7,5, ele volta.

Tente escrever o nome e sobre nome do aluno quando é imprimido ele só volta o primeiro nome.

 

 

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <locale>
#include <string.h>
#include <iostream>
 
static int op=0, op2=0, i, soma=0, notas[4], mat, a=1, b=1;
static char nome[30][40], opcao[25];
static float me;
 
 
void materias(){
    switch (mat){
case 1:
strcpy(opcao, "Artes ");    
      break;
     case 2:
      strcpy(opcao, "Educação Física ");
         break;
     case 3:
      strcpy(opcao, "L. Estrang (Inglês) ");
    break;
     case 4:
      strcpy(opcao, "L. Estrang (Espanhol) ");
         break;
     case 5:
      strcpy(opcao, "Lingua Portuguesa ");
    break;
case 6:
         strcpy(opcao, "Biologia ");
         break;
     case 7:
         strcpy(opcao, "Física ");
         break;
     case 8:
         strcpy(opcao, "Matemática ");
         break;
     case 9:
         strcpy(opcao, "Química ");                 
         break;
     case 10:
         strcpy(opcao, "Filosofia ");                 
         break;         
     case 11:
         strcpy(opcao, "Geografia ");                 
         break;         
     case 12:
         strcpy(opcao, "História ");
         break;             
     case 13:
         strcpy(opcao, "Sociologia ");
         break;    
default:            
strcpy(opcao, "Inexistente ");   
}
printf("Matéria: %s", opcao);
}
 
 
void cadastro (void){   
  
    printf("\n\t\tLINGUAGENS, CÓDIGOS E SUAS TECNOLOGIAS\n");
printf("1 - Artes,\n2 - Educação Física,\n3 - L. Estrang (Inglês),\n4 - L. Estrang (Espanhol) ou\n5 - Lingua Portuguesa\n");
    printf("\n\t\tCIÊNCIAS DA NATUREZA, MATEMÁTICA E SUAS TECNOLOGIAS\n");
printf("6- Biologia,\n7 - Física,\n8 - Matemática ou\n9 - Química\n");
    printf("\n\t\tCIÊNCIAS HUMANAS E SUAS TECNOLOGIAS\n");
printf("10 - Filosofia,\n11 - Geografia,\n12 - História ou\n13 - Sociologia\n"); 
 
printf("\nInforme um numero para a matéria refente: ");
    scanf("%i", &mat);
 
    printf("\nInforme o nome do aluno: ");
    scanf("%s", &nome); fflush(stdin);
    for(i=0; i<4; i++){
    printf("Informe a %dº nota da ", a);
    materias();
    scanf("%d", &notas);
    a=a+1;
  }
}
 
void calcular(){
    for(i=0; i<4; i++){
soma += notas;
}
}
 
 
 
void imprimir(){
calcular();
 
materias();
printf("\nAluno: %s\n", nome);
me=(float)soma/4;
 
for(i=0; i<4; i++){
printf("%dº Bimestre:", B);
printf(" %d\n", notas);
b=b+1;
}
printf("\nMédia anual: %g\n", me);
 
if(me>=7)
printf("\nAluno(a) %s Situação: Aprovado - Parabéns!!!", nome);
else if((me>=5) && (me<7))
printf("\nAluno(a) %s Situação: Recuperação", nome);
else
printf("\nAluno(a) %s Situação: Reprovado", nome);
 
 
printf("\n\nEmitido em: %s HORA: %s\n",__DATE__,__TIME__);
 
soma=0;
}
 
void imprimeMenu(){
    printf("                    OLÁ SEJA BEM-VINDO AO PROGRAMA DE                        \n");
    printf("                    LANÇAMENTO DE MÉDIAS ANUAL DE UMA                          ");
  printf("                          TURMA DO ENSINO MÉDIO \n\n");
  printf(" * Escolha uma opção:  \n\n");
  printf("1 - Prosseguir  4 - Encerrar\n");
    scanf("%i", &op);
    system("cls"); //limpa tela
}
 
void cabecalho(){
system("cls");     
  printf("                            1 ...... CADASTRO\n");
  printf("                            2 ...... IMPRIMIR\n");
  printf("                            3 ...... AJUDA\n");
  printf("                            4 ...... VOLTAR AO INICIO\n");
  printf("................................................................................\n");
  scanf("%i", &op2);
}
 
//------------------------------------------------------------------------------------------------------------------
 
int main (int argc, char *argv[]){
int pergunta, sairdosubmenu = 0;
 
char nome[50];
setlocale(LC_ALL ,"Portuguese");
system("cls");   
 
 
   while(true){
    imprimeMenu();
   
    if(op == 4)
return 0;
 
    if (op==1){//ini op 1
    do{//ini do
   
    cabecalho();
   
    switch(op2){//ini switch 
    case 1:
    system("cls");
    printf("\t\tOPÇÃO 1..............CADASTRO: \n\n");
   
    //Desenvolvimento
    cadastro();
   
    printf("\n\n\t\tDigite alguma tecla para voltar\n");
    scanf("%s", &pergunta); fflush(stdin);
    system("cls");
    break; 
   
    case 2:
    system("cls");
    printf("\t\tOPÇÃO 3..............IMPRIMIR: \n\n");
   
//Desenvolvimento
imprimir();
 
    printf("\n\n\t\tDigite alguma tecla para voltar\n");
    scanf("%s", &pergunta); fflush(stdin);
    system("cls");
    break;
   
    case 3:
    system("cls");
    printf("\t\tOPÇÃO 4..............AJUDA: \n\n");
   
//Desenvolvimento
 
    printf("\n\n\t\tDigite alguma tecla para voltar\n");
    scanf("%s", &pergunta); fflush(stdin);
    system("cls");
    break;
   
    case 4:
    sairdosubmenu = 1; 
break;
 
default:
printf("Opção Inválida");
     }//fim switch 
       
if(sairdosubmenu){//ini if sairdosubmenu
    system("cls");
    sairdosubmenu = 0;
    break;
}//fim if sairdosubmenu
      }//fim do
while (pergunta!=1);    
  }//fim op 1
   
   }
   system("pause");
   return 0;  
Link para o comentário
Compartilhar em outros sites

Tentei arrumar o teu código aqui, mas tem um monte de coisas que eu não entendi... e pelo fato de você ter usado um monte de variáveis globais, ficou ruim de corrigir.

Pelo que entendi, esse programa cadastra vários alunos com as notas deles, depois calcula a média e diz se eles passaram de ano?

 

Caso seja isso, eu te recomendaria usar uma struct pra guardar o registro dos alunos em vez de usar aquele monte de variáveis globais.

Quanto ao motivo do programa não estar capturando corretamente o input do usuário, acredito que seja naquela parte de pegar os nomes e as notas.

 

Se quiser fazer o programa usando struct em vez das variáveis globais, eu comecei a fazer um modelo aqui a partir do teu código:

#include <stdio.h>#include <stdlib.h>#include <conio.h>#include <locale>#include <string.h>// Cada aluno tem um nome e 4 notas pra cada matériatypedef struct tAluno {    char nome[30];    float notas[13][4]; // 4 notas pra cada uma das 13 matérias?} Aluno;static Aluno alunos[30];static int index;void materias (int opt) {    switch (opt+1) {    case 1:        printf("Matéria: Artes ");        break;    case 2:        printf("Matéria: Educação Física ");        break;    case 3:        printf("Matéria: L. Estrang (Inglês) ");        break;    case 4:        printf("Matéria: L. Estrang (Espanhol) ");        break;    case 5:        printf("Matéria: Língua Portuguesa ");        break;    case 6:        printf("Matéria: Biologia ");        break;    case 7:        printf("Matéria: Física ");        break;    case 8:        printf("Matéria: Matemática ");        break;    case 9:        printf("Matéria: Química ");        break;    case 10:        printf("Matéria: Filosofia ");        break;    case 11:        printf("Matéria: Geografia ");        break;    case 12:        printf("Matéria: História ");        break;    case 13:        printf("Matéria: Sociologia ");        break;    default:        printf("Matéria: Inexistente ");    }}int cadastroMenu() {    int opt = 0;    system("cls");    printf("\t\t CADASTRO: \n\n");    printf("\t\t LINGUAGENS, CÓDIGOS E SUAS TECNOLOGIAS \n");    printf(" 1 - Artes \n");    printf(" 2 - Educação Física \n");    printf(" 3 - L. Estrang (Inglês) \n");    printf(" 4 - L. Estrang (Espanhol) \n");    printf(" 5 - Lingua Portuguesa \n\n");    printf("\t\t CIÊNCIAS DA NATUREZA, MATEMÁTICA E SUAS TECNOLOGIAS \n");    printf(" 6- Biologia \n");    printf(" 7 - Física \n");    printf(" 8 - Matemática \n");    printf(" 9 - Química \n\n");    printf("\t\t CIÊNCIAS HUMANAS E SUAS TECNOLOGIAS \n");    printf(" 10 - Filosofia \n");    printf(" 11 - Geografia \n");    printf(" 12 - História \n");    printf(" 13 - Sociologia \n\n");    printf(" Informe um numero para a matéria refente: ");    scanf("%d\n", &opt);    return opt-1;}void cadastro() {    int i, j;    int opt;    // Nome do aluno    printf("\nInforme o nome do aluno: ");    scanf("%s", alunos[index].nome); fflush(stdin);    // Aqui tá cadastrando todas as notas de um determinado aluno    for (i=0; i < 4; i++) {        for (j=0; j < 13; j++) {            printf("Informe a %dº nota da ", i+1);            materias(j);            scanf("%f", &alunos[index].notas[j][i]);        }    }    index++;    // Se quiser cadastrar apenas as notas de uma matéria específica    //opt = cadastroMenu();    //for (i=0; i < 4; i++) {    //    printf("Informe a %dº nota da ", i+1);    //    materias(opt);    //    scanf("%f", &alunos[index].notas[opt][i]);    //}}void imprimir() {    int i;    for (i=0; i < index; i++) {        // ...    }    system("pause");}int imprimeMenu() {    int opt = 0;    system("cls");    printf("\n\n");    printf("\t\t OLÁ SEJA BEM-VINDO AO PROGRAMA DE\n");    printf("\t\t LANÇAMENTO DE MÉDIAS ANUAL DE UMA\n");    printf("\t\t TURMA DO ENSINO MÉDIO\n\n");    printf(" * Escolha uma opção: \n\n");    printf(" 1 - Prosseguir\n");    printf(" 4 - Encerrar\n");    scanf("%d", &opt);    system("cls");    return opt;}int cabecalho() {    int opt = 0;    system("cls");    printf("\n\n");    printf("\t 1 . CADASTRO\n");    printf("\t 2 . IMPRIMIR\n");    printf("\t 3 . AJUDA\n");    printf("\t 4 . VOLTAR AO INICIO\n\n");    scanf("%d", &opt);    system("cls");    return opt;}int main (int argc, char *argv[]) {    int op1, op2;    index = 0;    setlocale(LC_ALL ,"Portuguese");    while(true) {        op1 = imprimeMenu();        if (op1 == 4)            return 0;        if (op1 == 1) {            do {                op2 = cabecalho();                switch (op2) {                case 1:                    cadastro();                    break;                case 2:                    imprimir();                    break;                case 3:                    // ajuda();                    break;                default:                    printf("Opção Inválida");                }            } while (op2 != 4);        }    }    system("pause");    return 0;}
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!