Ir ao conteúdo

C Identificar número dentro de um vetor e dizer se já foi digitado antes


Ir à solução Resolvido por devair1010,

Posts recomendados

Postado

Bom dia pessoal, estou aqui com algumas dificuldades, sou novo no mundo de programação, então estou tendo dificuldades a interpretação da lógica e por aí fora, pediram-me pra fazer um programa que pede ao usuário que digite 10 números aleatórios, caso o usuário digite um número antes já digitado, o programa informá-lo que o número já foi digitado, e pede a ele para digitar um número diferente, no final mostrar os valores digitados pelo usuário.
Me ajudem por favor.

 

#include<stdio.h>

int main (){
    
    int valor[10];
    int i;
    
    
    for (i=0; i<10; i++){
        
        printf("\n\t||Digite 10 valores diferentes: ");
    scanf("%d",&valor[i]);
        

    
        if (valor[i]==i){
            
            printf("\n\tEste valor ja foi digitado, digite um valor diferente\n");
        }
        
        
    }
    
    printf("\n\tOs valores armazenados são: %d",i);
        
    return 0;
}

 

  • Obrigado 1
  • Membro VIP
Postado

Que tal comparar com o que já foi digitado... Algo como...

 

int valor[10];
    int i,j;
    
    
    for (i=0; i<10; i++){
        
        printf("\n\t||Digite 10 valores diferentes: ");
    scanf("%d",&valor[i]);
        j=i;

    	while (j--) if (valor[i]==valor[j-1]{

 

  • Obrigado 1
Postado
1 hora atrás, .if disse:
int valor[10];
    int i,j;
    
    
    for (i=0; i<10; i++){
        
        printf("\n\t||Digite 10 valores diferentes: ");
    scanf("%d",&valor[i]);
        j=i;

    	while (j--) if (valor[i]==valor[j-1]{

 

Vou lá testar agora irmão@.if

@.if Não funciona, termina mesmo aí o código?

@.if

int main (){
	
int valor[10];
    int i,j;
    
    
    for (i=0; i<10; i++){
        
        printf("\n\t||Digite 10 valores diferentes: ");
    scanf("%d",&valor[i]);
        j=i;

    	while (j--) if (valor[i]==valor[j-1]){
 
	printf("\n\tOs valores armazenados são: %d",i);
		
}	
}
return 0;


}

Está apresentando problemas kkk

  • Curtir 1
  • Amei 1
Postado

@Belírio    esse loop while

while (j--) if (valor[i]==valor[j-1])
{
  printf("\n\tOs valores armazenados são: %d",i);
}	

não resolve nada  ,  apenas mostra uma msg ,  e então o que precisa é verificar se o número já está colocado em alguma das posições  do vetor , e se não houver nenhum igual , aí coloca esse número nessa posição "[ i ]" do vetor ,  e você pode testar isso dentro do loop FOR mesmo , mas o loop ficaria grande e resolvendo muitas coisas  ,  então use uma função que verifica   o  número e retorna 1 se já tem o número no vetor ou retorna zero se não , 

#include<stdio.h>
int verifica( int*, int, int );
int main ()
{
  int valor[10] = {0};                        /// todas as posições de vetor inicializadas com valor zero
  int i;
  int ret = 0;
  int numero = 0;
  printf("\n\t||____*    Digite 10 valores diferentes -:\n\n");
  for (i=0; i<10; i++)
  {
    do
    {
      printf("  %d%c nUmero ", i+1 , 167 );   /// o 167 Eh o cOdigo ASCII do sImbolo º ordinal
      scanf( "%d", & numero );
      ret = verifica( valor, i, numero );
      printf("valor de Retorno da FunCAo = %3d\n",ret);
      if ( ret == 1 )  
      {
        printf("\n\tEste valor já foi digitado, digite um valor diferente\n");
      }
    }  while( ret );                          /// repete enquanto achar no vetor um numero igual  ao digitado
    valor[ i ] = numero;                      /// finalmente armazena o nUmero no vetor
    printf( "\n\n\n" );
  }
  printf("\n\tOs valores armazenados sAo: %d nUmeros . . . !\n\n" , i );
  for( i=0; i<10; i++ ) 
    printf( "\t%3d PosiCAo = %3d\n" , i , valor[ i ] );
  printf( "\n\n\n" );
  return 0;
}
int verifica( int* v, int tam, int num )
{
  printf("tam ---= %3d\n",tam);
  printf("num ---= %3d\n",num);               /// ver se a funCAo recebeu os valores corretos
  for( int j=0; j<tam; j++ )                  /// alguns compiladores aceitam cria a variAvel dentro do Loop
  {
    printf("v[ %d ] = %3d\n",j,v[j] );        /// mostra a valor que já esta no vetor 
    if( v[ j ] == num )                       /// testa se o nUmero Eh igual em cada uma das posições do veTor
      return 1;                               /// achou um numero igual ; já no vetor
  }
  return 0;                                   /// retorna zero pois o nUmero não tem nenhum outro igual
}

 

  • Curtir 1
Postado

@Belírio escreva em torno dos dados.

 

Como faria isso com um bloco de papel? 

 

Escreva em torno dos dados e faça o simples. São só 10 números. Antes de perguntar pro usuário faça o óbivo: mostre quantos e quais foram digitados. Leia o valor. Mostre na tela. Você está começando e é bom saber que o computador concorda com o valor que acha que devia estar lá.

 

Você compara os números olhando na lista. E é claro que precisa saber sempre quantos números já tem na tal lista...

  • Curtir 1
  • Obrigado 1
  • Membro VIP
Postado

Reativando modo minimalista...

Em 26/11/2022 às 07:18, Belírio disse:

caso o usuário digite um número antes já digitado, o programa informá-lo que o número já foi digitado

#include <stdio.h>

int main() {
  int valor[10],i,j;
    
  for (i=0; i<10; i++)
	{
  	printf("\n\t||Digite 10 valores diferentes: ");
  	scanf("%d",&valor[i]);
  	j=i;
	while (j) if (valor[i]==valor[--j]) printf("\nja digitou ");
	}
}

Testei em https://replit.com/languages/c

😁

O preço.. entenda e explique o funcionamento..😉

 

 

  • Curtir 1
  • Obrigado 1
  • Amei 1
Postado

@.if    realmente , o enunciado , diz para apenas informar que o número já foi digitado , e então não precisa que ao  digitar um outro número , ele não exista no vetor ,  e no Replit está dando um erro que não sei como resolver mesmo .

replit2.thumb.jpg.4a771876b239a75183c99c42b5b391a4.jpg

 

  • Curtir 1
Postado
1 hora atrás, devair1010 disse:

o enunciado , diz para apenas informar que o número já foi digitado , e então não precisa que ao  digitar um outro número , ele não exista no vetor 

 

Em 26/11/2022 às 07:18, Belírio disse:

caso o usuário digite um número antes já digitado, o programa informá-lo que o número já foi digitado, e pede a ele para digitar um número diferente

 

Não podem ser os dois verdade. Se pede para digitar um número diferente mas já colocou o repetido no vetor qual o sentido de pedir?

  • Curtir 1
  • Membro VIP
Postado
4 horas atrás, devair1010 disse:

no Replit está dando um erro que não sei como resolver mesmo .

Desculpe amigo. É que não coloquei loop principal e nem finalizei o programa. Assim sendo quando sai do loop de 10 iterações, cai num terminal doidão do replit.

E não dei o peixe todo... não pedi pra colocar número diferente. Deixo o desafio pro autor

  • Obrigado 1
Postado
for (int j = 0; j < i; j++) {
    if (numeros[j] == numeros[i]) {
        printf("%d -> Numero repetido\n", numeros[i]);
        i -= 1;
        break;
    }
}

 

Parece estar funcionando corretamente.

Rep.gif

  • Obrigado 1
  • Amei 1
  • Solução
Postado

@Belírio    não está completo ,  ali só está testando se tem número repetido ou não ,  precisa incluir esse trecho no seu código do #1 post  , e ficaria assim  :

#include    <stdio.h>
#include    <stdlib.h>
#include    <conio.h>
#include    <windows.h>
#define    _h GetStdHandle(STD_OUTPUT_HANDLE)
int main ()
{

  int valor[10];
  int i;
  int cor_letra, cor_fundo;
  CONSOLE_SCREEN_BUFFER_INFO c;
  if(GetConsoleScreenBufferInfo( _h, &c))
  {
    cor_letra = ( c.wAttributes & 0xFF) & 0x0F;
    cor_fundo = ((c.wAttributes & 0xFF) >> 4) & 0x0F;
  }
  for (i=0; i<10; i++)
  {
    printf("\n\t||Digite 10 valores diferentes: ");
    scanf("%d",&valor[i]);
    for (int j = 0; j < i; j++)
    {
      if (valor[j] == valor[i])
      {
        printf("%d -> Numero repetido\n", valor[i]);
        i -= 1;
        break;
      }
    }
  }
  SetConsoleTextAttribute(_h, 12 + ( 10 << 4 ) );
  printf("\n\tOs valores armazenados são: %d\n\n",i);
  for( int i=0; i<10; i++)
    printf("%3d   \n",valor[i] );
  SetConsoleTextAttribute(_h, cor_letra + ( cor_fundo << 4 ) );
  printf("\n\n\n");
  return 0;
}

 

  • Curtir 1

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!