Ir ao conteúdo
  • Cadastre-se

C Mesmo erro em dois programas diferentes


LuisGCarv

Posts recomendados

Sou iniciante na linguagem C e estou passando por uns maus bocados no momento que os meus programas entram em uma estrutura condicional ou laço de repetição.

O programa para de funcionar e vem aquela mensagem chata que o windows sempre dá quando encontra um erro, mas até agora eu não consegui identificar onde está o erro.

São programas simples, porque eu estou revendo apenas alguns conceitos que já aprendi. Precisa urgentemente da ajuda de vocês, porque estarei realizando provas nesse fim de semana e esses conceitos com certeza irão cair!

 

O erro só aparece nesse programa quando eu digito o segundo número do laço:

 

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <cstdlib>

int main (void)
{
    int num[5];
    int soma = 0;

    setlocale (LC_ALL, "portuguese");
    for (int i= 0; i <= 4 ; i++ )
    {
        printf ("\nDigite o %d ° número = ", i+1);
        scanf ("%d",num);
    }

    for (int i=0;i<=4;i++)
    {
        soma += num;
    }

    printf ("A soma dos 5 números é %d", soma);
    system ("pause");    
    return 0;    
}

 

Esse é mais complicado e dá erro logo que eu digito o número

 

#include <stdio.h>
#include <cstdlib>
#include <locale.h>
#include <conio.h>

int main (void)
{
    int c, num;

    setlocale(LC_ALL, "Portuguese");
    printf ("Digite um número = ");
    scanf ("%d",num);
    int cont = 1;

    for (c=2;c<=num;c++)
    {
         if (num % c != 0)
         {
               cont ++;
               if (cont == num)
              {         
                   printf ("\n%d é um número primo", num);
            }
        }
          else
          {        
              printf ("\nO número %d é múltiplo de %d", num , c);
              break;    
          }
        
    }    

    if (num % 2 == 1)
    {
        printf ("\nO número %d é impar!",num);    
    }    
    else
    {
        printf ("\nO número %d é par!",num);    
    }
    
    system ("pause");        
    return 0;        
    }

 

Link para o comentário
Compartilhar em outros sites

No primeiro programa:

 

cstdlib  - cabeçalhos sem o .h são usados pelo c++

 

Você criou um array de 5 elementos e nao usou os índices na entrada e nos loop for:  num

 

Int i =  0 é sintaxe do c89 se não me engano, criar a variável dentro do for so a partir do c99, no 89 você tem que criar a variável fora do for:

 

int i;

for (i= 0; i <= 4 ; i++ )

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

int main (void)
{
    int num[5];
    int soma = 0;
    int i;

    setlocale (LC_ALL, "portuguese");
    for (i= 0; i <= 4 ; i++ )
    {
        printf ("\nDigite o %d° número : ", i+1);
        scanf ("%d", &num[i]);
    }

    for (i=0;i<=4;i++)
    {
        soma += num[i];
    }

    printf ("A soma dos 5 números é %d\n", soma);
    system ("pause");    
    return 0;    
}

 

 

 

 

 

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

@VictorFreitasKing  e @erique , obrigado pelo esclarecimento .

Eu não acredito que esqueci esse conceito, já estou estudando ponteiros e já tinha aprendido que & direcionava ao endereço da variável.

@Benjamin Breeg , eu ainda não conhecia essas regras, muito obrigado pelas dicas!

Link para o comentário
Compartilhar em outros sites

1 hora atrás, LuisGCarv disse:

@VictorFreitasKing  e @erique , obrigado pelo esclarecimento .

Eu não acredito que esqueci esse conceito, já estou estudando ponteiros e já tinha aprendido que & direcionava ao endereço da variável.

@Benjamin Breeg , eu ainda não conhecia essas regras, muito obrigado pelas dicas!

 

uma dica, se dedica em ponteiros, quando você for estudar estruturas de dados é o que mais vai confundir...

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

9 horas atrás, VictorFreitasKing disse:

 

uma dica, se dedica em ponteiros, quando você for estudar estruturas de dados é o que mais vai confundir...

Valeu pela dica!

Uma dúvida que estou tendo é se tem como colocar um char pra definir as opções do switch/case.

E se é possível colocar um if/else dentro de um switch/case.

Link para o comentário
Compartilhar em outros sites

  • mês depois...
5 horas atrás, vangodp disse:

pegue aqui seu código para averiguar

o codigo é um pouco grande e eu percebi que coloquei um case dentro de outro, será que pode ser isso?

 

aqui a parte do código até o primeiro case.

int controlepag(void)
{
struct controle pagamento[100];
int a, b, c, fim, op, horas;
char o[5];

do 
{
printf ("Escolha uma opção \n");
printf ("\n");
printf ("1) Cadastrar um funcionário \n");
printf ("2) Verificar o cadastro de um funcionário \n");
printf ("3) Voltar ao menu anterior \n");
printf ("4) Encerrar o processo \n");
scanf ("%d",&op);
system ("cls");
switch(op)
{
case 1: 
	pagamento[a].codigo = a + 2001;
    printf ("Digite o nome do funcionário : \n");
    scanf (pagamento[a].nome);
    printf ("O código do funcionário é %d \n", pagamento[a].codigo);
    system ("pause");
    system ("cls");
    strcpy (o,"A");
    while (o!="D") 
	{
        printf ("Selecione um serviço que o funcionário realizou : \n");
        printf ("A) 1M \n");
        printf ("B) 2S \n");
        printf ("C) 3F \n");
        printf ("D) Encerrar cálculo de salário \n");
        scanf ("%s",&o);
        system ("cls");
        switch (o)
        {
        case "A" :
            printf ("Quantas horas o funcionário trabalhou nesse setor : \n");
            scanf ("%d",&horas);
            pagamento[a].salario += horas * 100;
            break;
        case "B" :
            printf ("Quantas horas o funcionário trabalhou nesse setor : \n");
            scanf ("%d",&horas);
            pagamento[a].salario += horas * 200;
            break;
        case "C" :
            printf ("Quantas horas o funcionário trabalhou nesse setor : \n");
            scanf ("%d",&horas);
            pagamento[a].salario += horas * 300;
            break;
        case "D" :
            printf ("Cálculo encerrado! \n");
            printf ("\n");
            system ("pause");
        	system ("cls");
            break;
        default :
            printf ("Opção inválida! Tente novamente. \n");
            printf ("\n");
            system ("pause");
        	system ("cls");
            break;
        }
		}    
        a += 1;        
        break;

O problema aparece no switch (o).

Link para o comentário
Compartilhar em outros sites

"A" é uma string e 'A' é um char. O case não funciona com strings somente com tipos básicos como int, chars, floats etc, fazer case "A": é errado, deveria ser case 'A':, com aspas simples.

scanf (pagamento[a].nome); deveria ser scanf ("%s", pagamento[a].nome); si se trata de uma string.

 

Em C não é permitido comparar strings diretamente, é preciso usar strcmp em while (o!="D") mas suponho que se trata de um erro e o deve ser um char e não uma string.

Em fim... são varios erros, repasse tudo o que aprendeu sobre chars, strings, e literais em C.

 

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

Em 30/10/2017 às 09:56, vangodp disse:

"A" é uma string e 'A' é um char. O case não funciona com strings somente com tipos básicos como int, chars, floats etc, fazer case "A": é errado, deveria ser case 'A':, com aspas simples.

scanf (pagamento[a].nome); deveria ser scanf ("%s", pagamento[a].nome); si se trata de uma string.

 

Em C não é permitido comparar strings diretamente, é preciso usar strcmp em while (o!="D") mas suponho que se trata de um erro e o deve ser um char e não uma string.

Em fim... são varios erros, repasse tudo o que aprendeu sobre chars, strings, e literais em C.

 

Eu acho que já consegui arrumar tudo. Como o case não aceita strings, quando eu digitava enter, estava entrando na opção de default, mas eu consegui resolver isso com alguns getchar (); .

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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...