Ir ao conteúdo
  • Cadastre-se
Houseofzuera

Dúvida nos dois últimos itens do Programa em Linguagem C!

Recommended Posts

Hey Galera!

 

Eu vou postar primeiro o exercício e em seguida, postarei a minha dúvida.

 

Construa um programa que construa uma matriz unidimensional para armazenar as leituras pluviométricas
semanais no período de um ano de uma determinada região (considere o ano com 48 semanas).
 
SEMANAS:
 
1   | 2  | 3  | 4  | 5  | 6  | 7  | 8  | ............................... | 45  | 46  | 47  | 48 |
7,8|8,2|10 |5,4|6,5|8,5|6,5|9,5|                                 |13,2| 9,8 | 4,5 | 6,5|
 
Faça a entrada de dados para matriz e em seguida calcule e exiba:
- A média das leituras pluviométricas.
- A maior e a menor leitura pluviométrica.
- O número do mês que ocorreu a maior leitura.
- O numero do mês que ocorreu a menor leitura.
 
Considere que os valores das leituras não se repetem.
 
A minha dúvida é nos seguintes itens:
 
- O número do mês que ocorreu a maior leitura.
- O numero do mês que ocorreu a menor leitura.
 
Eis Aqui o meu código:
 
int main()
{
float TabLeit[47];
int Col, Maior, Menor;
float Media, Soma;
 
for(Col = 0; Col <= 47; Col++)
{
printf("\nDigite uma Leitura Pluviometrica\n");
scanf("%f", &TabLeit[Col]);
 
 
Maior = TabLeit[0];
Menor = TabLeit[0];
Soma = TabLeit[0];
}
for(Col = 1; Col <= 47; Col++)
{
Soma = Soma + TabLeit[Col];
 
if(TabLeit[Col] > Maior)
Maior = TabLeit[Col];
if(TabLeit[Col] < Menor)
Menor = TabLeit[Col];
}
Media = Soma / 48;
 
printf("\n Maior Leitura Pluviometrica %i\n", Maior);
printf("\n Menor Leitura Pluviometrica %i\n", Menor);
printf("\n Media Pluviometrica %.2f\n", Media);
 
}
 
 
Como eu faço primeiramente, para achar o meses e depois escreve-los? 
 
Por favor, aguardo uma resposta!
 

Compartilhar este post


Link para o post
Compartilhar em outros sites

float TabLeit[47];

 

Você declarou esse array com 47 posições. O que significa que você pode acessar apenas as posições de 0 até 46.

Portanto essa parte do código vai dar erro:

 

for(Col = 0; Col <= 47; Col++)

 

Pra pegar o número dos meses onde acontecem a maior e a menor leitura, basta guardar o índice do vetor quando estiver pegando a maior e menor leitura:

 

if(TabLeit[Col] > Maior) {
    Maior = TabLeit[Col];
    maiorIndice = Col;
}
if(TabLeit[Col] < Menor) {
    Menor = TabLeit[Col];
    menorIndice = Col;
}
 
Como cada mês tem 4 semanas, basta dividir esses números por 4.
 
Maior leitura aconteceu na semana 14.
14 / 4 = 3.
Então terceiro mês.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, editei o código exatamente dessa maneira:

 

for(Col = 1; Col <= 48; Col++)
{
Soma = Soma + TabLeit[Col];
 
if(TabLeit[Col] > Maior)
Maior = TabLeit[Col];
MaiorIndice = Col;
if(TabLeit[Col] < Menor)
Menor = TabLeit[Col];
MenorIndice = Col;
}
.......................................
 
printf("\nMaior Indice: %i\n", MaiorIndice);
printf("\nMenor Indice: %i\n", MenorIndice);
...............
 
 
Porém, quando vai imprimir o resultado retorna o valor "48", em ambas as variáveis.
 
Errei em alguma coisa? 

Obs: Ainda não dividi por 4, pois queria primeiro testar se estava pegando a Coluna! 

Compartilhar este post


Link para o post
Compartilhar em outros sites
if(TabLeit[Col] > Maior) {

    Maior = TabLeit[Col];

    MaiorIndice = Col;

}

 

if(TabLeit[Col] < Menor) {

    Menor = TabLeit[Col];

    MenorIndice = Col;

}

 

Se você não usar os colchetes, apenas o primeiro comando depois dos IF fica dentro do escopo dele.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado cara, mas só tem um último bug:

 

Quando o Maior Índice ou o Menor Índice está na primeira posição, ele retorna algum valor da CPU e não o Número 1:

 

Por Exemplo: Eu digito todos as leituras na mesma ordem das posições das colunas e quando finalizo o processo, retorna assim:

 

Maior índice: 48(Certo)

Menor Índice: 31 (?)

 

Na TabLeit[31] está = 31

Na TabLeit[1] está = 1

 

Ou seja, o Menor índice deveria ser 1 

 

Já quando eu digito, por exemplo, 200 na TabLeit[1], e valores menores nas outras colunas, retorna assim:

 

Maior Indice: -2 (?)

 

Vou postar de novo o código inteiro com as alterações que já foram feitas:

 

 

 int main(){float TabLeit[48];int Col, MaiorIndice, MenorIndice;float Media, Soma, Maior, Menor; for(Col = 1; Col <= 48; Col++){printf("\nDigite uma Leitura Pluviometrica \n");scanf("%f", &TabLeit[Col]);  Maior = TabLeit[1];Menor = TabLeit[1];Soma = TabLeit[1]; }for(Col = 2; Col <= 48; Col++){Soma = Soma + TabLeit[Col];   if(TabLeit[Col] > Maior){Maior = TabLeit[Col];MaiorIndice = Col;} if(TabLeit[Col] < Menor){Menor = TabLeit[Col];MenorIndice = Col;}  }  Media = Soma / 48; printf("\n Maior Indice: %i\n", MaiorIndice);printf("\n Menor Indice: %i\n", MenorIndice);printf("\n Maior Leitura Pluviometrica %.2f\n", Maior);printf("\n Menor Leitura Pluviometrica %.2f\n", Menor);printf("\n Media Pluviometrica %.2f\n", Media); } 

Obs: O Problema é exclusivamente na Primeira posição. Nas Outra posições, funciona perfeitamente!

Compartilhar este post


Link para o post
Compartilhar em outros sites

for(Col = 1; Col <= 48; Col++) { ... }

 

Mais uma vez: se o seu vetor tem 48 posições, você só tem direito a acessar as posições TabLeit[0] até TabLeit[47].

 

...

TabLeit[-2] ---> valor inválido

TabLeit[-1] ---> valor inválido

TabLeit[48] ---> valor inválido

TabLeit[49] ---> valor inválido

...

 

Além disso, o seu segundo FOR tá começando com COL = 2.

Então TabLeit[1] não está sendo comparado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

{ "OLÁ MUNDO!" }

Eu queria entender essa parte aqui:

float TabLeit[48];for(Col = 1; Col <= 48; Col++)

1. É sua intenção ignorar o primeiro elemento do vetor? Quando inicias o loop

com Col = 1; o primeiro elemento estará ignorado;O primeiro elemento do vetor

em C... é [ 0 ] zero.

 

2. Col é a sentinela  que faz  a  contagem do loop, a condição de existência dessa

extrapola o limite do vetor TabLeit[ ]; certo momento será  igual  a 48; Entende que

n- número do vetor é  igual  a 48;  Porém o  último  elemento do vetor é: n - 1 = 47;

Quando estudamos aritmética de ponteiros, isso nos fica bem claro como funciona,

por hora entendemos que 0121 seja o local do primeiro elemento do vetor na memória,

então 0121 é TabLeit, quando escrevemos assim: TabLeit[ 1 ]; C copila para algo

como (0121 + 1); ou seja 0121 é o primeiro elemento, então, 0121 + 1 = 0122 cor-

responde ao segundo elemento. E por diante...

 

Observe as mudanças abaixo:

for( Col = 0; Col < 48; Col++ )...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×