Ir ao conteúdo

Posts recomendados

Postado

Eaí galera, estou fazendo um programa em que dado dois conjuntos de números, preciso imprimir a uniao, intersecção e diferença dos dois conjuntos utilizando funções. Bom, acho que o meu raciocínio está tudo certo, mas não está printando os resultados. Queria saber qual é o problema.

 

#include <stdio.h>
#include <math.h>
 
 void uniao(float conjuntoA[], float conjuntoB[], int nelementosA, int nelementosB){
     int i, j;

     for(i = 0; i < nelementosA; i++){
         for(j = 0; j < nelementosB; j++){
             printf("%f %f \n", conjuntoA[i], conjuntoB[j]);
         }
     }
 }

 void intersecao(float conjuntoA[], float conjuntoB[], int nelementosA, int nelementosB){
     int i, j;

     for(i = 0; i < nelementosA; i++){
         for(j = 0; j < nelementosB; j++){
             if(conjuntoA[i] == conjuntoB[j]){
                 printf("%f\n", conjuntoA[i]);
             }
         }
     }

 }

 void diferenca(float conjuntoA[], float conjuntoB[], int nelementosA, int nelementosB){
     int i, j;

     for(i = 0; i < nelementosA; i++){
         for(j = 0; j < nelementosB; j++){
             if(conjuntoA[i] != conjuntoB[j]){
                 printf("%f\n", conjuntoA[i]);
             }
         }
     }

 }

 int main(){
     int conjA, conjB;
     float elementosA[29], elementosB[29];

     scanf("%d", &conjA);

     for(int i = 0; i <= conjA; i++){
         scanf("%f", &elementosA[i]);
     }
     
     scanf("%d", &conjB);

     for(int j = 0; j <= conjB; j++){
         scanf("%f", &elementosB[j]);
     }

     void uniao(float elementosA[], float elementosB[], int conjA, int conjB);
     void intersecao(float elementosA[], float elementosB[], int conjA, int conjB);
     void diferenca(float elementosA[], float elementosB[], int conjA, int conjB);

     return 0;
 }

 

Postado
     void uniao(float elementosA[], float elementosB[], int conjA, int conjB);
     void intersecao(float elementosA[], float elementosB[], int conjA, int conjB);
     void diferenca(float elementosA[], float elementosB[], int conjA, int conjB);

Acho que entendeu ao contrário a noção de protótipos. Essas linhas aí devem mostrar como são as funções que estão em uso em seu programa, e a PRIMEIRA função de seu programa é a tal main() claro. Isso é bom para você e mais ainda para alguém que vai tentar te ajudar, já que eu por exemplo não precisaria ficar procurando main() em seu programa se ele tivesse 1.000 linhas.

 

Muitas vezes as funções estão em outro arquivo ou você sequer tem o código delas, como o caso de printf() por exemplo. Então você cria um arquivo só com as declarações delas e inclui em seu programa, como o #include "stdio.h" em seu programa.

 

Algo assim serve

     void uniao(float[], float[], int , int );
     void intersecao(float[], float[], int, int);
     void diferenca(float[], float [], int, int );

Não precisa repetir ou inventar nomes de variáveis porque você só vai estar informando o tipo.

 

De volta ao programa:

 

Ele não está nada bom. Por exemplo a diferença: porque o seu código abaixo funcionaria? Para cada elemento de A você vai imprimir uma linha com o elemento de A se ele não for igual ao de B? E isso é a diferença? 

void diferenca(float conjuntoA[], float conjuntoB[], int nelementosA, int nelementosB){
     int i, j;

     for(i = 0; i < nelementosA; i++){
         for(j = 0; j < nelementosB; j++){
             if(conjuntoA[i] != conjuntoB[j]){
                 printf("%f\n", conjuntoA[i]);
             }
         }
     }
 }

Então se o primeiro elemento de A for igual ao último de B e você leu mesmo os 29 vai imprimir 28 vezes o cara? Sério?

 

Outra coisa: porque usou float? Eles são chatos para comparar por causa de erros de arredondamento. Não podia usar int que é mais seguro? Ex: 1.1 é igual a 1.10000001?

 

Note que você pode declarar os caras e dar um valor para eles, todos ou uma parte a partir do início, e assim testar seu programa mais depressa sem ter que ficar lendo, certo?

 

	float a_de_teste[29] =
	{
	    1., 2., 3., 4., 5., 6.,
	    1., 2., 3., 4., 5., 6. 
	};

Bonus

 

Abaixo seu  programa com o texto reformatado para a ordem que eu te expliquei e um vetor preenchido para você poder recortar e colar...image.png.91049314e034a778ab53f94c9e30a9b8.png

#include <stdio.h>
#include <math.h>

void diferenca(float [], float [], int , int );
void intersecao(float[], float[], int, int);
void uniao(float[], float[], int, int);

int main()
{
    int conjA, conjB;
    float elementosA[29], elementosB[29];

    float bonus[29] =
    {
        1., 2., 3., 4., 5., 6., 7., 8.,
        1., 2., 3., 4., 5., 6., 7., 8.,
        1., 2., 3., 4., 5., 6., 7., 8.,
        1., 2., 3., 4., 5.
    };

    scanf("%d", &conjA);

    for (int i = 0; i <= conjA; i++) {
        scanf("%f", &elementosA[i]);
    }

    scanf("%d", &conjB);

    for (int j = 0; j <= conjB; j++) {
        scanf("%f", &elementosB[j]);
    }
    return 0;
};

void uniao(float conjuntoA[], float conjuntoB[], int nelementosA, int nelementosB) {
    int i, j;

    for (i = 0; i < nelementosA; i++) {
        for (j = 0; j < nelementosB; j++) {
            printf("%f %f \n", conjuntoA[i], conjuntoB[j]);
        }
    }
};

void intersecao(float conjuntoA[], float conjuntoB[], int nelementosA, int nelementosB) {
    int i, j;

    for (i = 0; i < nelementosA; i++) {
        for (j = 0; j < nelementosB; j++) {
            if (conjuntoA[i] == conjuntoB[j]) {
                printf("%f\n", conjuntoA[i]);
            }
        }
    }
};

void diferenca(float conjuntoA[], float conjuntoB[], int nelementosA, int nelementosB) {
    int i, j;

    for (i = 0; i < nelementosA; i++) {
        for (j = 0; j < nelementosB; j++) {
            if (conjuntoA[i] != conjuntoB[j]) {
                printf("%f\n", conjuntoA[i]);
            }
        }
    }
};

 

Postado

Cara, muito obrigado ! Tinha entendido errado o conceito da diferença de conjuntos, irei corrigi-lo. 

 

Sobre o porque do float, é um exercício de faculdade e o professor disse para usar esse tipo de variável. E outra, eu sempre preferi mesmo colocar as funções depois da main só que nós precisamos enviar esse exercício para uma certa plataforma pro professor e monitor corrigir. Certa vez deu um erro no programa por causa disso e ela respondeu assim:

 

Citação

 

Esse erro acontece que voce chama uma funcao antes dela ser definida. Ai o compilador nao sabe que funcao eh essa.


Para resolver esse problema, coloque as funcoes antes da "main". 

 

 

De qualquer forma, obrigado ! 

Postado
25 minutos atrás, blvsman disse:

Certa vez deu um erro no programa por causa disso e ela respondeu assim:

 

Citação

 

Esse erro acontece que voce chama uma funcao antes dela ser definida. Ai o compilador nao sabe que funcao eh essa.


Para resolver esse problema, coloque as funcoes antes da "main". 

 

 

De qualquer forma, obrigado ! 

 

 

Bem, o que posso dizer é que ele está errado. Não coloque as funções antes. Para isso são os protótipos. E se vai colocar antes o que é aquilo no final do seu programa com os protótipos de novo?

 

Num projeto comum as funções estão mesmo em outro arquivo. A cada passo no desenvolvimento você compila só o que está alterando e usa aqueles arquivos .h para incluir as declarações das funções. Entenda isso. É um conceito importante.

 

  • Curtir 1

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