Ir ao conteúdo

Posts recomendados

Postado

Boa Noite gente! 

 

Pessoal poderiam analisar meu código e me dizer onde estou errando? Estou estudando e estava aqui fazendo esse exercício e não consigo fazer sair o resultado que eu quero. Segue o código. 

 

/* Faca um programa que leia um vetor de 10 posicoes e verifique se existem valores iguais
   e os escreva na tela. */
   
#include <stdio.h>
#include <stdlib.h>

main(){
       
       int vet[10],vet2[10],i,cont,resp=0;
       
       for(i=0; i<10; i++){
                printf(" Entre com um numero: ");
                scanf("%d",&vet[i]);
                }
       for (i=0; i<10; i++){   
                for (cont=0; cont<10; cont++){
                          if(vet[i] == vet2[cont]){ 
                          resp++;
                          }
                } 
       } 
       printf("\n O numero %d se repetiu %d vezes",vet[i],resp);
       system("pause>>null");
}

 

Postado

Bem, você não inseriu os elementos no vet2[ ], ai ao comparar ele com o vet[ ] vai dar erro. voce tem que preencher o vet2...

Postado

@mi2011também ha´outro erro, acredito que a variavel ' i  'tenha valor tenha valor 11 na linha 

   printf("\n O numero %d se repetiu %d vezes",vet[i],resp);

assim tentando acessar um campo que não existe e dando erro de execução.

acho que você precisa subir essa linha e zerar o contador no inicio do primeiro loop

p.s.:vou baixar o compilador pra poder lhe ajudar melhor.

Postado

@mi2011 Amigo, acredito que estava ocorrendo isso... aqui está o código correto, faltava inicializar o vetor 2 para poder efetuar a comparação, mas o fato de ele estar nulo não irá gerar erro pois quando você for comparar, será uma comparação do velor X com um valor vazio.

se atentar também que aquela linha que citei na resposta anterior tem que se encontrar dentro do laço pois ela irá imprimir quantas vezes se repete cada numero dentro do primeiro vetor .

Ela ficando fora do vetor, você irá tentar acessar a posição 10, vet[10].. e um array contabiliza como a primeira posição o valor zero ( 0) , sendo assim qualquer vetor, suas possições com referencia a um tamanho N são de vet[0] até vet[N-1]
Então a ultima posição será a 9, acredito que você tentando acessar a posição 10 do vetor, estará acessando o próximo espaço que representaria um numero INTEIRO na memoria do seu computador. vou só analisar isso. [ Como analisado, a posição 10 do vetor VET, aponta para o seguinte espaço na memoria, que no meu computador está reservado para a variavel resp e a posição 11 está reservado para variavel cont., mas isso é só coincidência, ao executar um programa, o C vai reservando espaços na memoria, como não estamos utilizando ponteiros, ele vai preenchendo blocos na memoria, como nos declaramos as variaveis juntas, por coincidência, no meu caso, acabou ficando logo em seguida do primeiro vetor. ]
Qualquer duvida só perguntar
 

/* Faca um programa que leia um vetor de 10 posicoes e verifique se existem valores iguais
   e os escreva na tela. */
   
#include <stdio.h>
#include <stdlib.h>

main(){
       
       int vet[10],vet2[10],i,cont,resp=0;
       
       for(i=0; i<10; i++){
            /*    printf(" Entre com um numero: ");*/
                /*scanf("%d",&vet[i]);*/
                vet[i]=i;

                }

        for(i=0; i<10; i++){
        /*printf(" Entre com um numero: ");*/
        /*scanf("%d",&vet[i]);*/
        vet2[i]=i*2;

        }
       printf("\n**** CORRETO ********************");
       for (i=0; i<10; i++){   
              resp=0;
                for (cont=0; cont<10; cont++){
                          if(vet[i] == vet2[cont]){ 
                          resp++;
                          }
                } 
       printf("\n* O numero %d se repetiu %d vezes*",vet[i],resp);
       } 
       printf("\n*********************************");


       for(i=0; i<10; i++){
            
            printf("\n Valor dor vetor 1 na posicao [%d] e: %d",i,vet[i]);


      } 

        for(i=0; i<10; i++){
            
            printf("\n Valor dor vetor 2 na posicao [%d] e: %d",i,vet2[i]);


      } 

       printf("\n valor de i: %d",i);
       printf("\n O numero %d se repetiu %d vezes",vet[i],resp);
       system("pause>>null");
}


 

Postado

@Rio Se o vetor não for um vetor global e não for inicializado, vai dar erro no momento de acessar suas posições.

Postado

Pois é @CiroboyBR , mas como eu falei... não deu erro, ele está acessando na memoria o próximo espaço que seria destinado para um numero INTEIRO.
Eu levei em consideração o que você falou, mas eu baixei o código, compilei e executei, não deu erro de execução e nem de compilação.
Mas no caso aí é um vetor global, não? 

é porque assim, eu também não sei muito sobre C, é só um conhecimento de um pouco que já estudei... não uso no meu dia a dia..

 

Postado
2 horas atrás, Rio disse:

Pois é @CiroboyBR , mas como eu falei... não deu erro, ele está acessando na memoria o próximo espaço que seria destinado para um numero INTEIRO.
Eu levei em consideração o que você falou, mas eu baixei o código, compilei e executei, não deu erro de execução e nem de compilação.
Mas no caso aí é um vetor global, não? 

é porque assim, eu também não sei muito sobre C, é só um conhecimento de um pouco que já estudei... não uso no meu dia a dia..

 

No C a variável só é global quando declarada fora das funções, incluindo a main(). Tem o tipo extern, mas nunca testei se declarando uma "extern int/char/float" dentro de uma função ela pode ser usada em todo o programa.

Postado

Pois é, estranho, então sem ser global não apresentou o erro, porque? 
acho que a variavel foi declarada sim, só não foi atribuido valor a posição, aí assim, 

ele reservou o espaço na memoria, mas cada posição está com bits 00000000 ou NULL.

/* Faca um programa que leia um vetor de 10 posicoes e verifique se existem valores iguais
   e os escreva na tela. */
   
#include <stdio.h>
#include <stdlib.h>

main(){
       
       int vet[10],vet2[10],i,cont,resp=0;
       
      

       printf("\n valor de i: %d",vet[4]);
       
       system("pause>>null");
}

A nivel de experimento, executei esse dado, não atribui valores ao vetor e o retorno foi o numero : 4201520.
Que provavelmente é como os bits estão lá 10000000001110000110000 .. por ser um numero grande, então provavelmente ele ta usando o LONG_INT que ocupa 32 bits

Enfim, quando cria um vetor, ele aponta pra um espaço da memoria, se não atribuir valor, ele pega a sujeira que já esta lá.
No caso, não ocorreu erro, caso contrario por favor me informar

Postado

No geral, no GCC pra windows ele seta o valor pra 0, mas no linux isso não acontece, ao imprimir uma variavel nao inicializada no linux vai surgir um numero aleatorio. Não sei bem o que ocorre, mas por experiência sei que da erro acessar posições de um vetor não inicializado.

 

No caso você queria um erro que parasse o programa. Isso não acontece, só acontece ao acessar variáveis de ponteiros não alocados.

Postado

@CiroboyBR

Citar

@Rio Se o vetor não for um vetor global e não for inicializado, vai dar erro no momento de acessar suas posições.

 

é porque eu pensei que iria lançar uma exceção em tempo de execução, igual quando tentamos alocar um valor que a posição alocada não suporta.

mas obrigado mesmo assim pela explicação

P.S.: Mas só complementando, utilizei o compilador GCC, estou em um windows, criei a variavel e ela não retornou 0.

Postado



@Rio Como o vango falou, é melhor você pegar seu compilador e fazer uns teste, tire por si so essas dúvidas, as que você não conseguir tirar você cria um novo tópico com a questão, pois esse tópico ja saiu do assunto principal.

@vangodp Vocês estão muito focados em variáveis inteiras. Eu falei no geral, como explica a imagem abaixo, os outros tipos não inicializados tem sua dominância de valores zeros(Windows). E como falei anteriormente, é só um fato que eu tinha observado, nunca pesquisei a respeito pelo simples fato de ser algo irrelevante. A inicialização das variáveis só acontece 1x no programa, coisa que nem de perto vai atrapalhar o desempenho de um programa que já está carregado.

56749409507f7_variaveisnaoinicializadas.
 

Postado

Valeu pela força pessoal e obrigada pelo conhecimento deixado no tópico. Questão resolvida.

Postado

@vangodp  Valeu meu fih.
Obrigado por tudo, como eu falei, não sou bom em C. Desculpa, só queria ajudar o rapaz com o problema de matriz. =D
Não tem como eu argumentar com vocês, afinal só li uns capitulos de uns livros. haha
O importante é que colaboramos com o cara, vou dar uma estudada e depois volto a argumentar com vocês para podermos cada vez crescer mais! =D

Postado

@vangodp Rapaz mas você é insistente em assuntos irrelevantes...

Sobre o compilador não fazer algo que você não ordena, você pega esse código, e executa ele no windows e veja se não tem muitos valores 0

 

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

main() {

  int i, v1[3];
  double d, v2[3];
  char c, v3[3];
  float f, v4[3];
  int aa;

  for (aa = 0; aa < 3; aa++)
    printf("\nint i: %d  |  v1: %d", i, v1[aa]);
  for (aa = 0; aa < 3; aa++)
    printf("\nchar  i: %d  |  v1: %d", c, v3[aa]);
  for (aa = 0; aa < 3; aa++)
    printf("\ndouble  i: %lf  |  v1: %lf", d, v2[aa]);
  for (aa = 0; aa < 3; aa++)
    printf("\nfloat  i: %f  |  v1: %f", f, v4[aa]);

  system("pause>>null");
}


E sobre o rendimento do programa, leia novamente a minha mensagem e me prove que depois do tempo gasto na inicialização, Essas variáveis que foram inicializadas vão atrasar a execução do programa.  Ou seja, elas só vão atrasas o programa no 1° momento, e depois não vão fazer diferença alguma.


Sobre meu Ambiente: Win7 X64  | GCC versão 4.7.1 TDM-1

Também testei no GCC 4.4.5 (QP Mingw32)


Só ressaltando, que o quê o compilador pode ou não pode eu não sei dizer ao certo, mas o que tenho observado é que no geral, no windows ele imprime o valor "0", para variáveis não inicializadas. Ele imprime na telinha do DOS... na telinha do DOS...


DOS...



 

Postado

Valeu @vangodp , sim realmente não depurei o código. meu intuito mesmo era só ajudar o menino da matriz.
Esse sim aprendeu nesse topico haha.

e tudo que você falou é verdade.

Este fórum é um lugar pra aprender e não se irritar, se for um debate, que seja saudável.

Pelo menos eu venho pra cá aprender, não exatamente C, mas como posso ajudar as pessoas.

Vou criar outro tópico para falarmos mais sobre C. 
Abraço e espero poder continuar a trocar conhecimento com vocês!
 

Visitante
Este tópico está impedido de receber novas respostas.

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