Ir para conteúdo
Fórum Script Brasil
  • 0

Problemas com Scanf


WEBROGER

Pergunta

Caros amigos,

Me socorram por favor!

Preciso entregar este trabalho ate sexta feira na faculdade.

Estou tendo alguns problemas na hora da execuçao do meu código.

Ele compila certinho mas na hora de inserir alguns dados como idade e salario ele dá pau.

Gostaria que rodassem o programa e me dessem uma luz de como faco para resolver.

Segue o código do programa

/*

Escrever um programa que faca o controle das informações relativas aos funcionários

da Empresa Louzada & Louzada S/A

O programa deve implementar as principais atividades relativas a este controle,

tis como:

1)Registro de um novo funcionário (numero máximo de funcionários é 50);

2)Remoção de um funcionario

3) Alteração de alguma informação(nome,salário,cargo ocupado);

4) Resposta a diversas consultas

*/

#include<stdio.h>

#include<conio.h>

#include<string.h>

#define MAX 2

/* Estrutra para armazenar a ficha do funcionario*/

struct cadastro

{

int cod; /* Código do funcionario*/

char nome[50]; /* Nome do funcionario*/

float salario; /* Salario do funcionario*/

char cargo[30]; /* Cargo do funcionario*/

int idade; /* idade do funcionario*/

char sexo[2]; /* Sexo do funcionario (M)- Masculino e (F)- Feminino*/

};

struct cadastro funcionario[MAX];

int topo;

void inserir();

void excluir();

void listar();

void pesquisar();

void alterar();

/* Programa Principal*/

int main()

{

int opcao;

char seguir = 's';

topo = 0;

while(seguir == 's')

{

printf(" *** Cadastro de Funcionários *** \n\n");

printf(" 1) NOVO \n");

printf(" 2) REMOVER \n");

printf(" 3) LISTAR \n");

printf(" 4) PESQUISAR \n");

printf(" 5) ALTERAR \n\n");

printf(" Digite sua opcao: ");

scanf("%d%*c",&opcao);

printf("\n");

switch(opcao)

{

case 1:

{

printf(" INSERINDO NOVO REGISTRO \n\n");

if(topo < MAX)

{

inserir();

printf(" DADO INSERIDO COM SUCESSO!\n\n");

}

else

{

printf(" Desculpe, Sitema de Cadastro esta no limite!\n\n");

}

break;

}

case 2:

{

if(topo == 0)

{

printf("não há dados para serem excluidos!\n\n");

}

else

{

excluir();

printf(" DADO EXCLUIDO COM SUCESSO!\n\n");

}

break;

}

case 3:

{

if(topo == 0)

{

printf("não há dados no sistema!\n\n");

}

else

{

printf(" Listando os Funcionarios cadastrados\n\n");

listar();

}

break;

}

case 4:

{

if(topo == 0)

{

printf("não há dados no sistema!\n\n");

}

else

{

printf(" PESQUIZANDO DADO\n\n");

pesquisar();

}

break;

}

case 5:

{

if(topo == 0)

{

printf("não há dados no sistema!\n\n");

}

else

{

printf(" ALTERARANDO DADOS!\n\n");

alterar();

printf(" DADOS ALTERADOS COM SUCESSO!\n\n");

}

break;

}

default:

printf(" ( OPCAO INVALIDA! )\n\n");

}

printf(" CONTINUAR?(S/N) ");

scanf("%c",&seguir);

printf("\n");

}

getch();

return 0;

}

/* Funcao para inserir registros*/

void inserir()

{

funcionario[topo].cod = topo+1;

printf(" CODIGO : %d\n",funcionario[topo].cod);

printf(" NOME: ");

fgets(funcionario[topo].nome,50,stdin);

funcionario[topo].nome[strlen(funcionario[topo].nome)-1] = '';

printf(" SALARIO: ");

scanf("%f", &funcionario[topo].salario);

printf(" CARGO: ");

fgets(funcionario[topo].cargo,30,stdin);

funcionario[topo].cargo[strlen(funcionario[topo].cargo)-1] = '';

printf(" IDADE: ");

scanf("%d", &funcionario[topo].idade);

printf(" SEXO: ");

fgets(funcionario[topo].sexo,2,stdin);

funcionario[topo].sexo[strlen(funcionario[topo].sexo)-1] = '';

printf("\n");

topo = topo + 1;

}

/*Função para excluir um funcionario do Sistema*/

void excluir()

{

topo = topo - 1;

}

/*Função para listar os funcionarios cadastrados no Sistema*/

void listar()

{

int i;

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

{

printf(" ARQUIVO %d\n",(i+1));

printf(" CODIGO: %d",funcionario.cod);

printf(" NOME: %s",funcionario.nome);

printf(" SALARIO: %f",funcionario.salario);

printf(" CARGO: %s",funcionario.cargo);

printf(" IDADE: %d",funcionario.idade);

printf(" SEXO: %s",funcionario.sexo);

printf("\n\n");

}

}

/*Função para alterar os funcionarios cadastrados no Sistema*/

void alterar()

{

int i,dado,cont = 0;

printf(" ATENCAO! PARA ALTERAR UM REGISTRO \n");

printf(" EFETUE UMA PESQUIZA PELO SEU CODIGO. \n\n");

printf(" CODIGO DO REGISTRO: ");

scanf("%d%*c",&dado);

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

{

if(dado == funcionario.cod)

{

cont = cont + 1;

printf(" NOME: ");

fgets(funcionario[topo].nome,50,stdin);

funcionario[topo].nome[strlen(funcionario[topo].nome)-1] = '';

printf(" SALARIO: ");

scanf("%f",funcionario[topo].salario);

printf(" CARGO: ");

fgets(funcionario[topo].cargo,30,stdin);

funcionario[topo].cargo[strlen(funcionario[topo].cargo)-1] = '';

printf(" IDADE: ");

scanf("%d",funcionario[topo].idade);

printf(" SEXO: ");

gets(funcionario[topo].sexo);

}

}

if(cont == 0)

{

printf(" DADO não ENCONTRADO!\n\n");

}

}

/*Função para pesquisar dados cadastrados no Sistema*/

void pesquisar()

{

int i,dado,cont = 0;

printf(" PESQUIZA POR CODIGO: ");

scanf("%d%*c",&dado);

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

{

if(dado == funcionario.cod)

{

printf("Dado Encontrado \n\n");

printf(" CODIGO: %d",funcionario.cod);

printf(" NOME: %s",funcionario.nome);

printf(" SALARIO: %f",funcionario.salario);

printf(" CARGO: %s",funcionario.cargo);

printf(" IDADE: %d",funcionario.idade);

printf(" SEXO: %s",funcionario.sexo);

printf("\n");

cont = cont + 1;

}

}

if(cont == 0)

{

printf(" Registro não Encontrado!\n\n");

}

}

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0

mesmo sendo um array você ainda tem q passar o endereco com o & não??

porque o endereco q você quer pegar é da propriedade e não da sctruct. assim:

scanf("%f", &funcionario[topo].salario);

otra coisa, porque você ta pegando o indice a partir do topo?? não era pra ser a partir do i??

otra coisa, quando for postar codigo aqui no forum, ponha sempre dentro da tag CODE. exemplo:

[c.o.d.e]

isso é codigo

[/c.o.d.e]

só q sem os pontos. senao fica dificil de ler o codigo, ele perde a tabulacao e tdo.

Link para o comentário
Compartilhar em outros sites

  • 0

Prezado kuroi,

Você rodou o código para ver a pala que está rolando?

Vou colocar o código dentro das tags. veja se entende melhor!

/*
 Escrever um programa que faca o controle das informações relativas aos funcionários
da Empresa Louzada & Louzada S/A
O programa deve implementar as principais atividades relativas a este controle,
tis como:

1)Registro de um novo funcionário (numero máximo de funcionários é 50);

2)Remoção de um funcionario

3) Alteração de alguma informação(nome,salário,cargo ocupado);

4) Resposta a diversas consultas

*/

#include<stdio.h>
#include<conio.h>
#include<string.h>
#define MAX 2

/* Estrutra para armazenar a ficha do funcionario*/

struct cadastro
{
     int cod; /* Código do funcionario*/ 
     char nome[50]; /* Nome do funcionario*/ 
     float salario; /* Salario do funcionario*/      
     char cargo[30]; /* Cargo do funcionario*/
     int idade; /* idade do funcionario*/
     char sexo[2]; /* Sexo do funcionario (M)- Masculino e (F)- Feminino*/
};

struct cadastro funcionario[MAX];
int topo;
void inserir();
void excluir();
void listar();
void pesquisar();
void alterar();

/* Programa Principal*/

int main()
{
      int opcao;
      char seguir = 's';
      
      topo = 0;
      
      while(seguir == 's')
      {
      printf("    *** Cadastro de Funcionários *** \n\n");
      printf("        1) NOVO \n");
      printf("        2) REMOVER \n");
      printf("        3) LISTAR \n");
      printf("        4) PESQUISAR \n");
      printf("        5) ALTERAR \n\n");
      printf(" Digite sua opcao: ");
      scanf("%d%*c",&opcao);
      printf("\n");
      
      
      switch(opcao)
      {
        case 1:
             {
               printf(" INSERINDO NOVO REGISTRO \n\n");
               if(topo < MAX)
               {
                 inserir();
                 printf(" DADO INSERIDO COM SUCESSO!\n\n");
               }
               else
               {
                 printf(" Desculpe, Sitema de Cadastro esta no limite!\n\n");
               }
               break;
             }
               
        case 2:
             {
               if(topo == 0)
               {
                 printf("não há dados para serem excluidos!\n\n");
               }
               else
               {
                 excluir();
                 printf(" DADO EXCLUIDO COM SUCESSO!\n\n");
               }
               break;
             }
        case 3:
             {
               if(topo == 0)
               {
                 printf("não há dados no sistema!\n\n");
               }
               else
               {
                 printf(" Listando os Funcionarios cadastrados\n\n");
                 listar();
               }
               break;
             }
        case 4:
             {
               if(topo == 0)
               {
                 printf("não há dados no sistema!\n\n");
               }
               else
               {   
                 printf(" PESQUIZANDO DADO\n\n");
                 pesquisar();
               }
               break;
             }
        case 5:
             {
               if(topo == 0)
               {
                 printf("não há dados no sistema!\n\n");
               }
               else
               {
                 printf(" ALTERARANDO DADOS!\n\n");
                 alterar();
                 printf(" DADOS ALTERADOS COM SUCESSO!\n\n");
               }
               break;
             }
        default:
               printf(" ( OPCAO INVALIDA! )\n\n");
                             
        
      }
      printf(" CONTINUAR?(S/N) ");
      scanf("%c",&seguir);
      
      printf("\n");
      }

getch();
return 0;

}

/* Funcao para inserir registros*/

void inserir()
{    
     funcionario[topo].cod = topo+1;
     printf(" CODIGO : %d\n",funcionario[topo].cod);
     
     printf(" NOME: ");
     fgets(funcionario[topo].nome,50,stdin);
     funcionario[topo].nome[strlen(funcionario[topo].nome)-1] = '';
    
     printf(" SALARIO: ");
     scanf("%f", &funcionario[topo].salario);
          
     printf(" CARGO: ");
     fgets(funcionario[topo].cargo,30,stdin);
     funcionario[topo].cargo[strlen(funcionario[topo].cargo)-1] = '';
    
     printf(" IDADE: ");
     scanf("%d", &funcionario[topo].idade);
          
     printf(" SEXO: ");
     fgets(funcionario[topo].sexo,2,stdin);
     funcionario[topo].sexo[strlen(funcionario[topo].sexo)-1] = '';
              
     printf("\n");
     
     topo = topo + 1;
}

/*Função para excluir um funcionario do Sistema*/

void excluir()
{
     topo  = topo - 1;
}

/*Função para listar os funcionarios cadastrados no Sistema*/

void listar()
{
     int i;
     
     for(i = 0;i < topo; i++)
     {
           printf(" ARQUIVO %d\n",(i+1));
           printf(" CODIGO: %d",funcionario[i].cod);
           printf(" NOME: %s",funcionario[i].nome);
           printf(" SALARIO: %f",funcionario[i].salario);           
           printf(" CARGO: %s",funcionario[i].cargo);
           printf(" IDADE: %d",funcionario[i].idade);
           printf(" SEXO: %s",funcionario[i].sexo);
           printf("\n\n");
     }
}

/*Função para alterar os funcionarios cadastrados no Sistema*/

void alterar()
{
     int i,dado,cont = 0;
     
     printf(" ATENCAO! PARA ALTERAR UM REGISTRO \n");
     printf(" EFETUE UMA PESQUIZA PELO SEU CODIGO. \n\n");
     printf(" CODIGO DO REGISTRO: ");
     scanf("%d%*c",&dado);
     for(i = 0;i < topo; i++)
     {
       if(dado == funcionario[i].cod)
       {
         cont = cont + 1;
                  
           printf(" NOME: ");
           fgets(funcionario[topo].nome,50,stdin);
           funcionario[topo].nome[strlen(funcionario[topo].nome)-1] = '';
    
           printf(" SALARIO: ");
          scanf("%f",funcionario[topo].salario);
          
          printf(" CARGO: ");
          fgets(funcionario[topo].cargo,30,stdin);
          funcionario[topo].cargo[strlen(funcionario[topo].cargo)-1] = '';
    
          printf(" IDADE: ");
          scanf("%d",funcionario[topo].idade);
     
          printf(" SEXO: ");
           gets(funcionario[topo].sexo);
         
       }
     }
     if(cont == 0)
     {
       printf(" DADO não ENCONTRADO!\n\n"); 
     }
}

/*Função para pesquisar dados cadastrados no Sistema*/
void pesquisar()
{
     int i,dado,cont = 0;
     printf(" PESQUIZA POR CODIGO: ");
     scanf("%d%*c",&dado);
     for(i = 0;i < topo; i++)
     {
       if(dado == funcionario[i].cod)
       {
          printf("Dado Encontrado \n\n");
          printf(" CODIGO: %d",funcionario[i].cod);
          printf(" NOME: %s",funcionario[i].nome);
          printf(" SALARIO: %f",funcionario[i].salario);           
          printf(" CARGO: %s",funcionario[i].cargo);
          printf(" IDADE: %d",funcionario[i].idade);
          printf(" SEXO: %s",funcionario[i].sexo);
          printf("\n");
         cont = cont + 1;
       }
     }
     if(cont == 0)
     {
       printf(" Registro não Encontrado!\n\n");
     }
}

Link para o comentário
Compartilhar em outros sites

  • 0

Aqui o compilar reclama (corretamente) desta construção:

funcionario[topo].cargo[strlen(funcionario[topo].cargo)-1] = '';
Em vez de um caractere NULO, insira um para definir o fim da string:
funcionario[topo].cargo[strlen(funcionario[topo].cargo)-1] = '';
Veja os Warnings que apareceram:
$ gcc -Wall teste.c -o teste teste.c: Na função ‘alterar’: teste.c:211: aviso: format ‘%f’ expects type ‘float *’, but argument 2 has type ‘double’ teste.c:218: aviso: format ‘%d’ expects type ‘int *’, but argument 2 has type ‘int’ /tmp/ccw3JqSl.o: In function `alterar': teste.c:(.text+0x9ac): warning: the `gets' function is dangerous and should not be used.
] Não use gets(). Use fgets() E faça um casting para fazer sumir os dois primeiros Warnings. O problema do scanf() é que o \n está ficando no buffer do teclado. Aí o próximo scanf pega o que ficou no buffer. Sempre limpe o buffer depois de ler algo com scanf(). Para fazer isso, use este código:
fflush(stdin);

Link para o comentário
Compartilhar em outros sites

  • 0

fflush() não funciona em Linux. Uso __fpurge()

Citei fflush() pois li uma vez que funciona em Windows. Mas nunca testei.

Uma possibilidade é criar uma função própria, que vá lendo os caracteres enquanto houver conteúdo no buffer de teclado.

Parece gambiarra. Até conversei com meu professor sobre isso, mas não há outra forma de limpar o buffer a não ser lendo os caracteres.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...