Não aceitar inteiro que começe com 0

1. Não aceitar inteiro que começe com 0

Paulo Rogerio Franca
Toshiro

(usa Outra)

Enviado em 21/05/2013 - 17:38h

pessoal tou com um problema, e nao tenho uma noçao de como fazer isso !
o professor da minha faculdade pediu pra criarmos um programa em C que Cadastre, Liste, Delete e Modifique.

E o problema está na hora que faz o cadastro, que pede o NOME e o CNPJ, eu digito eles e quando vou listar, o CNPJ está com outro valor !
não sei o que faço pra ele ler o valor real do que eu digitei no teclado, alguem tem uma soluçao ?
ja procurei pelo google e nada ...


Obrigado pela atençao !



  


2. Re: Não aceitar inteiro que começe com 0

Estefanio Brunhara
stefaniobrunhara

(usa CentOS)

Enviado em 21/05/2013 - 19:30h

Provavelmente você esta usando a tipagem da variável de forma errada.

posta o trecho do código.



3. Re: Não aceitar inteiro que começe com 0

Uilian Ries
uilianries

(usa Linux Mint)

Enviado em 22/05/2013 - 08:06h

Tipagem errada é um grande vilão pra essa história.

Estas descarregando o buffer de entrada antes de capturar do teclado?
Pode ter lixo no buffer.

Funções como fflush, fpurge e __fpurge são utilizadas para descarga do buffer.


4. Re: Não aceitar inteiro que começe com 0

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 22/05/2013 - 08:22h

Olá.

CPF tem 11 dígitos. É um número bem grande.

Se não tiver que fazer nenhum tipo de verificação no CPF (algoritmos matemáticos), você pode usar uma string, fica bem mais simples.


char cpf[12];

scanf ( "%s", cpf);


Ou se quiser usar números, um double também serve.


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

int main ( void )
{
double cpf;

scanf ( "%lf", &cpf );

printf ( "%.0lf\n", cpf );

return 0;
}


Qualquer coisa posta denovo,
Enzo Ferber
[]'s


5. Re: Não aceitar inteiro que começe com 0

Paulo Rogerio Franca
Toshiro

(usa Outra)

Enviado em 23/05/2013 - 10:56h

Turma da uma ajuda por favor tou com um problema na parte de Alteras produtos, eu consigo cadastralo mostrar o código e a quantidade no estoque certa, mais na hora que eu altero e vou listalo, ele aparece como se fosse o numero da memoria ! por favor me ajudem o mais rapido possivel

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

typedef struct cadastro{
char nome[40];
unsigned long int cnpj;
struct cadastro* prox;
}Cliente;

typedef struct produto{
char nomeProd[40];
unsigned long int codigo;
int qtdestoque;
struct produto* prox;
}Prod;

// ============================== Declaração de funções para o cadastro de Clientes ======================================== //
Cliente* inserir_cadastro(Cliente* primeiro);
void listar_cadastro(Cliente* primeiro);
Cliente* excluir_cadastro(Cliente* primeiro);
void alterar_cadastro(Cliente* primeiro);
// ========================================================================================================================= //

// ============================== Declaração de funções para o cadastro de Produtos ======================================== //
Prod* inserir_produto(Prod* primeiroProd);
void listar_produto(Prod* primeiroProd);
Prod* excluir_produto(Prod* primeiroProd);
void alterar_produto(Prod* primeiroProd);
// ========================================================================================================================= //

main()
{ //Declaração de variáveis
Cliente *primeiro= NULL;
Prod *primeiroProd= NULL;
int opcao;

//Artifício para repetir o programa.
while(opcao!=0)
{
//Menu de opcoes
printf(" %c----------------------------------------------------------------------------%c\n",201,187);
printf(" | ");printf("\t\t\t CADASTRO DE RESTAURANTES");printf("\t\t\t |\n");
printf(" %c----------------------------------------------------------------------------%c\n",200,188);
printf("\t %c----------%c\t\t\t\t ",201,187);
printf("\t\t\t | MENU ");printf("|\t\t\t\t \n");
printf(" %c-----------%c----------%c------------%c \n",201,200,188,187);
printf(" | <1> Novo Cadastro |\n");
printf(" |-----------------------------------|\n");
printf(" | <2> Listar Cadastro |\n");
printf(" |-----------------------------------|\n");
printf(" | <3> Excluir Cadastro |\n");
printf(" |-----------------------------------|\n");
printf(" | <4> Alterar Cadastro |\n");
printf(" |-----------------------------------|\n");
printf(" | <5> Novo Produto |\n");
printf(" |-----------------------------------|\n");
printf(" | <6> Listar Produto |\n");
printf(" |-----------------------------------|\n");
printf(" | <7> Excluir Produto |\n");
printf(" |-----------------------------------|\n");
printf(" | <8> Alterar Produto |\n");
printf(" |-----------------------------------|\n");
printf(" | <0> Sair |\n");
printf(" %c-----------------------------------%c",200,188);
printf("\n\n\n\n");

//Lendo a opcao do menu
scanf("%u",&opcao);
fflush(stdin);

//Menu de opcoes
switch(opcao)
{
case 1:
//Inserindo os Cadastros
fflush(stdin);
system("cls");
printf(" %c----------------------------------------------------------------------------%c\n",201,187);
printf(" | ");printf("\t\t\t NOVO CADASTRO ");printf("\t\t\t |\n");
printf(" %c----------------------------------------------------------------------------%c\n",200,188);
primeiro= inserir_cadastro(primeiro);
getch();
system("cls");
break;

case 2:
//Listando os Cadastros.
system ("cls");
printf(" %c----------------------------------------------------------------------------%c\n",201,187);
printf(" | ");printf("\t\t\t RESTAURANTES CADASTRADOS");printf("\t\t\t |\n");
printf(" %c----------------------------------------------------------------------------%c\n",200,188);
listar_cadastro(primeiro);
getch();
system("cls");
break;

case 3:
//Excluindo Cadastro da lista.
system ("cls");
printf(" %c----------------------------------------------------------------------------%c\n",201,187);
printf(" | ");printf("\t\t\t EXCLUIR CADASTROS");printf("\t\t\t |\n");
printf(" %c----------------------------------------------------------------------------%c\n",200,188);
primeiro= excluir_cadastro(primeiro);
getch();
system("cls");
break;

case 4:
//Alterando Cadastro da lista.
system ("cls");
printf(" %c----------------------------------------------------------------------------%c\n",201,187);
printf(" | ");printf("\t\t\t ALTERAR CADASTRADOS");printf("\t\t\t |\n");
printf(" %c----------------------------------------------------------------------------%c\n",200,188);
alterar_cadastro(primeiro);
getch();
system("cls");
break;

case 5:
//Inserindo os Produtos.
fflush(stdin);
system("cls");
printf(" %c----------------------------------------------------------------------------%c\n",201,187);
printf(" | ");printf("\t\t\t NOVO PRODUTO ");printf("\t\t\t |\n");
printf(" %c----------------------------------------------------------------------------%c\n",200,188);
primeiroProd= inserir_produto(primeiroProd);
getch();
system("cls");
break;

case 6:
//Listando os produtos.
system ("cls");
printf(" %c----------------------------------------------------------------------------%c\n",201,187);
printf(" | ");printf("\t\t\t PRODUTOS CADASTRADOS");printf("\t\t\t |\n");
printf(" %c----------------------------------------------------------------------------%c\n",200,188);
listar_produto(primeiroProd);
getch();
system("cls");
break;

case 7:
//Excluindo produtos da lista.
system ("cls");
printf(" %c----------------------------------------------------------------------------%c\n",201,187);
printf(" | ");printf("\t\t\t EXCLUIR PRODUTOS");printf("\t\t\t |\n");
printf(" %c----------------------------------------------------------------------------%c\n",200,188);
primeiroProd= excluir_produto(primeiroProd);
getch();
system("cls");
break;

case 8:
//Alterando Produtos da lista.
system ("cls");
printf(" %c----------------------------------------------------------------------------%c\n",201,187);
printf(" | ");printf("\t\t\t ALTERAR PRODUTOS ");printf("\t\t |");
printf(" %c----------------------------------------------------------------------------%c \n",200,188);
alterar_produto(primeiroProd);
getch();
system("cls");
break;
case 0:
//Se digitar 0 irá fechar o programa
opcao==0;
break;

default:
// Se o usuario digitar algo do teclado nao correspondente a o menu, não irá sair dele!
system("cls");
break;
}
}
}

// +++++++++++++++++++++++++++++++++++++++++ CADASTRO DE CLIENTES ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //


Cliente* inserir_cadastro (Cliente *primeiro){
Cliente cadastro;
Cliente *atual= primeiro;
int verificador;
char identificador= 'F';

// Ler as informaçoes do cliente
printf(" Nome: ");
fflush(stdin);
fflush (stdin); fgets(cadastro.nome, 40, stdin); printf ("\n");
printf(" CNPJ: ",162);
fflush(stdin);
scanf("%u",&cadastro.cnpj);printf ("\n");

//verifica se o cliente já existe
for(atual=primeiro; atual!=NULL; atual=atual->prox){
if(atual->cnpj==cadastro.cnpj){
identificador= 'V';
break;
}
}

if(identificador!='V' && (strlen(cadastro.nome)!=1) ) {
//Alocando os espaços e guardando as informações do Cadastro.
Cliente* NovoCadastro=(Cliente*) malloc (sizeof(Cliente));
strcpy(NovoCadastro->nome, cadastro.nome);
NovoCadastro->cnpj= cadastro.cnpj;
NovoCadastro->prox= primeiro;
printf(" Cadastro realizado com sucesso.");
printf("\n\n PRESSIONE QUALQUER TECLA PARA VOLTAR AO MENU PRINCIPAL.");
return NovoCadastro;
}else{
printf(" Cadastro invalido.",160);
printf("\n\n PRESSIONE QUALQUER TECLA PARA VOLTAR AO MENU PRINCIPAL.");
return primeiro;
}
}

void listar_cadastro (Cliente* primeiro){
Cliente* atual; //Ponteiro para percorrer a lista sem perder a referência do primeiro da lista.

//Imprime todos os clientes da lista
for(atual= primeiro ; atual!= NULL; atual= atual->prox){
printf("\n NOME: ");
printf("%s", atual->nome);
printf("\n CNPJ: ",162 );
printf("%u", atual->cnpj);
printf("\n\n");
}
if(primeiro==NULL)
printf(" Nenhum cadastrado feito.");
printf("\n\n PRESSIONE QUALQUER TECLA PARA VOLTAR AO MENU PRINCIPAL.");
}

Cliente* excluir_cadastro(Cliente *primeiro){

Cliente *anterior= NULL;//Ponteiro para saber o elemento anterior ao elemento atual da lista.
Cliente *atual= primeiro;//Ponteiro para percorrer a lista sem perder o primeiro elemento da lista.
unsigned long int cnpj=0;

//Ler o Cnpj a ser exlcuido.
printf(" Cnpj do Cadastro a ser exclu%cdo: ", 162,161);
fflush(stdin);
scanf("%u",&cnpj);

//Procurando o cnpj na lista.
while(atual!= NULL && atual->cnpj!=cnpj){
anterior= atual;
atual= atual->prox;
}

//Mensagem de aviso caso o cnpj não exista ou não seja encontrado.
if(atual==NULL){
printf("\n CNPJ nao encontrado.", 198);
printf("\n\n PRESSIONE QUALQUER TECLA PARA VOLTAR AO MENU PRINCIPAL.");
return primeiro;
}

//Serve para exlcuir o primeiro da lista
if(anterior==NULL){
printf("\n Cnpj excluido com sucesso.", 163,161);
primeiro= atual->prox;
//Excluiu o que está no meio da lista .
}else{
printf("\n Cnpj excluido com sucesso.", 163,161);
anterior->prox= atual->prox;
}

//liberando espaço da memoria
free(atual);
printf("\n\n PRESSIONE QUALQUER TECLA PARA VOLTAR AO MENU PRINCIPAL.");
return primeiro;
}


void alterar_cadastro(Cliente* primeiro){
char nome_substituto[40];
int cnpj_substituto;
unsigned long int buscaCnpj;
Cliente* atual=primeiro;

//Requisitando e lendo o código do Cadastro a ser alterado.
printf(" Cnpj do Cadastro a ser alterado: ", 162);
fflush(stdin);
scanf("%u",&buscaCnpj);

//Procurando o Cadastro na lista.
while(atual!= NULL && atual->cnpj!= buscaCnpj){
atual= atual->prox;
}

//Alterando os dados do Cadastro.
if(atual!=NULL){
printf("\n Novo nome: ");
fflush (stdin); fgets(nome_substituto, 40, stdin);
strcpy(atual->nome,nome_substituto);
printf("\n Novo CNPJ ");
scanf("%u",&cnpj_substituto);printf ("\n");
atual->cnpj = cnpj_substituto;
printf(" Dados alterados com sucesso.");
}else{
printf("\n Cadastro nao encontrado.",198);
}
printf("\n\n\n PRESSIONE QUALQUER TECLA PARA VOLTAR AO MENU PRINCIPAL.");


}
// +++++++++++++++++++++++++++++++++++++++++ FIM CADASTRO DE CLIENTES +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //

// +++++++++++++++++++++++++++++++++++++++++ CADASTRO DE PRODUTOS ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //


Prod* inserir_produto (Prod *primeiroProd){
Prod produto;
Prod *atual= primeiroProd;
char identificador= 'F';

//Lendo as informações do produto.
printf(" Nome do Produto: ");
fflush(stdin);
fflush (stdin); fgets(produto.nomeProd, 40, stdin); printf ("\n");
printf(" Código do Produto: ",162);
fflush(stdin);
scanf("%u",&produto.codigo);printf ("\n");
printf(" Quantidade do Produto em estoque: ",162);
fflush(stdin);
scanf("%u",&produto.qtdestoque);printf ("\n");

//Verificando se o Produto existe
for(atual=primeiroProd; atual!=NULL; atual=atual->prox){
if(atual->codigo==produto.codigo){
identificador= 'V';
break;
}
}

if(identificador!='V' && (strlen(produto.nomeProd)!=1) && produto.qtdestoque !=1 ) {
//Alocando os espaços e guardando as informações do Produto.
Prod* NovoProduto=(Prod*) malloc (sizeof(Prod));
strcpy(NovoProduto->nomeProd, produto.nomeProd);
NovoProduto->codigo= produto.codigo;
NovoProduto->qtdestoque= produto.qtdestoque;
NovoProduto->prox= primeiroProd;
printf(" Produto cadastrado com sucesso.");
printf("\n\n PRESSIONE QUALQUER TECLA PARA VOLTAR AO MENU PRINCIPAL.");
return NovoProduto;
}else{
printf(" Produto invalido.",160);
printf("\n\n PRESSIONE QUALQUER TECLA PARA VOLTAR AO MENU PRINCIPAL.");
return primeiroProd;
}
}

void listar_produto (Prod* primeiroProd){
Prod* atual;//Ponteiro para percorrer a lista sem perder a referência do primeiro elemento da lista.

for(atual= primeiroProd ; atual!= NULL; atual= atual->prox){//Imprimindo os Produtos da lista, e suas repectivas informações.
printf("\n Nome do Produto: ");
printf("%s", atual->nomeProd);
printf("\n Codigo do Produto: ",162 );
printf("%u", atual->codigo);
printf("\n\n Quant.estoque:",162 );
printf("%u", atual->qtdestoque);
printf("\n\n");
}
if(primeiroProd==NULL)
printf(" Nenhum Produtos no registro ainda feito.");
printf("\n\n PRESSIONE QUALQUER TECLA PARA VOLTAR AO MENU PRINCIPAL.");
}

Prod* excluir_produto(Prod* primeiroProd){

Prod *anterior= NULL;//Ponteiro para saber o elemento anterior ao elemento atual da lista.
Prod *atual= primeiroProd;//Ponteiro para percorrer a lista sem perder o primeiro elemento da lista.
int codigo=0;

//Solicitando e lendo o Codigo do Produto a ser excluído.
printf(" Inserir o Codigo do Produto a ser excluido: ");
fflush(stdin);
scanf("%u",&codigo);

//Procurando o Produto na lista.
while(atual!= NULL && atual->codigo!=codigo){
anterior= atual;
atual= atual->prox;
}

//Mostrará mensagem caso o Produto não seja encontrado.
if(atual==NULL){
printf("\n Codigo nao encontrado.", 198);
printf("\n\n PRESSIONE QUALQUER TECLA PARA VOLTAR AO MENU PRINCIPAL.");
return primeiroProd;
}

//Excluindo o primeiro Produto da lista.
if(anterior==NULL){
printf("\n Codigo excluido com sucesso.", 163,161);
primeiroProd= atual->prox;
//Excluindo o produto do meio da lista.
}else{
printf("\n Codigo excluido com sucesso.", 163,161);
anterior->prox= atual->prox;
}

//liberando o espaço da memória.
free(atual);
printf("\n\n PRESSIONE QUALQUER TECLA PARA VOLTAR AO MENU PRINCIPAL.");
return primeiroProd;
}

//Função para alterar Produto.
void alterar_produto(Prod* primeiroProd){
char nomeProd_substituto[40];
int codigo_substituto;
int qtdestoque_substituto;
unsigned long int buscaCodigo;
Prod* atual=primeiroProd;

//solicitnado e lendo o código do Produto a ser alterado.
printf(" Codigo do produto a ser alterado: ", 162);
fflush(stdin);
scanf("%u",&buscaCodigo);

//Procurando o Produto na lista.
while(atual!= NULL && atual->codigo!=buscaCodigo){
atual= atual->prox;
}

//Alterando os dados do Produto;
if(atual!=NULL){

for(atual= primeiroProd ; atual!= NULL; atual= atual->prox){
printf("\n Nome do Produto: ");
printf("%s", atual->nomeProd);
printf("\n Codigo do Produto: ",162 );
printf("%u", atual->codigo);
printf("\n\n Quant.estoque:",162 );
printf("%u", atual->qtdestoque);
printf("\n\n");
printf("\n\n");
system("pause");
system("cls");

printf("\n Novo nome do produto: ");
fflush (stdin); fgets(nomeProd_substituto, 40, stdin);
strcpy(atual->nomeProd,nomeProd_substituto);
printf("\n Novo Codigo: ");
fflush (stdin);
scanf("%u",&codigo_substituto);
atual->codigo = codigo_substituto;
printf("\n Quantidade atual no estoque: ");
fflush (stdin);
scanf("u%",&qtdestoque_substituto);printf ("\n");
atual->qtdestoque = qtdestoque_substituto;

printf(" Dados alterados com sucesso.");

}}else{
printf("\n Produto nao encontrado.",198);
}
printf("\n\n\n PRESSIONE QUALQUER TECLA PARA VOLTAR AO MENU PRINCIPAL.");
return(main);

}
// +++++++++++++++++++++++++++++++++++++++++ FIM DE PRODUTOS ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //









6. Re: Não aceitar inteiro que começe com 0

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 23/05/2013 - 12:30h

Além de muitas warnings, a função de alterar os produtos está com alguns erros.


//Função para alterar Produto.
void alterar_produto(Prod* primeiroProd){
char nomeProd_substituto[40];
int codigo_substituto;
int qtdestoque_substituto;
unsigned long int buscaCodigo;
Prod* atual=primeiroProd;

//solicitnado e lendo o código do Produto a ser alterado.
printf(" Codigo do produto a ser alterado: ", 162);
fflush(stdin);
scanf("%u",&buscaCodigo);

//Procurando o Produto na lista.
while(atual!= NULL && atual->codigo!=buscaCodigo){
atual= atual->prox;
}

//Alterando os dados do Produto;
if(atual!=NULL){

printf("\n Nome do Produto: ");
printf("%s", atual->nomeProd);
printf("\n Codigo do Produto: ",162 );
printf("%u", atual->codigo);
printf("\n\n Quant.estoque:",162 );
printf("%u", atual->qtdestoque);
printf("\n\n");
printf("\n\n");
system("clear");

printf("\n Novo nome do produto: ");
fflush (stdin); fgets(nomeProd_substituto, 40, stdin);
strcpy(atual->nomeProd,nomeProd_substituto);
printf("\n Novo Codigo: ");
fflush (stdin);
scanf("%u",&codigo_substituto);
atual->codigo = codigo_substituto;
printf("\n Quantidade atual no estoque: ");
fflush (stdin);
scanf("%d",&qtdestoque_substituto);printf ("\n");
atual->qtdestoque = qtdestoque_substituto;

printf(" Dados alterados com sucesso.");

}else{
printf("\n Produto nao encontrado.",198);
}
printf("\n\n\n PRESSIONE QUALQUER TECLA PARA VOLTAR AO MENU PRINCIPAL.");
return(main);

}


E também retirei o for() que você tinha colocado. Esse for fazia com que você tivesse que alterar todos os produtos cadastrados a partir do produto que você quer editar. Mais aqui imprimiu nada de endereço de memória.

O erro que vi na impressão dos produtos depois de alterados foi a quantidade, que não ficava certa (ficava como ZERO).

Copia tudo que aparece no console quando dá o erro aí. Não consegui reproduzir aqui o erro que você tá tendo aí.

Outra coisa. Dá uma limpada no programa, identa ele, tira os warnings todos. Tá complicado de ler esse código seu. E quando for postar códigos aqui no VoL, coloque as tags [ code] e [ /code] antes e depois do seu código, facilita ainda mais a leitura. ;)

Posta denovo aí os resultados,

Enzo Ferber
[]'s


7. Re: Não aceitar inteiro que começe com 0

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 23/05/2013 - 14:36h

Aqui vai um script simples pra você identar seu código:


// indenter.c

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

int parse ( char *line )
{
register int i, tabs = 0;

for ( i = 0; i < strlen (line ); i++ )
{
if ( line[i] == '{' ) tabs++;
if ( line[i] == '}' ) tabs--;
}

return tabs;
}

int main ( int argc, char *argv[] )
{
FILE *fp;
int tabs = 0, i, ret;
char line[256];

fp = fopen ( argv[1], "rw" );

if ( !fp )
{
perror ( "fopen" );
return EXIT_FAILURE;
}

while ( !feof(fp) )
{
fgets ( line, 256, fp );

ret = parse ( line );
if ( ret < 0 )
{
tabs += ret;
for (i = 0; i < tabs; i++ )
printf ( "\t" );
}
else
{
for ( i = 0; i < tabs; i++ )
printf ( "\t" );

tabs += ret;
}

printf ( "%s", line );
memset ( line, 0x0, 256 );
}

return 0;
}


Só compilar e chamar pela linha de comando assim:


$ indent arquivo.c | dd of="arquivoI.c"


Isso no linux. Já no Windows não sei se funciona redirecionamento no DOS. Mais você pode tentar:


C:/> indent arquivo.c > arquivoI.c


[]'s






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts