Ir ao conteúdo

Comparação de variáveis tipo char


Pedrohov

Posts recomendados

Postado

Olá, eu sou iniciante em programação e utilizo a linguagem C, na verdade meu curso não é voltado para programação mas algoritmo é uma matéria muito importante nele.

Eu estou estudando laços de repetição e teve um exercício que deu um erro estranho o qual nenhum dos meus colegas de classe está entendendo o porquê, e como a faculdade está de greve, não é possível consultar monitores nem o professor.

O programa pede para ler um conjunto A de 10 caracteres, um conjunto B de 5 caracteres e exibir o conjunto interseção e união entre A e B.

Eu bolei um código aqui que supriu o problema do conjunto interseção.

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

int main (void)
{
// Declaração de variáveis:
char A[10];
char B[10];
char repetidos[5];
char uniao[15];
int i, j, k;

// Entrada de dados:
printf("Digite os carecteres do conjunto A:\n");
for(i=0; i<10; i++)
{
printf("Digite o %do caractere do conjunto: ",i+1);
scanf("%c",&A[i]);
fflush(stdin);
}
printf("\nDigite os caracteres do conjunto B:\n");
for(i=0; i<5; i++)
{
printf("Digite o %do caractere do conjunto: ",i+1);
scanf("%c",&B[i]);
fflush(stdin);
}

// Determinar conjunto interseção:
k=0;
for(j=0; j<10; j++)
for(i=0; i<5; i++)
if(B[i]==A[j])
{
repetidos[k]=B[i];
k++;
}

for(j=0; j<k; j++)
printf("%c\n", repetidos[j]);

// Retorno:
system("pause");
return 0;
}

Mas quando terminei o código implementando o conjunto união, tudo dá errado, inclusive a interseção que tava certinha!

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

int main (void)
{
// Declaração de variáveis:
char A[10];
char B[10];
char repetidos[5];
char Af[10];
char Bf[5];
int i, j, k, m, n;

// Entrada de dados:
printf("Digite os carecteres do conjunto A:\n");
for(i=0; i<10; i++)
{
printf("Digite o %do caractere do conjunto: ",i+1);
scanf("%c",&A[i]);
fflush(stdin);
}
printf("\nDigite os caracteres do conjunto B:\n");
for(i=0; i<5; i++)
{
printf("Digite o %do caractere do conjunto: ",i+1);
scanf("%c",&B[i]);
fflush(stdin);
}

// Determinar conjunto interseção:
k=0;
for(j=0; j<10; j++)
for(i=0; i<5; i++)
if(B[i]==A[j])
{
repetidos[k]=B[i];
k++;
}

// Determinar conjunto união:
m=0; n=0;
for(j=0; j<10; j++)
for(i=0; i<k; i++)
if(A[j]!=repetidos[i])
{
Af[m]=A[j];
m++;
}
for(j=0; j<5; j++)
for(i=0; i<k; i++)
if(B[j]!=repetidos[i])
{
Bf[n]=A[j];
n++;
}

// Exibir conjunto união:
printf("Conjunto uniao:\n");
for(j=0; j<m; j++)
printf("%c\n", Af[j]);
for(j=0; j<n; j++)
printf("%c\n", Bf[j]);
for(j=0; j<k; j++)
printf("%c\n", repetidos[j]);

// Exibir conjunto interseção:
printf("\nConjunto intersecao:\n");
for(j=0; j<k; j++)
printf("%c\n", repetidos[j]);

// Retorno:
system("pause");
return 0;
}

Se alguém puder dar uma olhada e me sugerir alguma alternativa ou encontrar algum erro na parte de união dos conjuntos, por favor, me fale.

Obrigado!

Postado

Bom, pra se organizar talvez fosse melhor fazer com funções

ex:

char *Uniao(char *a, char *b, char *retornar);

Eu vou tentar achar aqui, um jeito de alterar as funções.. :)

edit: aqui está o código da função para a intersecção

char *interseccao(char *a, char *b, char *res)
{
int i, j, l=0, m, n;
int teste=0;
char ch[20+1]="";
for(i=0, n=0; i<10; i++)
{
for(j=0; j<10; j++)
{
if(a[i]==b[j])
{
for(m=0, teste=0; ch[m]!='\0'; m++)
{
if(b[j]==ch[m])
{
teste=1;
break;
}
}
if(teste!=1)
{
res[l++]=a[i];
ch[n++]=a[i];
m=0;
}
}
}
}
res[l]='\0';
return res;
}

De longe, a maior dor de cabeça, é relacionada ao laço de "exclusão" pois o conjunto NÃO PODE ter um numero repetido.

Ex: A={1,2,3} e B={1,2,5}. Intersecção de A em B é {1,2} não {1,2,1,2} entende?

Talvez isso já lhe ajude com o de união (já que me pareceu que entra neste erro =/, o de repetir o mesmo numero varias vezes, mesmo ele já estando lá) e em terminar o programa.

Quanto ao erro, não sei o que foi, então também não posso lhe ajudar a achar o erro =/

ps: o código me parece bem "sujo", mas não sei como resolver isso XD. Alguém com mais experiência, por outro lado..

Postado

Obrigado! Realmente tá dando esse problema dos caracteres repetirem, só quebrar a cabeça nele mais um pouco e eu acho que consigo.

Você disse que o código parece "sujo", você fala quanto a má estrutura dele? Tipo, difícil de entender ou mal feito, se tiver algumas dicas pra eu melhorar isso, por favor, me fale. Aprender algoritmo e lógica tem sido uma meta ultimamente xD

Eu percebi que você usou "*" antes de declarar os vetores e usou o "\o" pra finalizar, isso pra mim ainda é um monstro, mas tô quase entendendo a função direitinho xD

A última coisa que eu tenho que fazer nesse exercício é fazer a determinação do conjunto união e do conjunto intersecção virarem funções. Eu posso mandar um vetor inteiro para uma função e retornar outro?

Desculpe pelo tanto de perguntas, eu sei que elas fogem um pouco ao tópico, mas isso vai me ajudar muito com a questão em geral.

Olha só o resultado, definitivamente o único porém agora são os números repetirem no união:

668zev.jpg

Código:


#include <stdlib.h>
int main (void)
{
// Declaração de variáveis:
char A[10];
char B[10];
char repetidos[5];
char uniao[15];
int i, j, k,t;

// Entrada de dados:
printf("Digite os carecteres do conjunto A:\n");
for(i=0; i<10; i++)
{
printf("Digite o %do caractere do conjunto: ",i+1);
scanf("%c",&A[i]);
fflush(stdin);
}
printf("\nDigite os caracteres do conjunto B:\n");
for(i=0; i<5; i++)
{
printf("Digite o %do caractere do conjunto: ",i+1);
scanf("%c",&B[i]);
fflush(stdin);
}

// Determinar conjunto interseção:
k=0;
for(j=0; j<10; j++)
for(i=0; i<5; i++)
if(B[i]==A[j])
{
repetidos[k]=B[i];
k++;
}

// Exibir conjunto intersecção:
printf("\nConjunto interseccao:\n");
for(j=0; j<k; j++)
printf("%c ", repetidos[j]);
printf("\n");

// Determinar conjunto união:
t=0;
for(j=0; j<10; j++)
{
for(i=0; i<k; i++)
if(repetidos[i]==A[j] && repetidos[i]==B)
{
j++;
}
else
{
uniao[t]=A[j];
t++;
if(j<5)
{
uniao[t]=B[j];
t++;
}
}
}

// Exibir conjunto união:
printf("\nConjunto uniao:\n");
for(j=0; j<t; j++)
printf("%c ",uniao[j]);

// Retorno:
system("pause");
return 0;
}
#include <stdio.h>

Postado

Claro! Quando puder.

Eu terminei de um modo aqui, mas ele nem sempre dá certo...

Uma das ocasiões que funciona:

:lol:

2554yte.jpg

Código:


#include <stdlib.h>

int main (void)
{
// Declaração de variáveis:
char A[10];
char B[5];
char uniao[15];
char repetidos[5];
int i, j, k, t;

// Entrada de dados:
printf("Digite os carecteres do conjunto A:\n");
for(i=0; i<10; i++)
{
printf("Digite o %do caractere do conjunto: ",i+1);
scanf("%c",&A[i]);
fflush(stdin);
}
printf("\nDigite os caracteres do conjunto B:\n");
for(i=0; i<5; i++)
{
printf("Digite o %do caractere do conjunto: ",i+1);
scanf("%c",&B[i]);
fflush(stdin);
}

// Determinar conjunto interseção:
k=0;
for(j=0; j<10; j++)
for(i=0; i<5; i++)
if(B[i]==A[j])
{
repetidos[k]=B[i];
k++;
}

// Exibir conjunto intersecção:
printf("\nConjunto interseccao:\n");
for(j=0; j<k; j++)
printf("%c ", repetidos[j]);
printf("\n");

// Determinar o conjunto união:
t=0;
printf("\nConjunto uniao:\n");
if(k>0)
for(j=0; j<k; j++)
{
for(i=0; i<5; i++)
if(repetidos[j]!=B[i])
{
uniao[t]=B[i];
t++;
}
for(i=0;i<10;i++)
if(repetidos[j]!=A[i])
{
uniao[t]=A[i];
t++;
}
}


// Exibir o conjunto união:
for(j=0; j<t; j++)
printf("%c ",uniao[j]);
printf("\n");

// Retorno:
system("pause");
return 0;
}
#include <stdio.h>

Postado

Obrigado pelo código! Utilizar a variável 'cont' deixou bem simples de entender, vou começar a utilizar também ao invés de fazer bagunça com i e j.

A única parte que não funcionou como o esperado foi o da união, se exibir ambos conjuntos, A e B, não é união, infelizmente. :/

"Por exemplo:

Se A = {1, 2, 3} e B = {4 ,5}, então A U B = {1, 2, 3, 4, 5}

Se A = {1, 2, 3} e B = {1, 2, 4, 5}, então A U B = {1, 2, 3, 4, 5} . Note que os elementos do conjunto não são repetidos."

http://pt.wikipedia.org/wiki/Uni%C3%A3o_(matem%C3%A1tica)

printf("\n\nUniao dos dois conjuntos:\n");
for( cont = 0; cont < 5; cont++)
{
printf("%c",A[cont]);
}
for( cont = 0; cont < 5; cont++)
{
printf("%c",B[cont]);
}

vnfjw4.jpg

Nesse caso ele deveria mostrar: 12345c

Postado

Bom, acho que eu devia ter comentado o meu código.. e quanto a código "sujo" me referi ao fato do código que fiz estar muito grande, quando provavelmente poderia ter feito menor.. e provavelmente está mais lento do que poderia estar =/

Quanto a repetição, talvez, apenas talvez, esta parte do código pode resolver:

for(m=0, teste=0; ch[m]!='\0'; m++)
{
if(b[j]==ch[m])
{
teste=1;
break;
}
}
if(teste!=1)
{
res[l++]=a[i];
ch[n++]=a[i];
m=0;
}

no caso, caso o caractere exista no vetor ch[], ele não irá ser adicionado ao vetor res, no caso o final.. talvez isso resolva :)

Postado

Olá,

Para encontrar o conjunto união não basta apenas imprimir os valores de cada conjunto, é necessária uma comparação para saber se cada elemento de cada conjunto (A e B) ainda não foi previamente inserido no conjunto união.

Segue o código que eu fiz para encontrar o conjunto união (ele está trabalhando com o conjunto A com tamanho 3 e o conjunto B com tamanho 5, para alterar os tamanhos basta apenas alterar a linha do DEFINE que corresponde ao tamanho de cada conjunto):


#include <stdio.h>

#define TAMANHO_CONJUNTO_A 3
#define TAMANHO_CONJUNTO_B 5

void entradaDeDados(char[], int, char);
void encontrarConjuntoUniao(char[], int *, char[], int, char[], int);
int existeNoVetor(char[], int, char);

int main() {
char conjuntoA[TAMANHO_CONJUNTO_A];
char conjuntoB[TAMANHO_CONJUNTO_B];
char uniao[TAMANHO_CONJUNTO_A + TAMANHO_CONJUNTO_B];
int i, tamanhoConjuntoUniao = 0;

entradaDeDados(conjuntoA, TAMANHO_CONJUNTO_A, 'A');
entradaDeDados(conjuntoB, TAMANHO_CONJUNTO_B, 'B');

encontrarConjuntoUniao(uniao, &tamanhoConjuntoUniao, conjuntoA, TAMANHO_CONJUNTO_A, conjuntoB, TAMANHO_CONJUNTO_B);

printf("\tConjunto Uniao\n\n");

printf("[");
for (i = 0; i < tamanhoConjuntoUniao; i++) {
if (i == 0) {
printf("%c", uniao[i]);
} else {
printf(", %c", uniao[i]);
}
}
printf("]\n");
return 0;
}

void entradaDeDados(char vetor[], int tamanhoVetor, char identificador) {
int i;

for (i = 0; i < tamanhoVetor; i++) {
printf("Informe o %do caractere do conjunto %c: ", i + 1, identificador);
scanf(" %c", &vetor[i]);
}

printf("\n\n");
}

void encontrarConjuntoUniao(char uniao[], int *tamanhoConjuntoUniao, char conjuntoA[], int tamanhoConjuntoA, char conjuntoB[], int tamanhoConjuntoB) {
int indiceConjuntoUniao = 0, i;

for (i = 0; i < tamanhoConjuntoA; i++) {
if (!existeNoVetor(uniao, indiceConjuntoUniao, conjuntoA[i])) {
uniao[indiceConjuntoUniao] = conjuntoA[i];
indiceConjuntoUniao++;
}
}

for (i = 0; i < tamanhoConjuntoB; i++) {
if (!existeNoVetor(uniao, indiceConjuntoUniao, conjuntoB[i])) {
uniao[indiceConjuntoUniao] = conjuntoB[i];
indiceConjuntoUniao++;
}
}

*tamanhoConjuntoUniao = indiceConjuntoUniao;
}

int existeNoVetor(char vetor[], int tamanhoVetor, char elemento) {
int i;
for (i = 0; i < tamanhoVetor; i++) {
if (vetor[i] == elemento) {
return 1;
}
}
return 0;
}

Espero ter ajudado.

Postado
é, tem razão, vou ter que voltar para a escola, rss.

Que nada! São as coisas mais simples que a gente mais confunde ou esquece ^^

Bom, acho que eu devia ter comentado o meu código.. e quanto a código "sujo" me referi ao fato do código que fiz estar muito grande, quando provavelmente poderia ter feito menor.. e provavelmente está mais lento do que poderia estar =/

Quanto a repetição, talvez, apenas talvez, esta parte do código pode resolver:

for(m=0, teste=0; ch[m]!='\0'; m++)
{
if(b[j]==ch[m])
{
teste=1;
break;
}
}
if(teste!=1)
{
res[l++]=a[i];
ch[n++]=a[i];
m=0;
}

no caso, caso o caractere exista no vetor ch[], ele não irá ser adicionado ao vetor res, no caso o final.. talvez isso resolva :)

Obrigado pela ajuda! Eu fiquei meio perdido com as variáveis trocando de valor dentro do conjunto tipo res[l++] e usar uma variável de teste realmente é o "tcham!" que deixa a coisa mais entendível, por assim dizer xD

Olá,

Para encontrar o conjunto união não basta apenas imprimir os valores de cada conjunto, é necessária uma comparação para saber se cada elemento de cada conjunto (A e B) ainda não foi previamente inserido no conjunto união.

Segue o código que eu fiz para encontrar o conjunto união (ele está trabalhando com o conjunto A com tamanho 3 e o conjunto B com tamanho 5, para alterar os tamanhos basta apenas alterar a linha do DEFINE que corresponde ao tamanho de cada conjunto):


#include <stdio.h>

#define TAMANHO_CONJUNTO_A 3
#define TAMANHO_CONJUNTO_B 5

void entradaDeDados(char[], int, char);
void encontrarConjuntoUniao(char[], int *, char[], int, char[], int);
int existeNoVetor(char[], int, char);

int main() {
char conjuntoA[TAMANHO_CONJUNTO_A];
char conjuntoB[TAMANHO_CONJUNTO_B];
char uniao[TAMANHO_CONJUNTO_A + TAMANHO_CONJUNTO_B];
int i, tamanhoConjuntoUniao = 0;

entradaDeDados(conjuntoA, TAMANHO_CONJUNTO_A, 'A');
entradaDeDados(conjuntoB, TAMANHO_CONJUNTO_B, 'B');

encontrarConjuntoUniao(uniao, &tamanhoConjuntoUniao, conjuntoA, TAMANHO_CONJUNTO_A, conjuntoB, TAMANHO_CONJUNTO_B);

printf("\tConjunto Uniao\n\n");

printf("[");
for (i = 0; i < tamanhoConjuntoUniao; i++) {
if (i == 0) {
printf("%c", uniao[i]);
} else {
printf(", %c", uniao[i]);
}
}
printf("]\n");
return 0;
}

void entradaDeDados(char vetor[], int tamanhoVetor, char identificador) {
int i;

for (i = 0; i < tamanhoVetor; i++) {
printf("Informe o %do caractere do conjunto %c: ", i + 1, identificador);
scanf(" %c", &vetor[i]);
}

printf("\n\n");
}

void encontrarConjuntoUniao(char uniao[], int *tamanhoConjuntoUniao, char conjuntoA[], int tamanhoConjuntoA, char conjuntoB[], int tamanhoConjuntoB) {
int indiceConjuntoUniao = 0, i;

for (i = 0; i < tamanhoConjuntoA; i++) {
if (!existeNoVetor(uniao, indiceConjuntoUniao, conjuntoA[i])) {
uniao[indiceConjuntoUniao] = conjuntoA[i];
indiceConjuntoUniao++;
}
}

for (i = 0; i < tamanhoConjuntoB; i++) {
if (!existeNoVetor(uniao, indiceConjuntoUniao, conjuntoB[i])) {
uniao[indiceConjuntoUniao] = conjuntoB[i];
indiceConjuntoUniao++;
}
}

*tamanhoConjuntoUniao = indiceConjuntoUniao;
}

int existeNoVetor(char vetor[], int tamanhoVetor, char elemento) {
int i;
for (i = 0; i < tamanhoVetor; i++) {
if (vetor[i] == elemento) {
return 1;
}
}
return 0;
}

Espero ter ajudado.

Muito obrigado pelo código! Era exatamente o que eu procurava! A função existeNoVetor me fez ver onde eu estava errando, não me admira que o programa repetia diversas vezes os números :lol:

rwkug0.jpg

Uma última print do programa funcionando (agora corretamente).

Agora é deixar o programa mais apresentável e distribuir tudo por funções como o D13g0 fez, abaixo como o código está.

Código:


#include <stdlib.h>

int existeNoVetor(char conjunto[], int indice, char elemento);

int main (void)
{
// Declaração de variáveis:
char A[10];
char B[5];
char uniao[15];
char intersecao[5];
int i, j, k;

// Entrada de dados:
printf("Digite os carecteres do conjunto A:\n");
for(i=0; i<10; i++)
{
printf("Digite o %do caractere do conjunto: ",i+1);
scanf("%c",&A[i]);
fflush(stdin);
}
printf("\nDigite os caracteres do conjunto B:\n");
for(i=0; i<5; i++)
{
printf("Digite o %do caractere do conjunto: ",i+1);
scanf("%c",&B[i]);
fflush(stdin);
}

// Determinar conjunto interseção:
k=0;
for(j=0; j<10; j++)
for(i=0; i<5; i++)
if(B[i]==A[j])
{
intersecao[k]=B[i];
k++;
}

// Exibir conjunto interseção:
printf("\nConjunto intersecao:\n");
for(j=0; j<k; j++)
printf("%c ", intersecao[j]);
printf("\n");

// Determinar o conjunto união:
int indiceConjuntoUniao=0;
for(i=0; i<10; i++)
if(!existeNoVetor(uniao, indiceConjuntoUniao, A[i]))
{
uniao[indiceConjuntoUniao]=A[i];
indiceConjuntoUniao++;
}
for(i=0; i<5; i++)
if(!existeNoVetor(uniao, indiceConjuntoUniao, B[i]))
{
uniao[indiceConjuntoUniao]=B[i];
indiceConjuntoUniao++;
}

// Exibir conjunto união:
printf("\nConjunto uniao:\n");
for(i=0; i<indiceConjuntoUniao; i++)
printf("%c ",uniao[i]);

// Retorno:
system("pause");
return 0;
}

int existeNoVetor(char conjunto[], int indice, char elemento)
{
int i;
for(i=0; i<indice; i++)
if(conjunto[i]==elemento)
{
return 1;
}
return 0;
}
#include <stdio.h>

Obrigado a todos que ajudaram!

Arquivado

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

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

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!