Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Isaias Tavares

Arca de Noé

Recommended Posts

Olá pessoal, estava resolvendo o seguinte exercício e surgiu várias dúvidas.

 

Arca de noé do século 21

 

Noé recebeu uma mensagem dos céus de que o mundo vai acabar e que ele deve construir uma nave espacial para que possa levar consigo para outro planeta um casal de animais de cada espécie. Para isso, a coleta dos animais será dividida em duas etapas: coleta no hemisfério sul e coleta no hemisfério norte. Noé solicitou um software em que os animais das duas coletas deverão ser cadastrados informando a espécie e o peso do casal. Posteriormente deve ser gerada uma lista excluindo os animais repetidos para que Noé não leve animais repetidos. Devido ao balanceamento de carga da nave, Noé precisa ainda que esta lista esteja ordenada do animal mais pesado para o menos pesado.

 

Nesse exercicio ele não me fala a quantidade de espécies que vou ler, ou seja, não definir o tamanho do vetor. Eu pensei que dava pra declarar a variavel, por exemplo, assim: especie_hs[], mas nao da certo. Tive que colocar um limite no vetor. Se possivel, gostaria que alguem me explicasse como faço para ler um vetor que nao tem tamanho definido.

 

Segue abaixo minha tentativa de fazer esse programa rodar, mas não ta dando certo, não aparece nenhum erro, apenas aparece uma caixa de mensagem dizendo que o programa parou de funcionar e que o Windows está procurando uma solução para o problema. Se alguem puder me ajudar, desde ja agradeço.

 

#include <stdio.h>
int main ()
{
   int i, j, f, aux, aux2, aux3, igual;
   float peso_hs[100], peso_hn[100], peso_final[100];
   char especie_hs[100], especie_hn[100], especie_final[100];
   printf("Coleta no Hemisfério Sul, digite 0 para sair\n");
   while(especie_hs != 0) {
       printf("Informe a espécie do casal:\n");
       scanf("%s", especie_hs[i]);
       printf("Informe o peso do casal:\n");
       scanf("%f", &peso_hs[i]);
       i++;
   }
   printf("Coleta no Hemisfério Norte, digite 0 para sair\n");
   while(especie_hn != 0) {
       fflush(stdin);
       printf("Informe a espécie do casal:\n");
       scanf(" %s", especie_hn[j]);
       printf("Informe o peso do casal:\n");
       scanf("%f", &peso_hn[j]);
       j++;
   }
   f=0;
   aux=0;
   while(aux<i) {
       especie_final[f] = especie_hs[aux];
       peso_final[f] = peso_hs[aux];
       f++;
       aux++;
   }
   aux=0;
   aux2=0;
   while(aux<i) {
       while(aux2<j) {
           igual=0;
           if (especie_hn[aux] == especie_final[aux2]) {
               igual=1;
           }
           aux2++;
       }
       if (igual == 0) {
           especie_final[f] = especie_hn[aux];
           peso_final[f] = peso_hn[aux];
           f++;
       }
       aux++;
   }
   for (i=0; i<f; i++) {
       for (j=0; j<f; j++) {
           if (peso_final[i] < peso_final[i+1]) {
               aux3 = peso_final[i];
               peso_final[i] = peso_final[i+1];
               peso_final[i+1] = aux3;
           }
       }
   }
   for (i=0; i<f; i++) {
       printf("Espécie: %s\n", especie_final[i]);
       printf("Peso da espécie: %f\n", peso_final[i]);
   }
   return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu esqueci de inicializar o i=0; e o j=0; Mas mesmo assim nao ta dando certo.

 

Resumindo: o que eu gostaria de saber mesmo e como armazenar uma quantidade indeterminada de nomes em uma variavel, e imprimi-los em ordem decrescente

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para trabalhar com um número indefinido de strings, você tem que usar alocação dinâmica.

 

pesquise por linked lists ou stacks (olhe qual é melhor para o que está fazendo), alocadas dinamicamente, e sua implementação em C.

 

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu andei pesquisando, mas isso é muito complexo, e eu ainda sou noob em C pra aprender tudo isso. Por isso to procurando algo mais básico.

 

Estou tentando fazer esse exercicio com struct. Ficou assim:

 

#include <stdio.h>
struct animaishs {
   char especie_hs[20];
   float peso_hs;
};
struct animaishn {
   char especie_hn[20];
   float peso_hn;
};
struct animaisfinal {
   char especie_final[20];
   float peso_final;
};
int main ()
{
   int i, j, f, igual;
   struct animaishs func[3];
   printf("Coleta no Hemisfério Sul\n\n");
   for (i=0; i<3; i++) {
       printf("Informe a espécie do casal %d:\n", i + 1);
       scanf("%s", &func[i].especie_hs);
       printf("Informe o peso do casal %d:\n", i + 1);
       scanf("%f", &func[i].peso_hs);
   }
   struct animaishn func1[3];
   printf("\nColeta no Hemisfério Norte\n\n");
   for (j=0; j<3; j++) {
       printf("Informe a espécie do casal %d:\n", j + 1);
       scanf("%s", &func1[j].especie_hn);
       printf("Informe o peso do casal:\n");
       scanf("%f", &func1[j].peso_hn);
   }
   struct animaisfinal func2[6];
   f=0;
   for (i=0; i<3; i++) {
       func2[f].especie_final = func[i].especie_hs;
       func2[f].peso_final = func[i].peso_hs;
       f++;
   }
   for (i=0; i<3; i++) {
       for (j=0; j<3; j++) {
           igual=0;
           if (func1[j].especie_hn == func[i].especie_hs) {
               igual=1;
           }
           if (igual == 0) {
               func2[f].especie_final = func1[j].especie_hn;
               func2[f].peso_final = func1[f].especie_hn;
               ++f;
           }
       }
   }
   while (f > 0) {
       printf("-----------------------------------\n");
       printf("Espécie do casal: %s ", &func2[f].especie_final);
       printf("\nPeso do casal: %f \n", func2[f].peso_final);
       printf("-----------------------------------\n");
       printf("\n");
       f--;
   }
   return 0;
}

 

só que aparece os seguintes erros:

 

C:\Users\Isaias\Desktop\teste.c||In function 'main':|

C:\Users\Isaias\Desktop\teste.c|36|error: incompatible types when assigning to type 'char[20]' from type 'char *'|

C:\Users\Isaias\Desktop\teste.c|47|error: incompatible types when assigning to type 'char[20]' from type 'char *'|

C:\Users\Isaias\Desktop\teste.c|48|error: incompatible types when assigning to type 'float' from type 'char *'|

||=== Build finished: 3 errors, 0 warnings ===|

 

E o exercício pede pra imprimir em ordem decrescente, eu não sei como faz isso? tem como me dar uma luz?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você está imprimindo uma string com %f, use %s.

 

E você está passando um ponteiro para char[20] ao invés de ponteiro para char. Ou seja:

 

scanf("%s", &func1[j].especie_hn); // ERRADO

 

O certo é:

 

scanf("%s", func1[j].especie_hn);

 

Você pode considerar o nome do vetor como um ponteiro para o seu primeiro elemento, ou seja, um ponteiro para um char, para a string.

 

 

Alocação dinâmica é sim mais complexo, mas é o único modo de conseguir fazer isso sem um limite de tamanho.

 

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

acho que você está confundindo, o que eu estou imprimindo em %f é o peso e o peso não é uma string.

 

ao colocar %s eu retirei o & como você falou, mas continua dando o mesmo erro.

 

Como eu não vi ainda alocação dinamica e não consegui entender nada no site que você me mandou o link, vou tentar fazer esse exercicio estabelecendo um limite de tamanho.

 

Não entendi direito essa parte:

 

Você pode considerar o nome do vetor como um ponteiro para o seu primeiro elemento, ou seja, um ponteiro para um char, para a string.

 

Ainda não aprendi ponteiros, se você puder me explicar melhor, fico grato, de preferencia com exemplo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não dá para explicar ponteiros em um post, ache um livro sobre C e estude a respeito. É uma das features mais importantes da C, você não pode dizer que aprendeu C se não entende ponteiros.

 

O que eu falei sobre float era sobre o erro que o compilador mandou, nem olhei na source:

 

C:\Users\Isaias\Desktop\teste.c|48|error: incompatible types when assigning to type 'float' from type 'char *'|

 

O que eu falei sobre vetores é porque eles estão intimamente ligados com ponteiros, quando estudar eles vai aprender essa ligação. Por enquanto apenas precisa saber que quando for passar um "%s" para o scanf, você não coloca o operador de endereço (o &) no vetor da string.

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

ah sim. Eu corrigi os erros que você falou, e realmente eu estava comparando errado. Foi erro de digitação meu. Mas agora ta aparecendo os seguintes erros:

 

C:\Users\Isaias\Desktop\teste.c||In function 'main':|

C:\Users\Isaias\Desktop\teste.c|36|error: incompatible types when assigning to type 'char[20]' from type 'char *'|

C:\Users\Isaias\Desktop\teste.c|47|error: incompatible types when assigning to type 'char[20]' from type 'char *'|

||=== Build finished: 2 errors, 0 warnings ===|

 

Esses eu não estou entendo, os erros são nas seguintes linhas de código:

 

        func2[f].especie_final = func[i].especie_hs;

 

                func2[f].especie_final = func1[j].especie_hn;

 

Não entendi pq eu não posso comparar as duas, sendo q as duas são strings.

Compartilhar este post


Link para o post
Compartilhar em outros sites

hum... eu achei que podia.

 

A lógica que eu quero usar é armazenar os animais do hemisferio sul e os animais do hemisferio norte tudo em um vetor para poder imprimi-lo em ordem decrescente depois. Mas não sei como fazer isso sem ser do jeito que coloquei.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.