• Prezados usuários,

    Por questões de segurança, a partir de 22/04/2024 os usuários só conseguirão logar no fórum se estiverem com a "Verificação em duas etapas" habilitada em seu perfil.

    Para habilitar a "Verificação em duas etapas" entre em sua conta e "Click" em seu nick name na parte superior da página, aparecerá opções de gestão de sua conta, entre em "Senha e segurança", a primeira opção será para habilitar a "Verificação em duas etapas".

    Clicando alí vai pedir a sua senha de acesso ao fórum, e depois vai para as opções de verificação, que serão as seguintes:

    ***Código de verificação via aplicativo*** >>>Isso permite que você gere um código de verificação usando um aplicativo em seu telefone.

    ***Email de confirmação*** >>>Isso enviará um código por e-mail para verificar seu login.

    ***Códigos alternativos*** >>>Esses códigos podem ser usados para fazer login se você não tiver acesso a outros métodos de verificação.

    Existe as 3 opções acima, e para continuar acessando o fórum a partir de 22/04/2024 você deverá habilitar uma das 03 opções.

    Tópico para tirar dúvidas>>>>https://forum.adrenaline.com.br/threads/obrigatoriedade-da-verificacao-em-duas-etapas-a-partir-de-24-04-2024-duvidas.712290/

    Atencionamente,

    Administração do Fórum Adrenaline

Ajudinha em C.

VoiderX

Dimas o primeiro vida loka
Registrado
Olá galera, nunca pedi ajuda aqui nesta área e também não sou muito ativo por aqui:forever:
Mas meu professor passou um programinha para fazer e eu não estou conseguindo fazer ele funcionar...
Aqui vai o enunciado(se bem que meu problema nem tem muito a ver com ele).
04) Faça um programa que apresente o seguinte menu para o usuário: Controle de Notas
==============
<1> - Adicionar notas de um aluno
<2> - Listar todas as notas e médias
<3> - Listar a maior nota na prova 1 e na prova 2
<4> - Sair
Qual opção escolhida?

O usuário poderá entrar no máximo com as notas de 30 alunos. Para isto crie uma matriz de reais de duas colunas, onde cada uma armazenará a nota de uma prova. Na opção 1 o usuário entrará com as duas notas de um aluno. Caso o usuário tente executar as opções 2 ou 3 e não exista nenhuma nota cadastrada mostre uma mensagem de alerta. Caso o usuário tente cadastrar os dados de um novo aluno e não exista mais espaço na matriz de uma mensagem de erro. Na opção 2 liste em formato de tabela as notas e médias de todos os alunos. Na opção 3 apresente a maior nota da prova 1 e da prova 2 cadastradas. Caso o usuário escolha a opção 4 use a função exit(int) para encerrar o programa. Caso escolha uma opção inválida de uma mensagem de erro e retorne ao menu. As opções de 1 a 3 devem chamar funções especificas para realizar as atividades propostas, passando-se a matriz com parâmetro. Utilize a estrutura switch com break, e a do/while para fazer o menu, e constantes para controlar os limites da matriz.

E meu humilde codigo:
C:
# include <stdio.h>

# define qntalunos 3


        void adnota(float nota[2][qntalunos], int*contcoluna){
           int contlinha=0;
            if(*contcoluna<qntalunos)
            {
            printf("Digite a primeira nota do aluno %d:", *contcoluna+1);
            scanf("%f", &nota[contlinha][*contcoluna]);
            contlinha++;
            printf("Digite a segunda nota do aluno %d:",*contcoluna+1);
            scanf("%f", &nota[contlinha][*contcoluna]);


            }
            else{
                printf("Sem espaço no vetor\n");
        }
             *contcoluna++;
        }




        void listanota(float nota[2][qntalunos])
        {
        int contlinha=0, contcoluna=0;
            for(contcoluna=0; contcoluna<qntalunos;contcoluna++){
            printf("\n\nAluno: %d  Nota P1: %.2f Nota P2: %.2f \n", contcoluna, nota[0][contcoluna], nota[1][contcoluna]);
        }
        }




        main(){
            int opcao, contcoluna=0;
            float nota[2][qntalunos];
        printf("\t\t\tControle de notas\n");
        printf("\t\t\t-----------------\n");
        printf("\t<1>-Adiciona notas para um aluno\n");
        printf("\t<2>-Lista todas as notas e medias\n");
        printf("\t<3>-Lista a maior nota na prova 1 e na prova 2  \n");
        printf("\t<4>-Sai do programa.\n");


        do{
                printf("O valor da coluna eh:%d\n", contcoluna);


        printf("\tDigite a opcao desejada:");
        scanf("%d",&opcao);
        switch(opcao){
    case 1:
        {
            adnota(nota, &contcoluna);
            break;
        }


    case 2:
        {
            listanota(nota);
            break;
        }
    case 3:
        {
            break;
        }
    case 4:
        {
            break;
        }
        }
        }while(opcao !=4);
        }
[R]O problema que eu estou tendo é, que toda vez que eu encerro o laço, a coluna está voltando para a inicial ao invés de continuar em sequência com as outras, não sei o que estou errando e gostaria muito que alguém pudesse me dar uma luz nisso aqui:haha:

PS:Os ''cases'' estão vazios alguns porque ainda não tive como colocar essas funções devido a primeira não estar funcionando [/R]corretamente:melior:

Update:
Resolvi ESSE problema, agora como de praxe apareceu um outro....
C:
# include <stdio.h>

# define qntalunos 3


           int adnota(float nota[2][qntalunos], int*contcoluna){
           int contlinha=0;
            if(*contcoluna<qntalunos)
            {
            printf("Digite a primeira nota do aluno %d:", *contcoluna+1);
            scanf("%f", &nota[contlinha][*contcoluna]);
            contlinha++;
            printf("Digite a segunda nota do aluno %d:",*contcoluna+1);
            scanf("%f", &nota[contlinha][*contcoluna]);
            return 1;
            }
            else{
                printf("Sem espaco no vetor\n");
                return 0;


        }


        }




        void listanota(float nota[2][qntalunos],int contcoluna)
        {
        int contlinha=0,contaux;
            for(contaux=0; contaux<contcoluna;contaux++){
            printf("\nAluno: %d  Nota P1: %.2f Nota P2: %.2f Media :%.2f \n", contaux+1, nota[0][contaux], nota[1][contaux], (nota[0][contaux]+ nota[1][contaux])/2);
        }
        }


        void listamaioresnotas(float nota[2][qntalunos])
        {


        }


        main(){
            int contcoluna=0;
            int opcao;
            float nota[2][qntalunos];
        printf("\t\t\tControle de notas\n");
        printf("\t\t\t-----------------\n");
        printf("\t<1>-Adiciona notas para um aluno\n");
        printf("\t<2>-Lista todas as notas e medias\n");
        printf("\t<3>-Lista a maior nota na prova 1 e na prova 2  \n");
        printf("\t<4>-Sai do programa.\n");


        do{
                printf("\tDigite a opcao desejada:");
                scanf("%d",&opcao);
                switch(opcao){
    case 1:
        {
            if(adnota(nota, &contcoluna))
            contcoluna++;
            else{
            contcoluna+=0;
            }
            opcao=0;
            break;
        }


    case 2:
        {
            listanota(nota,contcoluna);
            opcao=0;
            break;
        }
    case 3:
        {
            listamaioresnotas(nota);
            break;
        }
    case 4:
        {
            printf("Fim do programa!\n");
            opcao=0;
            break;
        }
    default:
        {
            printf("Opcao invalida!\n");
            break;
        }


        }


        }while(opcao !=4);
        }

O problema acho que está com o default, se eu digito um numero invalido, ele funciona normalmente e retorna que é invalido e pede para digitar novamente, agora se eu digito uma letra, ele entra em loop infinito.
 
Última edição:
Quando entrar com algo diferente de um número, o scanf vai falhar e opcao não será preenchido com nada. Como essa variável nem foi inicializada, isso pode ser um problema. O ideal seria colocar um opcao=0; antes do scanf.
 
Quando entrar com algo diferente de um número, o scanf vai falhar e opcao não será preenchido com nada. Como essa variável nem foi inicializada, isso pode ser um problema. O ideal seria colocar um opcao=0; antes do scanf.
Consegui resolver colocando um fflush(stdin) antes do scanf, agora se for digitado algo diferente de um número ele pegará 0 e reiniciará o laço normalmente.
Código final:
C:
# include <stdio.h>

# define qntalunos 30 // Constante para facilitar alterações no codigo.


           int adnota(float nota[2][qntalunos], int contcoluna){
           int contlinha=0;
            if(contcoluna<qntalunos)
            {
            printf("Digite a primeira nota do aluno %d:", contcoluna+1);
            fflush(stdin);
            scanf("%f", &nota[contlinha][contcoluna]);
            contlinha++; // Passa para próxima linha  no caso a nota da P2.
            printf("Digite a segunda nota do aluno %d:",contcoluna+1);
            fflush(stdin);
            scanf("%f", &nota[contlinha][contcoluna]);
            return 1; // Caso haja espaço no vetor.
            }
            else{
                printf("Sem espaco no vetor\n");
                return 0;


        }


        }




        void listanota(float nota[2][qntalunos],int contcoluna) //Não é necessário usar ponteiro nesse caso pois somente usa o valor fixo do contador de coluna.
        {
        int contlinha=0,contaux;
            for(contaux=0; contaux<contcoluna;contaux++){ //Uso de um contador auxiliar para andar através do vetor.
            printf("\nAluno: %d  Nota P1: %.2f Nota P2: %.2f Media :%.2f \n", contaux+1, nota[0][contaux], nota[1][contaux],
                   (nota[0][contaux]+ nota[1][contaux])/2);
        }
        }


        void listamaioresnotas(float nota[2][qntalunos],int contcoluna)
        {
         int contaux;
         float aux1, aux2; //Variaveis axuiliares recebem  o valor da nota.
         int aux3,aux4;    // Variaveis auxiliares recebem a posição que está a nota acima referida.


          aux1= nota[0][0]; //Recebendo o valor do primeiro elemento do vetor.
          aux2= nota[1][0];
          for(contaux=0; contaux<contcoluna;contaux++) // Compara os elementos no vetor para a primeira prova.
          {
            if(nota[0][contaux]>=aux1)
            {
            aux1=nota[0][contaux];
            aux3=contaux;
            }
          }
          for(contaux=0; contaux<contcoluna;contaux++){ // Para a segunda prova *Fiz com dois ''fors'' para facilitar a visualização.
            if(nota[1][contaux]>=aux2)
            {
            aux2=nota[1][contaux];
            aux4=contaux;
            }
        }
            printf("A maior nota na P1 eh: %.2f do aluno %d\n", aux1, aux3+1); //Impressão dos resultados obtidos.
            printf("A maior nota na P2 eh: %.2f do aluno %d\n", aux2,aux4+1);


        }


      int  main(){
            int contcoluna=0; //Contador para coluna.
            int opcao=0;  // Variavel de seleção.
            float nota[2][qntalunos]; //Matriz contendo as notas.
        printf("\t\t\tControle de notas\n"); //Menu
        printf("\t\t\t-----------------\n");
        printf("\t<1>-Adiciona notas para um aluno\n");
        printf("\t<2>-Lista todas as notas e medias\n");
        printf("\t<3>-Lista a maior nota na prova 1 e na prova 2  \n");
        printf("\t<4>-Sai do programa.\n");




              while(opcao !=1 || opcao!=2||opcao!=3||opcao!=4){ //Laço de verificação para as opções disponiveis.
                printf("\tDigite a opcao desejada:");
                fflush(stdin); //Limpa o buffer do teclado.
                scanf("%d",&opcao);
                switch(opcao){ //Switch chama as funções de acordo com a opção escolhida.
    case 1:
        {
            if(adnota(nota, contcoluna))
            contcoluna++; // Caso aja espaço no vetor passa para a próxima seleção.
            else{
            contcoluna+=0; // Caso contrario o contador de coluna recebe 0 para evitar que abram espaços adicionais na hora da listagem.
            }
            opcao=0; //Zera a variavel de seleção.
            break;
        }


    case 2:
        {
            listanota(nota,contcoluna);
            opcao=0;
            break;
        }
    case 3:
        {
            listamaioresnotas(nota,contcoluna);
            opcao=0;
            break;
        }
    case 4:
        {
            printf("Fim do programa, digite qualquer tecla para encerrar!\n");
            getch(); //Encerra a função.
            return 0;
            break;
        }
    default:
        {
            opcao=0;
            printf("Opcao invalida, digite novamente!\n");
            break;


        }
        }
        }
        }
Aceito sugestões pra melhorar, meu professor sempre pega no pé:haha:
 

Users who are viewing this thread

Voltar
Topo