Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

eversonwolf

Validação de dados

Recommended Posts

Não consigo fazer a validação de dados, preciso que o programa não aceite caracter(letras), só aceite números.

 

#include<stdio.h>
main()
{
int i,j,soma=0,soma1=0,buf;
int media_pri=0,media_sec=0;
int mat[2][2];
for(i=0 ; i<2 ; i++)
{

   	for(j=0; j<2; j++)

   	{
       	do{
       	printf("Digite um numero para a matriz[%d].:-->\t",i);
       	scanf("%d",&mat[i][j]);

   	// validação de dados
       	if(mat[i][j]<='a' && mat[i][j] >='z' || mat[i][j]<='A' && mat[i][j] >='Z')
       	{
           	printf("Caractere invalido\n\n");
       	}
       	}
       	while(mat[i][j]<='a' && mat[i][j] >='z' || mat[i][j]<='A' && mat[i][j] >='Z');

   	}
}

for(i=0 ; i<2 ; i++)
   	for(j=0; j<2; j++)

       	if(i==j)
       	{
           	soma=soma+mat[i][j];
           	media_pri=(float)soma/2;
           	printf("\nElementos da diagonal principal.:%d ",mat[i][j]);
       	}

printf("\n");
for(i=0 ; i<10 ; i++)
   	for(j=0; j<2; j++)
       	if (i==(1-j))
       	{
           	soma1=soma1+(mat[i][j]);
           	media_sec=(float)soma1/2;
           	printf("\nElementos da diagonal secundaria .:%d ",mat[i][j]);
       	}
printf("\n");
printf("\nMedia.:%d ",media_pri);
printf("\nMedia.:%d \n",media_sec);
	for(i=0 ; i<2 ; i++)
	{
   	for(j=0; j<2; j++)
   	{
       	printf("\t%d",mat[i][j]);
   	}
   	printf("\n");
	}
printf("\n");
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigão, isso aí é C. Você postou na área errada. Em breve um moderador irá mover o tópico para o fórum de C/C++.

Respondendo a sua dúvida, você pode fazer isso lendo as entradas do usuário como CARACTERES. Os números de 0 a 9 tem sua representação na tabela ASCII.

O caractere '0' corresponde ao nº 48 da tabela.

O caractere '9', logicamente, corresponde ao nº 57.

 

Para fazer isso, basta verificar se o caractere informado pelo usuário está entre esse limite:

char inputBuffer;
do {
printf("Digite um numero para a matriz[%d].:-->\t",i);
           scanf("%c",inputBuffer);
} while (inputBuffer < 48 || inputBuffer > 57);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

O que acontece é que os caracteres tem valores inteiros para serem representados internamente nos computadores. Existem vários tipos de codificação desses valores, e o mais usado para os consoles é o ASCII. Assim, você pode mostrar caracteres a partir de valores inteiros, como, por exemplo, o seguinte printf, que vai escrever "01" na tela.

 

printf("%c%c", (char) 48, (char) 49);

 

 

Assim, você pode escrever o seguinte no seu programa, caso o sistema de codificação de caracteres seja ASCII:

 

char ch;

printf("Insira um numero entre 0 e 9: ");
scanf(" %c", ch);

if(ch < (char) 48 || ch > (char) 57)
   printf("O valor que voce inseriu nao esta entre 0 e 9");

 

O problema desse código é que caso o sistema de codificação de caracteres que o usuário utilizar for outro que não o ASCII, o valor 48 vai significar outra coisa completamente diferente, como, por exemplo, sei lá, 'c'.

 

Então, como caracteres podem ser escritos como inteiros, podemos utilizar essa representação, mais portável, que funcionará desde que no sistema do computador do usuário os números estejam agrupados um atrás do outro.

 

char ch;

printf("Insira um numero entre 0 e 9: ");
scanf(" %c", ch);

if(ch < '0' || ch > '9')
   printf("O valor que voce inseriu nao esta entre 0 e 9");

 

 

Agora, se você quer um código que funcione em todos os computadores que tem os números de 0-9 (um exemplo que não teria seria um sistema de codificação de caracteres orientais), não importa sua organização:

 

char ch;

printf("Insira um numero entre 0 e 9: ");
scanf(" %c", ch);

if(ch != '0' && ch != '1' && ch != '2' && ch != '3' && ch != '4' && ch != '5' && ch != '6' && ch != '7' && ch != '8' && ch != '9')
   printf("O valor que voce inseriu nao esta entre 0 e 9");

 

 

Entendeu agora?

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ainda não estou acertando a validação.

A validação funciona, mas ao digitar um numero o programa executa duas linhas iguais e se digitar uma string ele valida e faz do mesmo jeito.

 

#include<stdio.h>
main()
{
   int i,j,soma=0,soma1=0;
   int media_pri=0,media_sec=0;
   char mat[3][3];
   for(i=0 ; i<3 ; i++)
   {
       for(j=0; j<3; j++)

       {
           do
           {
               printf("Digite um numero para a matriz[%d].:\t",i);
               scanf("%c",&mat[i][j]);

               // NAO ESTOU ACERTANDO ESTA VALIDAÇÃO

              if(mat[i][j] < (char) 48 || mat[i][j] > (char)57)
              {
                  printf("\nCaractere invalido\n\n");
              }
           }while(mat[i][j] < (char)48 || mat[i][j] > (char) 57);
       }
       printf("\n");
       }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Por favor inclua seu código entre [ code] e [/code] para podermos vizualizá-lo direito.

 

 

Primeiro, nunca use main() - é um modo errado, segundo o novo padrão da C, de inicializar seus programas. Utilize int main(void) ao invés disso, com um return 0; no final da função.

 

#include <stdio.h>
#define SIZE_MAX 3

int main(void)
{
   int i, j, soma = 0, soma1 = 0, media_pri = 0, media_sec = 0;
   char mat[size_MAX][size_MAX];

   for(i = 0; i < SIZE_MAX; i++)
   {
       for(j = 0; j < SIZE_MAX; j++)

       {
           do
           {
               printf("Digite um numero para a matriz[%d].:\t",i);
               scanf(" %c%*c",&mat[i][j]);

              if(mat[i][j] < '0' || mat[i][j] > '9')
              {
                  printf("\nCaractere invalido\n\n");
                  continue;
              }
           }while(i  != SIZE_MAX - 1 && j != SIZE_MAX - 1);
       }
       printf("\n");
   }

   return 0;
}

 

Testa aí porque to sem compilador aqui...

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

É mesmo, eu errei rs...

 

 

Esquece o que eu coloquei, ponha isso:

 

do
           {
               printf("Digite um numero para a matriz[%d].:\t",i);
               scanf(" %c%*c",&mat[i][j]);

              if(mat[i][j] < '0' || mat[i][j] > '9')
              {
                  printf("\nCaractere invalido\n\n");
                  continue;
              }
           }while(mat[i][j] < '0' || mat[i][j] > '9');

 

 

 

Deve funcionar. Só estou sem tempo pra pensar em uma solução mais bonita ;D

 

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora deu certo, porém a matriz não pega o numero digitado. Pega um numero em sequencia 49 50 51 52.

#include <stdio.h>
//  #define SIZE_MAX 3

int main(void)
{
   int i, j, soma = 0, soma1 = 0, media_pri = 0, media_sec = 0;
   char mat[3][3]; //  char mat[size_MAX][size_MAX];

   for(i = 0; i < 3; i++)  //    for(i = 0; i < SIZE_MAX; i++)
   {
       for(j = 0; j < 3; j++) //    for(j = 0; j < SIZE_MAX; j++)

       {
           do
           {
               printf("Digite um numero para a matriz[%d].:\t",i);
               scanf(" %c%*c",&mat[i][j]);

          	if(mat[i][j] < '0' || mat[i][j] > '9')
          	{
              	printf("\nCaractere invalido\n\n");
              	continue;
          	}
           }while(mat[i][j] < '0' || mat[i][j] > '9');
       }

       printf("\n");
   }

   for(i=0 ; i<3 ; i++)
       for(j=0; j<3; j++)

           if(i==j)
           {
               soma=soma+(mat[i][j]);
               media_pri=(float)soma/3;
               printf("\nElementos da diagonal principal.:%d ",mat[i][j]);
           }

   printf("\n");
   for(i=0 ; i<3 ; i++)
       for(j=0; j<3; j++)
           if (i==(2-j))
           {
               soma1=soma1+(mat[i][j]);
               media_sec=((float)soma1/3);
               printf("\nElementos da diagonal secundaria .:%d ",mat[i][j]);
           }
   printf("\n");
   printf("\nMedia.:%d ",media_pri);
   printf("\nMedia.:%d \n",media_sec);
   for(i=0 ; i<3 ; i++)
   {
       for(j=0; j<3; j++)
       {
           printf("\t%d",mat[i][j]);
       }
       printf("\n");
   }
   printf("\n");

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

A matriz deve pegar sim o número digitado. O problema é que você está dando display nos valores como inteiros (usando %d no printf), então você está printando os valores inteiros dos chars, não os chars em si.

 

Se quer fazer operação com eles, converta-os para inteiros antes. Se usar %c no printf ao invés de %d agora vai dar certo para mostrar (apenas) os números.

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Muito bom então! Se puder postar o código com a solução para arquivarmos (caso apareça alguém com a mesma dúvida ;D)...

 

 

Caso resolvido?

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só clarificando algumas coisas sobre a linguagem em si:

 

- Não é preciso fazer casting de argumentos literais inteiros para (char);

- A declaração da main é completamente flexível, embora a maneira portável seja int main(void), int main(int argc, char *argv[]) e equivalentes. Outras formas são 'legais', de acordo com o padrão, mas provavelmente não serão aceitas por todas as implementações existentes e possíveis.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caracteres não tem suporte a esses números. A string existe, se você pegar 3 caracteres, verá que pode ser "-6" e "1,4", mas não '1,4'.

 

Você pode tentar converter seu programa para aceitar essas excessões, mexendo com strings, mas é um pouco mais complexo. Estude que conseguirá ;D

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou mandando o código sem a validação. Porque é muita coisa para aprender ainda, por enquanto vai ter que ficar assim.

/*Faca um algoritmo que calcule a média dos elementos da diagonal principal
e a média da diagonal secundária de uma matriz 10x10 de números.*/
#include<stdio.h>
#include<stdlib.h>
main()
{
   system("color 8F"); // mudar cor do console papra cinza.
   int soma_princ=0, soma_sec=0; // Declaração da Matriz
   int l, c; // Declaração dos contadores
   int matriz [10][10];
   float media_princ=0.0, media_sec=0.0;

   printf("ALGORITMO QUE CALCULA A MEDIA DOS ELEMENTOS DA DIAGONAL PRINCIPAL E A MEDIA DOS ELEMENTOS DA DIAGONAL SECUNDARIA DE UMA MATRIZ 10 X 10 DE NUMEROS.\n\n");
printf("Digite o valor para Matriz \n\n");
for (l=0; l<10; l++)
   for (c=0; c<10; c++)
   {
       printf("Linha: [%d] --- Coluna: [%d].: ", l+1, c+1);
	   scanf("%d", &matriz[l][c]);
	   system("cls");
       }
   printf("\n");
   printf("MATRIZ NA ORDEM\n\n");
   for (l=0; l<10; l++)
   {
       for (c=0; c<10; c++)
       printf("\t %d",matriz[l][c]);

   printf("\n");
   }
   printf("\nDIAGONAL PRINCIPAL\n");
   for (l=0; l<10; l++)
   for (c=0; c<10; c++)
   if (l == c)
   {
       soma_princ = soma_princ + matriz[l][c];
       printf("\nMatriz[%d][%d] = %d",l+1,c+1, matriz[l][c]);

   }
       media_princ=(float)soma_princ/10;
   printf("\n\n\t\tDIAGONAL SECUNDARIA\n");
   for (l=0; l<10; l++)
   for (c=0; c<10; c++)
       if ((l) +(c) == 9)
           {
           soma_sec = soma_sec + matriz[l][c];
           printf("\n\t\tMatriz[%d][%d] = %d",l+1,c+1, matriz[l][c]);
           }
    media_sec = (float)soma_sec/10;
    printf("\n");

    printf("\n\nA MEDIA DOS ELEMENTOS DA DIAGONAL PRINCIPAL = %.2f\n",media_princ);

    printf("\n\nA MEDIA DOS ELEMENTOS DA DIAGONAL SECUNDARIA = %.2f\n",media_sec);

}


Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.