Ir ao conteúdo
  • Cadastre-se

C Problema com algoritmo de repetição


MatheusINF
Ir à solução Resolvido por Visitante,

Posts recomendados

Bom galera eu tenho um problemão não tão grande assim eu preciso fazer esse exercicio: 

        Para cada empresa de Tv's tem o nome e  a quantidade produzida por mês, faça um algoritmo que:

        A) imprima o nome da empresa que mais produzio no mês de agosto

        B ) Para a empresa de maior produção anual imprima o nome e o mês que menos produziu

        C) Imprima um relatorio final contendo o nome e o total anual.

 

  Bom até agora eu tenho isso

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


int main()
{
       // VARIAVEIS
       int qtde,i,j,k,soma=0,maior=0,menor=0;
       int televisores[100];
       char nome[50];

        // INICIO
        printf("Digite a quantidade de empresas que produzem televisores: ");
        scanf("%d",&qtde);
        printf("\n");

        for(i=0; i<qtde; i++){
        printf("\nDigite o nome da empresa: ");
        scanf("%s",nome);
             for(j=1; j<=12; j++){
                 printf("Quantos televisores foram produzidos no mes %d: ",j);
                 scanf("%d",&televisores[i]);
                 soma+=televisores[i];

        }
        }
        printf("\nA empresa que mais produziu no mes de agosto foi: %s",nome);
        printf("\nA empresa %s foi a que mais produziu no ano, sendo %d o seu pior mes",nome,i);

        printf("\n\n");
        printf("NOME DA EMPRESA                          TOTAL ANUAL\n");
        for(k=0;k<qtde;k++){
            printf("%s                                          %d",nome,soma);
            printf("\n");
        }

return 0;
}

Bom eu até sei fazer pra resgatar a maior produção de agosto, porém não sei aonde fazer, eu sei como comparar a produção anual de duas empresas porém não sei como imprimir o nome da empresa com o maior total nem o mês que menos produzio e por fim, consigo imprimir apenas 1 nome no relatório, como eu faço pra colocar outros nomes digitados?

** Sei que a pergunta ficou meio longa, talvez eu esteja mais perdido pois nunca tinha feito um algoritmo tão grande

Link para o comentário
Compartilhar em outros sites

  • Solução

@MatheusINF Olá. Para armazenar o nome da empresa e depois imprimir o mesmo é preciso de uma matriz bidimensional.

Dá uma olhada e vê se entende o q foi feito. Não está completo o exercício:

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

#define MESES 12

void limpa_linha() {
    scanf("%*[^\n]");
    scanf("%*c");
}

int main()
{
    // VARIAVEIS
    int q_empresas, i, j;
    int producao_ano[50] = {0};

    // INICIO
    printf("Digite a quantidade de empresas que produzem televisores: ");
    scanf("%d", &q_empresas);
    limpa_linha(); // limpar o stdin

    char empresas[q_empresas][50];

    int producao_mes[q_empresas][MESES];    

    for (i = 0; i < q_empresas; i++) {
        printf("\nDigite o nome da empresa: ");
        scanf("%[^\n]", empresas[i]);
        limpa_linha();
        printf("\n");
        for (j = 0; j < MESES; j++) {
            printf("Quantos televisores foram produzidos no mes %d: ", j + 1);
            scanf("%d", &producao_mes[i][j]);
            limpa_linha();
        }
    }

    for (i = 0; i < q_empresas; i++) {
        for (j = 0; j < MESES; j++) {
            producao_ano[i] += producao_mes[i][j];
        }
    }

    printf("\n\n");

    printf("%s %40s\n\n", "NOME DA EMPRESA", "TOTAL ANUAL");

    for(i = 0; i < q_empresas; i++) {
        printf("%-50s %5d\n\n", empresas[i], producao_ano[i]);
    }

    return 0;
}

Vê se ajuda. Só tratei a parte do nome das empresas e a produção anual

Obs: Fiz uma pequena formatação p imprimir os resultados, mas não precisa se preocupar com isso a curto prazo. Procure entender o q foi feito, ok?

 
Link para o comentário
Compartilhar em outros sites

Existem várias formas de concluir por favor será mais fácil se você disser o que você aprendeu até agora.

 

Primeiramente você vai pegar um loop que vai verificar o valor de maior e menor da empresa A,outro loop que vai verificar o maior e o menor da empresa B e fazer outro loop que vai verificar o maior e menor entre as empresas A e B.

Mas também dá de fazer assim digamos que você já tenha o maior mês da empresa A e B e as variáveis sejam "maiora" "maiorb" e a variável que você usou para o loop que você usou para verificar o nome de A e B sejam "nomea" e "nomeb"

 

if(maiora > maiorb){

resposta = nomea

}

else{

resposta = nomeb

}

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

  • Isso mesmo!
    5 horas atrás, Mateus vieites de jesus disse:

    Existem várias formas de concluir por favor será mais fácil se você disser o que você aprendeu até agora

 

Então somente com vetores organize:

/** 
 * BANCO DE DADOS DO PROGRAMA - PDB
 * TABELA: EMPRESA
 * CAMPO->           NOME   
 */char empresa_tb[][47];
/*              
 * TABELA: REGISTRO
 * CAMPO->           INDICE  MES     PRODUCAO
 */int registro_tb[][1   +   1   +   1];

O índice em registro é igual o índice do vetor em empresa, com isso se relacionou nome e registros.

O enunciado pede para relatar a produção do mês de agosto, entretanto, o seu programa deve ser capaz fornecer esse mesmo dado para qualquer mês que for solicitado, pois assim faz muito mais sentido. Se pensou nisso também então o esquema acima será bem útil.

 

EDIT:

Se já aprendeu funções, use-as!

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@AnsiC Acho que não é o caso de usar funçõs na lista que estou fazendo do 1 ao 10 eram pra usar funções e do 11 ao 20 nesse naipe desse com Matriz, vetor e tal, mas Muito obrigado, estava pensando em fazer apenas pro mês de agosto mesmo o que não faria muito sentido :)

 

adicionado 4 minutos depois

@giu_d Cara passei a tarde ontem fazendo exercício de Matriz e não pensei em colocar os nomes em uma AUSIASHUASUIAS, do resto só dei uma viajada nesse void( ), mas entendi o que ele faz , Muito obrigado cara, agora vou implementar a repetição ;)

  • Curtir 1
  • Confuso 1
Link para o comentário
Compartilhar em outros sites

@MatheusINF

1 hora atrás, MatheusINF disse:

do resto só dei uma viajada nesse void( ), mas entendi o que ele faz

 

Você tá se referindo a função limpa_linha. void é o tipo de retorno da função, ou seja, não retorna nada.

Mas cá p nós... tem certeza q está dando o tópico como encerrado? Só foi visto parte do exercício :confused:

Link para o comentário
Compartilhar em outros sites

OBS: Do modo como está o código q postei, se fizer a soma do total fabricado por ano em outros dois for aninhados vai dar erro! O correto é armazenar a qtde de produtos fabricados em uma matriz bidimensional. Sendo q a primeira dimensão se refere a qtde de empresas e a segunda a qtde de meses. Vou editar o código p corrigir isso

Link para o comentário
Compartilhar em outros sites

@giu_d @AnsiC , Cheguei agora não encerra não USAHIUHSAIAS. Bom eu consegui fazer um rascunho com base no que vocês passaram e dei um UP no código agora ela já mostra qual empresa mais produziu no ano e qual foi a maior produção no mês de agosto, porém não consegui fazer imprimir o nome da empresa 

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

int main()
{
    // VARIAVEIS
    int qtde_e,i,j;
    int producao_ano[50]={0};
    int maior_m,maior_a,menor_m;

    // INICIO
    printf("Digite a quantidade de empresas que produzem televisores: ");
    scanf("%d",&qtde_e);

    char empresas[qtde_e][50];
    int producao_mes[qtde_e][12];
    int p_agosto[qtde_e][12];

    for(i=0; i<qtde_e; i++){
        printf("\nDigite o nome da empresa: ");
        scanf("%s",empresas[i]);
        printf("\n");
        for(j=0;j<12;j++){
            printf("Digite a quantidade de televisores produzidos no mes %d: ",j+1);
            scanf("%d",&producao_mes[i][j]);
        }
    }

    for(i=0;i<qtde_e;i++){                         // VER A PRODUÇÃO TOTAL DO ANO
        for(j=0;j<12;j++){
            producao_ano[i]+= producao_mes[i][j];
        }
    }

    maior_m=p_agosto[0][0];                       // VER QUEM MAIS PRODUZIU EM AGOSTO
    for(i=0;i<qtde_e;i++){
        p_agosto[i][8]=producao_mes[i][8];
        if(p_agosto[i][8]>maior_m)
            maior_m=p_agosto[i][8];
    }

    maior_a=producao_ano[0];               // VER QUEM MAIS PRODUZIU NO ANO
    for(i=0;i<qtde_e;i++){
        if(producao_ano[i]>maior_a)
            maior_a=producao_ano[i];
    }


    printf("\nA maior producao no mes de agosto foi %d",p_agosto[i][8]);
    printf("\nA maior producao anual foi %d",maior_a);


     printf("\n\n");
     printf("%s %40s\n\n", "NOME DA EMPRESA", "TOTAL ANUAL");
     for(i = 0; i < qtde_e; i++) {
        printf("%-50s %5d\n", empresas[i], producao_ano[i]);
     }



}

Vou continuar tentando aqui, qualquer coisa dou edit ;)

adicionado 4 minutos depois

OBS** : eu não removi seu void não Giu, só fiz um rascunho pra no final implementar tudo junto

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Está tudo muito Da!Hora :thumbsup:, então fiz um copia aqui e verifiquei que apenas a variável producao_ano também deveria ser dinâmica, pois depende do números de empresas, certo?
adicionado 6 minutos depois

Outra coisa em producao_mes o índice referente a agosto é 7, porém está 8.

0- jan ... 7- ago

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

7 minutos atrás, AnsiC disse:
  • Está tudo muito Da!Hora :thumbsup:, então fiz um copia aqui e verifiquei que apenas a variável producao_ano também deveria ser dinâmica, pois depende do números de empresas, certo?

Você diz colocar "producao_ano [qtde][50]" ?

adicionado 2 minutos depois
10 minutos atrás, AnsiC disse:
  • Está tudo muito Da!Hora :thumbsup:, então fiz um copia aqui e verifiquei que apenas a variável producao_ano também deveria ser dinâmica, pois depende do números de empresas, certo?
adicionado 6 minutos depois

Outra coisa em producao_mes o índice referente a agosto é 7, porém está 8.

0- jan ... 7- ago

LOL, esqueci que começa contar do 0, vou arrumar

Link para o comentário
Compartilhar em outros sites

  • int  producao_ano[qtde_e]; //     !| antes estatico agora dinamico
    /* Eu pensei que esse vetor fosse o consolidado anual de todas as empresas 
     * Se estou certo então ele é um dos dinamicos 
     */

    Fiz como acima!

    4 minutos atrás, MatheusINF disse:

    Você diz colocar "producao_ano [qtde][50]" ?

     

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

  for(i= 0; i < qtde_e; i++) {    // VER A PRODUÇÃO TOTAL DO ANO
      
    for (j= 0; j < 12; j++) {
      
      producao_ano[i]+= producao_mes[i][j];
  } }

Veja assim, como em seu código

adicionado 1 minuto depois
2 minutos atrás, MatheusINF disse:

eu faria isso mostrando a posição i que está contida o nome da empresa?

Acho que sim!

adicionado 3 minutos depois
maior_m= p_agosto[0][7];        // VER QUEM MAIS PRODUZIU EM AGOSTO
for (i= 0; i < qtde_e; i++) {

  p_agosto[i][7]= producao_mes[i][7];
  if (p_agosto[i][7] > maior_m) {

    maior_m= p_agosto[i][7]; /* ?| gardaria aqui a posicao tambem
      para depois imprimir o nome da empresa na posicao */
} }

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

19 minutos atrás, AnsiC disse:
  • Está tudo muito Da!Hora :thumbsup:, então fiz um copia aqui e verifiquei que apenas a variável producao_ano também deveria ser dinâmica, pois depende do números de empresas, certo?
adicionado 6 minutos depois

Outra coisa em producao_mes o índice referente a agosto é 7, porém está 8.

0- jan ... 7- ago

Agora que fui ver mnw, coloquei 8 pois, o algoritmo está lendo j+1, logo ele começa do 1 mesmo não do 0 

Link para o comentário
Compartilhar em outros sites

2 horas atrás, MatheusINF disse:

for(j=0;j<12;j++){

  printf("Digite a quantidade de televisores produzidos no mes %d: ",j+1);

  scanf("%d",&producao_mes[i][j]);

 } 

j está começando com 0 aqui. Logo Janeiro é 0. j só vai até 11 termina quando igual a 12. Quando j:= 0, a mensagem é 1.

 

 

6 minutos atrás, MatheusINF disse:

gora que fui ver mnw, coloquei 8 pois, o algoritmo está lendo j+1, logo ele começa do 1 mesmo não do 0 

 

adicionado 6 minutos depois
2 horas atrás, MatheusINF disse:

printf("\nA maior producao no mes de agosto foi %d",p_agosto[i][8]);

Aqui também não esta imprimindo a maior produz do mês de agosto!

Link para o comentário
Compartilhar em outros sites

Bom estava pensando em mostrar o nome da empresa assim

Spoiler

printf("\nA maior producao no mes de agosto foi da empresa %s com o valor de: %d",empresas[i],p_agosto[i][8]);
    printf("\nA maior producao anual foi da empresa %s com o valor de : %d",empresas[i],maior_a);

 

Porém, não vai pois eu não sei qual i é a empresa

Link para o comentário
Compartilhar em outros sites

14 minutos atrás, MatheusINF disse:

Porém, não vai pois eu não sei qual i é a empresa

  maior_m= producao_mes[0][7];        // VER QUEM MAIS PRODUZIU EM AGOSTO
  maior_e= 0;
  for (i= 0; i < qtde_e; i++) {
    
    maior_m= producao_mes[i][7];
    if (producao_mes[i][7] > maior_m) {
        
      maior_m= producao_mes[i][7];
      maior_e= i;
  } }
  maior_a= producao_ano[0];        // VER QUEM MAIS PRODUZIU NO ANO
  for (i= 0; i < qtde_e; i++) {
    
    if (producao_ano[i] > maior_a) {
      
      maior_a= producao_ano[i];
  } }
  printf( "%s%d%s%s","\nA maior producao no mes de agosto foi ",maior_m,
                                             " da empresa ",empresas[maior_e] );
  printf( "%s%d","\nA maior producao anual foi ",maior_a );

Testa assim.

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@AnsiC Ficou assim

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

int main()
{
    // VARIAVEIS
    int qtde_e,i,j;
    int producao_ano[50]={0};
    int maior_m,maior_a,menor_m,maior_e;

    // INICIO
    printf("Digite a quantidade de empresas que produzem televisores: ");
    scanf("%d",&qtde_e);

    char empresas[qtde_e][50];
    int producao_mes[qtde_e][12];
    int p_agosto[qtde_e][12];

    for(i=0; i<qtde_e; i++){
        printf("\nDigite o nome da empresa: ");
        scanf("%s",empresas[i]);
        printf("\n");
        for(j=0;j<12;j++){
            printf("Digite a quantidade de televisores produzidos no mes %d: ",j+1);
            scanf("%d",&producao_mes[i][j]);
        }
    }

    for(i=0;i<qtde_e;i++){                         // VER A PRODUÇÃO TOTAL DO ANO
        for(j=0;j<12;j++){
            producao_ano[i]+= producao_mes[i][j];
        }
    }

     maior_m= producao_mes[0][7];        // VER QUEM MAIS PRODUZIU EM AGOSTO
     maior_e= 0;
     for (i= 0; i < qtde_e; i++) {

     maior_m= producao_mes[i][7];
     if (producao_mes[i][7] > maior_m) {

      maior_m= producao_mes[i][7];
      maior_e= i;
      } }
      maior_a= producao_ano[0];        // VER QUEM MAIS PRODUZIU NO ANO
      for (i= 0; i < qtde_e; i++) {

      if (producao_ano[i] > maior_a) {

      maior_a= producao_ano[i];
      } }
       printf( "%s%d%s%s","\nA maior producao no mes de agosto foi ",maior_m," da empresa ",empresas[maior_e] );

       printf( "%s%d%s%s","\nA maior producao anual foi  ",maior_a," da empresa ",empresas[maior_e]);


     printf("\n\n");
     printf("%s %40s\n\n", "NOME DA EMPRESA", "TOTAL ANUAL");
     for(i = 0; i < qtde_e; i++) {
        printf("%-50s %5d\n", empresas[i], producao_ano[i]);
     }



}

Quando voltar vou fazer mostrar qual mês produziu menos na empresa que teve o maior  total anual.

adicionado 0 minutos depois

@AnsiC Queria você do meu lado na prova HAHAHAHAHAH, quaser certeza que vou pegar DP em algoritmos, aquele inferno de pseudocodigo não entra na minha cabeça, Muito obrigado, logo mais posto o código feito ;)

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@AnsiC Na verdade encontrei essa função em um livro q estou estudando. Mais tarde, aqui no fórum mesmo, foi explicado a respeito dessa função e aí adotei ela p meus códigos. Como também foi explicado a respeito dela nesse livro

Unir as duas em uma só?

Segundo o q é explicado nesse livro:  "as duas diretivas não podem estar juntas em uma única leitura:

scanf("%*[^\n]%*c");

Isso porque, caso não existam caracteres ordinários antes do fim da linha, a primeira diretiva lerá 0 caracteres, provocando um erro de formato e interrompendo a leitura antes que o caractere de fim de linha seja lido"  (Francisco A. C. Pinheiro)

Link para o comentário
Compartilhar em outros sites

@MatheusINF Cara, se você está inda há pouco tempo estudando C não sei se seria um livro adequado p te indicar. Então fico com esse receio. Obs: Eu não cheguei a me empolgar a medida em q via os assuntos abordados no livro (mas essa foi minha experiência e também tem q questão de estar vendo o livro pela primeira vez )

Ao que parece, ele pode ser muito útil p quem já tem um pouco de experiência em C, mas apenas p complemento dos estudos.

Sinceramente não gostei da didática usada, principalmente na parte do autor mostrar códigos p exemplificar o que foi dito sobre tal assunto e aí quase deixar tudo mais confuso ainda

Mas se quiser arriscar: Elementos de Programação em C (Francisco A. C. Pinheiro)

Só q vou aproveitar e falar d outro livro q peguei essa semana:

Treinamento em Linguagem C (2ª edição) - (Victorine Viviane Mizrahi).

Só vi o primeiro capítulo ainda e já tô gostando muito. Esse sim recomendo!

É bom frisar q, se eu revisar os assuntos do livro Elementos de Programação em C , é bem provável q aí passe a gostar do mesmo e ver o livro de um modo bem diferente. Tem essa!

Deixo p você decidir, mas se fosse p recomendar aí seria o segundo livro mencionado

Link para o comentário
Compartilhar em outros sites

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