Ir para conteúdo
Fórum Script Brasil
  • 0

Tres Algoritmos.


VaNdo.WcG

Pergunta

Estou com tres algoritmos, acontece que estou com alguns probleminhas.

1. Escreva um programa em C para ler 20 nomes de pessoas na ordem direta (com até 30 caracteres cada) e imprima os nomes como foram lidos e na forma "sobrenome, nome"

Nesse exercicio consegui ler os 20 nomes com 30 caracteres, mas na hora de imprimilos invertido, com sobrenome e nome, como a professora explicou não deu, como eu faço, aqui esta o que eu fiz, mas apenas imprimi.

#include <stdio.h>
#include <conio.h>

main()
    {
    int CONT;
    char NOMES[20][30];
    
    for (CONT=1;CONT<=20;CONT++)
        {
        printf("Digite nome:\n");
        gets(NOMES[CONT]);
        }
    for (CONT=1;CONT<=20;CONT++)
        {
        printf("\nNome e sobrenome: %s",&NOMES[CONT]);
        }
    getch();
    }
2. Faça um programa que leia dois vetores que e R com 12 e 20 elementos inteiros (valores repetidos ou não) respectivamente e, determine o vetor W, onde W= intercesão entre que e R. Ao final o programa deve mostrar o vetor W obtido, lembrando que ele não pode ter elementos repetidos.
Nesse eu consegui formar W, mas como faço para não exibir os elementos repetidos. Meu codigo:
#include <stdio.h>
#include <conio.h>

main ()
    {    
    float que[12],R[20],W[12];
    int IQ,IR,IW,CONT;
    for (IQ=0;IQ<12;IQ++)
        {
        printf("Digite o valor %d do conjunto que: ",IQ+1);
        scanf("%f",&que[IQ]);
        }
    printf("\n");
    for (IR=0;IR<20;IR++)
        {
        printf("Digite o valor %d do conjunto R: ",IR+1);
        scanf("%f",&R[IR]);
        }
    IW=0;
    for (IR=0;IR<20;IR++)
        {
        for (IQ=0;IQ<12;IQ++)
            {
            if (que[IQ]==R[IR])
                 {
                     W[IW]=R[IR];
                     IW++;
                 }
            }
        }
    printf("\nNumeros do conjunto W:\n");
    for (IW=0;IW<12;IW++)
        {
        printf("\n%.1f. ",W[IW]);
        }
    getch();
    }

3. Deseja-se ler duas cadeis de N caracteres cada e verificar se uma é anagrama da outra, mostrando em seguida os pares que não são anagramas com a indicaçao "Não são anagramas"e os pares que são anagramas com a indicação "São anagramas".

Ex.: ROMA AMOR (São anagramas)

BOLA LOBO (Não são anagramas)

Nesse como eu faço? Descubro o tramanho da string e comparo letra por letra, contando a partir da primeira letra da primeira palavra e comparando com a ultima letra da segunda palavra?!

Obrigado.. aguardo a ajuda.

Editado por VaNdo.WcG
Link para o comentário
Compartilhar em outros sites

15 respostass a esta questão

Posts Recomendados

  • 0

O primeiro é assim:

#include <conio.h>
#include <stdio.h>

main(){
       int count;
       char nome[20][30],sobrenome[20][30];
       
       for(count=0;count<20;count++){
                                     printf("Digite o nome: ");
                                     scanf("%s %s",&nome[count],&sobrenome[count]);
                                     }
       
       for(count=0;count<20;count++){
                                    printf("\n%s, %s",sobrenome[count],nome[count]);
                                    }
       getch();
       
       }

Editado por adriel
Link para o comentário
Compartilhar em outros sites

  • 0
Guest Visitante

Esse eu já consegui obrigado, apesar de que não fiz bem assim, mais tarde posto como eu fiz.

Só não consegui fazer o exercicio do anagrama, como eu comparo letra por letra das duas palavras pra saber se uma tem todas as letras da outra?!

Obrigado.

Link para o comentário
Compartilhar em outros sites

  • 0

Uma das saidas é montar uma tabela em que cada posicao corresponde a uma letra. Dai, para cada caractere da primeira palavra voce incrementa a posicao desse caractere na tabela e para cada caractere da segunda palavra voce decrementa a posicao do caractere. Se depois que voce tiver terminado tiver alguma posicao na tabela que seja diferente de zero, as palavras não são anagramas. Caso contrario elas são.

Link para o comentário
Compartilhar em outros sites

  • 0

outra solucão:

- primeiro verifique se elas possuem o mesmo tamanho, se sim prossiga, se não, Não é anagrama.

- use um laco que vai de 0 até tamanho da string e dentro do laco compare as strings assim:

a string1 será indexada conforme esse laco, ou seja a cada interacão voce está em um caracter diferente.

a string2 deve ser indexada dentro de outro laco que vai de "index da string1" até tamanho da string.

quando voce achar o caracter de string1 em string2 voce deve troca-lo de posicao. Qual é a idéia?

fazer com que esse caracter não seja mais procurado. Ex:

.
.
.
for (i=0; i<tam; i++){
   for(j=i; j<tam; j++){
      if(string1[i] == string2[j]){
         aux = string2[j];
         string2[j] = string2[i];
         string[i] = aux; 
         break;
      }
   }
}
.
.
.

agora é só tratar uma coisa dentro desses lacos:

- se passar pelo segundo laco sem entrar no if, as strings não são anagramas.

aqui nesse algoritmo voce vai perder o conteúdo de string2, se as palavras forem anagramas, no final voce terá string1 = string2

ai se for importante esse valor, voce pode criar uma variavel que recebe uma cópia de string2.

Link para o comentário
Compartilhar em outros sites

  • 0

Mais uma ideia. Ordene as letras dentro das duas strings e compare-as com strcmp. Se devolver 0 elas são anagramas. Caso contrario não.

Link para o comentário
Compartilhar em outros sites

  • 0

Como eu ordeno as letras?!

use o bom e velho if, os caracteres são na verdade números, segundo a tabela ASCII por exemplo.

char caracter1 = 'a';
char caracter2 = 'b';

if( caracter1 < caracter2)
   printf("%c é menor que %c\n", caracter1, caracter2);
else
   printf("%c é maior que %c\n", caracter1, caracter2);

Quando for a vai pra frentre?!

se a ordenacão será decrescente ou crescente tanto faz, o que importa é que seja aplicado o mesmo método nas duas strings.

Link para o comentário
Compartilhar em outros sites

  • 0

Assim?!

for (i=0;i<=strlen(CADEIA1);i++)
                {
                if (CADEIA1[i]>CADEIA1[i+1])
                   {
                   HELP[i]=CADEIA1[i];
                   CADEIA1[i]=CADEIA1[i+1];
                   CADEIA1[i+1]=HELP[i];
                   }
                }

Só que num está imprimindo a ultima letra da cadeia desse modo.

Link para o comentário
Compartilhar em outros sites

  • 0

O mais fácil para ordernar é sem duvida o qsort da stdlib.h

#include <stdlib.h>

/*funcao de comparacao*/
int compara(const void *a, const void *b)
{
    char *aa = (char *)a;
    char *bb = (char *)b;
    return *a - *b;
}

...
qsort(palavra, strlen(palavra), sizeof(char), compara);
...

o qsort recebe um vetor a ser ordenado, no caso um vetor de chars, a quantidade de elementos no vetor (strlen(palavra)), o tamanho de cada elemento (sizeof (char)) e uma funcao de comparacao.

Normalmente o pessoal se perde um pouco nessa funcao, ela precisa obrigatoriamente retornar um inteiro e receber dois paramentros const void *.

Isso porque o qsort não sabe qual é o tipo de dado que você está arrumando.

Dentro da funcao, normalmente a primeira coisa que se faz é um cast explicito ( char *aa = (char *)a; ), mostrando ao compilador que a era um ponteiro para char. Não se esqueça de, quando ver a diferença fazer *aa para pegar o seu valor e não o ponteiro.

Espero não ter ido longe de mais, mas aprenda o qsort, ele vai ser útil!

Link para o comentário
Compartilhar em outros sites

  • 0

Bom, vamos lá, sinceramente não entendi muito bem as possibilidades que me passaram, mas ajudaram a desenvolver uma logica, gostaria que vissem se o que eu fiz é plauzivel ou não... O que eu fiz foi comparar todas as letras, letra por letra:

#include<stdio.h>
#include<conio.h>
#include<string.h>

main()
{
    int I,J,K=0;
    char NOME1[100],NOME2[100];
    printf("Digite a primeira palavra a ser comparada: ");
    gets(NOME1);  
    printf("Digite a segunda palavra a ser comparada: ");
    gets(NOME2);  
    for(I=0;I<strlen(NOME1);I++) /* Aqui compara as letras da primeira palara com as da segunda. */
        {  
        for(J=0;J<strlen(NOME2);J++)
            {
            if(NOME1[I]==NOME2[J])
            K++;
            }
        }
    if(K<strlen(NOME1)) /* Aqui, caso as letras da primeira palavra, sejam as mesmas da segunda, mesmo com ordem trocada, será anagrama, ou não. */
        printf("\nAs palavras %s e %s não são anagramas.",NOME1,NOME2);  
            else
                printf("\nAs palavras %s e %s são anagramas.",NOME1,NOME2); 
    getch();
}

Vlw pessoal, me ajudam pacas.

Link para o comentário
Compartilhar em outros sites

  • 0

A sua tentativa foi boa, mas ela fura se NOME1 for "aaaaa" e NOME2 for "bbbba". Ela vai dizer que as duas são anagramas porque pra cada letra da primeira ela varre a segunda procurando por aquela letra. Como a primeira so tem "a" e tem um "a" na segunda, ele sempre vai encontrar o "a" da segunda, incrementando K ateh strlen(NOME1) e vai dizer que "aaaaa" e "bbbba" são anagramas.

Tente pensar dessa forma: Comparar letras sem nenhuma regra de definicao entre elas é dificil. Se elas estiverem em alguma ordem especifica, fica bem mais facil. POr exemplo, se todas as letras da palavra estao ordenadas, é facil compara-las. Basta ir de um em um vendo se elas são iguais. Alem disso, para que uma palavra seja anagrama de outra, elas devem ter o mesmo numero de letras de cada tipo. OU seja, se uma tem 3 "a", a outra tambem deve ter 3 "a" e assim por diante. então, a ordem em que as letras estao na palavra não importa. Voce pode modifica-la a vontade. Por isso a ideia de ordena-las e depois verificar se as palavras são iguais. Aqui vai um exemplo:

Palavras originais:

s1="qpwoeiruty"

s2="yturieowpq"

Palavras ordenadas:

s1="eiopqrtuwy"

s2="eiopqrtuwy"

Conclusao:

Como são iguais, são anagramas.

faca o teste com algumas outras palavras e voce comecara a entender melhor como isso funciona. Depois, quando for implementar, use a ideia do Rafael no post #12 para ordenar suas palavras.

Link para o comentário
Compartilhar em outros sites

  • 0

Sem problemas. Primeiro preciso explicar o que é um ponteiro de funcao pra voce. Ponteiro de funcao nada mais é que uma funcao que voce passa como parametro para outra funcao. Confuso? Tenho um tutorial sobre isso em http://vidageek.net/2007/02/09/ponteiros-de-funcao/ e um sobre algoritmos genericos em http://vidageek.net/2007/04/27/dia-c-algoritmos-genericos/

Mas, se voce entendeu a ideia, já da pra irmos pra frente. O qsort da stdlib é uma implementacao do algoritmo QuickSort para ordenacao de vetores. O prototipo dele é desta forma:

qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *a, const void *b))
base é o seu vetor, no caso a palavra a ser ordenada (em C, void* significa que pode ser qualquer tipo de ponteiro) nmenb é um inteiro com o numero de posicoes ocupadas que tem o seu vetor size é um inteiro com o numero de bytes que cada posicao vai ter compar é um ponteiro para uma funcao com o seguinte prototipo:
int compara(const void *a, const void *b)
é meio feio e poluido, mas é um excelente recurso. A primeira coisa que devemos fazer é uma funcao de comparacao com o prototipo acima. Ela deve (por definicao) devolver 0 se as duas letras forem iguais, <0 se a letra em "a" for menor que a de "b" e >0 caso contrario. Vou escreve-la de forma um pouco mais explicita que o Rafael:
int compara(const void *a, const void *b){
     char letra1, letra2;
     /*primeiro temos que recuperar o valor das letras, porque não podemos trabalhar com o void* (ele não aceita comparacao*/
     letra1 = *((char *)a);
     letra2 = *((char *)b);
     /*nestas linhas, o que eu fiz foi informar pro C que eu quero que ele considere "a" e "b" como um ponteiro para char (char *) e depois recupere esse valor (com o *) */
     if (letra1 == letra2)
            return 0;
     else if (letra1 < letra2)
            return -1;
      else
            return 1;
}
Agora so precisamos chamar a funcao qsort com os parametros certos:
qsort(palavra, strlen(palavra), sizeof(char), compara)

palavra é uma string, que em C não passa de um vetor de char.

strlen devolve o numero de caracteres da palavra, ou seja, o numero de itens no vetor

cada caractere tem apenas sizeof(char) bytes (em C isso provavelmente vai dar 1)

e enfim, nossa funcao de comparacao, compara.

Se não tiver entendido, não se preocupe e pergunte de novo. Void* e ponteiros de funcao são coisas meio estranhas mesmo quando voce olha pela primeira vez (e varias outras vevzes mais tarde), mas são recursos que resolvem diversos outros problemas pra gente.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...