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

[RESOLVIDO]-[DÚVIDA] Ordem alfabética com Ponteiros - Linguagem C


JuanIBF

Pergunta

Bom dia, Boa tarde, e Boa noite a todos.

Venho aqui para tentar esclarecer uma dúvida minha em que não estou conseguindo solucionar. Meu professor passou um exercício em que seria necessário criar uma matriz para armazenar 10 strings e depois ordena-las alfabeticamente, mas claro usando ponteiros. Eu vi algumas resoluções no fórum e só achei do tipo que usa o comando strcmp mas não é desse que preciso. Já fiz a parte do código para receber as strings e armazena-las na matriz, apenas não sei como proceder para orderna-la alfabeticamente com o uso de ponteiros.

Se puderem ao menos me dar um norte ou um exemplo já ajudaria.

Agradeço a qualquer um que tenha a disposição de ajudar.

OBS.: Necessita ser obrigatoriamente na Linguagem C, e não em C++.

OBS².: Aqui está o enunciado da questão:

1. Leia 10 strings para uma matriz de string. Ordene e imprima as strings em ordem alfabética usando ponteiros.

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

6 respostass a esta questão

Posts Recomendados

  • 0

Não entendo a pergunta. você teria uma matriz de ponteiros? Ou simplesmente apontar os dados da matriz a ser comparado por ponteiros? Coisa que vejo, perdão, um pouco estúpida e sem sentido.
Não há mais dados no enunciado?

Link para o comentário
Compartilhar em outros sites

  • 0
1 minuto atrás, vangodp disse:

Não entendo a pergunta. você teria uma matriz de ponteiros? Ou simplesmente apontar os dados da matriz a ser comparado por ponteiros? Coisa que vejo, perdão, um pouco estúpida e sem sentido.
Não há mais dados no enunciado?

Eu tenho uma matriz de strings.

Ex.:

M[4][10]={

a,v,e,n,i,d,a,

b,r,a,s,i,l,

a,l,f,a,b,e,t,o,

h,o,l,a,n,d,a, 

}

E eu quero ordena-las em ordem alfabetica com ponteiros. Coisa que é facil de fazer com o comando strcmp. Mas a atividade pede especificamente com ponteiros.

Eis a questão: 

1. Leia 10 strings para uma matriz de string. Ordene e imprima as strings em ordem alfabética usando ponteiros.

Link para o comentário
Compartilhar em outros sites

  • 0

Bom. O que eu consegui fazer até agora foi ordenar pela letra inicial de cada string. Abaixo está o código. Alguém tem alguma ideia pra melhorar? Para ordenar por mais caracteres, usar os ponteiros de outra forma, etc...

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

void main()
{
    char m[10][50],ma[10][50];
    char *p,c;
    int V[10]={0},aux[10]={0};
    int i,j,temp,y;

    for(i=0;i<10;i++){
        printf("\n Digite a string N.%d : ",i+1);
        gets(m[i]);                     // Onde são gravadas as strings.
    }

    for(i=0;i<10;i++){
        p=m[i];                         // Ponteiro.
        c=(char)*p;                     // Digo que so vou pegar o primeiro caractere da string.
        V[i]=(int)c;                    // Digo que o elemento do vetor será o codigo ASCII do caractere.
        aux[i]=V[i];                    // Pego um vetor auxiliar para meios de comparação.
    }

    for( i=0; i<10; i++ ){              // Acontece a reformulação crescente do vetor V.
        for( j=i+1; j<10; j++ ){
            if( V[i] > V[j] ){
                temp = V[i];
                V[i] = V[j];
                V[j] = temp;
            }
        }
    }

    for(i=0;i<10;i++){
        for(j=0;j<10;j++){
            if(aux[i]==V[j]){           // Comparo o vetor AUX que é a "posição" da string original com o vetor V que será a nova posição.
                for(y=0;y<10;y++) ma[j][y] = m[i][y];           // Pego uma matriz auxiliar para colocar as strings na "posição" correta.
            }
        }
    }

    printf("\n A Matriz e:");
    for(i=0;i<10;i++){
        printf("\n  ");
        printf("%s  ,",ma[i]);          // Onde imprime a matriz auxiliar que está na ordem alfabética A-Z.
    }
}

 

Link para o comentário
Compartilhar em outros sites

  • 0
#include<stdio.h>
#include <string.h>
#define NLINHAS 4
#define NLETRAS 10


int main(){
    char *a, *b, *c, temp[10];
    c=temp;
    int result;
    
    char m[NLINHAS][10] ={
        {"Avenida"},
        {"Brasil"},
        {"Alfabeto"},
        {"Holanda"}
    };
    
    int i, j;
    for ( i=0; i<NLINHAS-1; i++) {
        a = &m[i][0];
        for ( j=i+1; j<NLINHAS ; j++) {
            b=&m[j][0];
            
            result = strcmp ( a, b );
            
            if ( result > 0 ) {
                strcpy ( c, a );
                strcpy ( a, b );
                strcpy ( b, c );
            }
        }
    }

    for ( i = 0; i<4; i++ ) {
        printf ( "%s\n", m[i] );
    }
   
    
    return 0;
}

Tal vez seja isso o que você está buscando.
Exatamente por esse motivo você deve usar strcmp, porque strcmp compara todas as letras e não só a primeira. Ainda assim acho uma estupidez de programa pois n4ao vejo sentido em usar ponteiros tal como no exemplo que deixo anexado. Se fosse uma matriz tipo vetor de ponteiros a strings então organizar seria super efetivo, porque estaria trocando a ordem dos ponteiros.

Link para o comentário
Compartilhar em outros sites

  • 0

Acredito que seja algo assim o que o enunciado pede:

O objetivo seria criar 10 ponteiros e fazer cada um deles apontar para uma linha/palavra da matriz, tal que o primeiro ponteiro aponte para a posição da matriz que tem a primeira palavra em ordem alfabética, o segundo ponteiro aponte para a posição da matriz com a segunda palavra em ordem alfabética, etc. Assim quando você chamar esses ponteiros em seqüência para imprimir a palavra, você vai imprimir as palavras em ordem alfabética, mas a matriz original nunca foi alterada, e não foi necessário copiar nenhuma string.

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

int main() {
    int i, j;
    char M[10][15] = {"brasil", "argentina", "colombia", "russia", "china",
                      "bolivia", "franca", "portugal", "espanha", "israel"};
    char *p[10];
    
       
    // Ordenando os ponteiros usando o algoritmo de ordenação por inserção:
    for (i=0; i<10; i++){
        for (j=i; j > 0 && strcmp(M[i], p[j-1]) < 0; j--){
            p[j] = p[j-1];
        }
        p[j] = M[i];
    }

    printf("Imprimindo a partir dos ponteiros:\n\n");
    for (i=0; i<10; i++)
        printf("%s ", p[i]);

    printf("\n\n\nMas a matriz original não foi modificada:\n\n");
    for (i=0; i<10; i++)
        printf("%s ", M[i]);

    printf("\n");

    return 0;
}

 

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

  • 0
30 minutos atrás, vangodp disse:

#include<stdio.h>
#include <string.h>
#define NLINHAS 4
#define NLETRAS 10


int main(){
    char *a, *b, *c, temp[10];
    c=temp;
    int result;
    
    char m[NLINHAS][10] ={
        {"Avenida"},
        {"Brasil"},
        {"Alfabeto"},
        {"Holanda"}
    };
    
    int i, j;
    for ( i=0; i<NLINHAS-1; i++) {
        a = &m[i][0];
        for ( j=i+1; j<NLINHAS ; j++) {
            b=&m[j][0];
            
            result = strcmp ( a, b );
            
            if ( result > 0 ) {
                strcpy ( c, a );
                strcpy ( a, b );
                strcpy ( b, c );
            }
        }
    }

    for ( i = 0; i<4; i++ ) {
        printf ( "%s\n", m[i] );
    }
   
    
    return 0;
}

Tal vez seja isso o que você está buscando.
Exatamente por esse motivo você deve usar strcmp, porque strcmp compara todas as letras e não só a primeira. Ainda assim acho uma estupidez de programa pois n4ao vejo sentido em usar ponteiros tal como no exemplo que deixo anexado. Se fosse uma matriz tipo vetor de ponteiros a strings então organizar seria super efetivo, porque estaria trocando a ordem dos ponteiros.

Também acho meio estupido isso... mas existe professor pra tudo. Mesmo assim obrigado.

 

 

23 minutos atrás, isrnick disse:

Acredito que seja algo assim o que o enunciado pede:

O objetivo seria criar 10 ponteiros e fazer cada um deles apontar para uma linha/palavra da matriz, tal que o primeiro ponteiro aponte para a posição da matriz que tem a primeira palavra em ordem alfabética, o segundo ponteiro aponte para a posição da matriz com a segunda palavra em ordem alfabética, etc. Assim quando você chamar esses ponteiros em seqüência para imprimir a palavra, você vai imprimir as palavras em ordem alfabética, mas a matriz original nunca foi alterada, e não foi necessário copiar nenhuma string.


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

int main() {
    int i, j;
    char M[10][15] = {"brasil", "argentina", "colombia", "russia", "china",
                      "bolivia", "franca", "portugal", "espanha", "israel"};
    char *p[10];
    
       
    // Ordenando os ponteiros usando o algoritmo de ordenação por inserção:
    for (i=0; i<10; i++){
        for (j=i; j > 0 && strcmp(M[i], p[j-1]) < 0; j--){
            p[j] = p[j-1];
        }
        p[j] = M[i];
    }

    printf("Imprimindo a partir dos ponteiros:\n\n");
    for (i=0; i<10; i++)
        printf("%s ", p[i]);

    printf("\n\n\nMas a matriz original não foi modificada:\n\n");
    for (i=0; i<10; i++)
        printf("%s ", M[i]);

    printf("\n");

    return 0;
}

 

É acho que deve ser nesse esquema mesmo ai... Obrigado pela ajuda.

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,3k
    • Posts
      652,4k
×
×
  • Criar Novo...