Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
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!
 
Editado por Houseofzuera

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.
Editado por dontpanic

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.

Editado por dontpanic

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++ )...
Editado por Mauro Britivaldo

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






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

×