Ir para conteúdo

POWERED BY:

Arquivado

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

Bruno Pacheco

Ordem alfabetica - Linguagem C

Recommended Posts

Meu programa não está rodando. Será que eu errei na parte do codigo que tem que colocar os nomes em ordem alfabética? Ou é outra coisa? De qualquer maneira gostaria

de saber o que fazer para que o meu programa funcione direito.

 

 

 

/* Crie um programa para ler 5 nomes e armazená-los no vetor NOMES. Depois, organize os nomes no vetor de forma que eles fiquem em ordem alfabética*/


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

int main(){
    int i,j,x;
    char nome[30][30];
    
    for(i=0;i<5;i++){
       printf("Digite um nome: ");
       gets(nome[i]);
    }
 
    for(i=0;i<4;i++){
       for(j=i+1;j<5;j++){
           if(nome[i][j]>nome[i][j]){
              x=nome[i][j];
              nome[i][j]=nome[i][j];
              nome[i][j]=x;
           }
        } 
     }                                         
                           
    for (i=0;i<5;i++){
        for(j=0;j<5;j++){
           printf("%s",nome[i][j]);
        }    
    }    
getchar();        
}

Compartilhar este post


Link para o post
Compartilhar em outros sites
Meu programa não está rodando.

 

Não fale simplesmente que não está rodando. Diga exatamente o que está acontecendo. E novamente, aprenda a usar um depurador p/ procurar erros nos programas e conheça o compilador.

 

Pela milésima vez: não use gets.

 

 

isis@linux-45c9:~/src> gcc -Wall -Wextra ordem.c

ordem.c: In function 'main':

ordem.c:24: warning: format '%s' expects type 'char *', but argument 2 has type 'int'

ordem.c:27: warning: control reaches end of non-void function

 

 

Se você reserva espaço p/ 30 nomes, o que você espera que seja feito com o lixo que tem nas outras posições de memória, já que você lê 4 nomes?

 

Não se compara strings com operador de comparação.

 

E porque você atribui um char a um int?

 

$1 = {"teste", '\0' <repeats 15 times>, "����o���\000�", "amanda\000\000\000\000����\000\000\000\000\024���o���0���", "orlando\000\000\000\000\000\000\000\000\000�e�� ���C\214����",

"beatriz\000���e���e���e�� ���C\214��", "fernando\000���\224\004��\000\000\000\000\a\000\000\000(�����", "��\001\000\000\000����\f�\004\b@���N\\��p\000\000\000����",

"\f\000\000\000\a\000\000\000����i\004��\a\000\000\000\020\000\000\000\001\000\000\000\022\006", "��\000\000\000\000�\a��4\003������\024���\002\000��\021ii\r",

"\000\000\000\000\000\000\000\000�\002������\021\000\000\0000\v締���\022\006", "���\002��\000\000\000\000\000\000\000\000����N\\��\210\000\000\000����",

"\000\000��0\v������\b���\f���\000\000\000\000�\006��0\v", "\000\000\017\000\000\000\001\000\000\000�\025��\210\006��\000\000\000\0008\000\000\000\b\002\000", '\0' <repeats 20 times>, "d����\215��\000�",

"���\032\001\000����,����:������0���\000\000\000", '\0' <repeats 29 times>, '\0' <repeats 29 times>, "T\201\004\b\000\000\000\000��������", '\0' <repeats 13 times>, '\0' <repeats 29 times>,

'\0' <repeats 16 times>, "�\225���3跸\202\004\b\000", "\000\000\000\000\000\000����\002\000\000\000\030���\200\202\004\b\\�������", ",�������`����\231��", '\0' <repeats 13 times>,

"\000\000\000���\017", '\0' <repeats 11 times>, "\200���.N=��\003\000", "q��\a\003\000\000\0008M��4K��", '\0' <repeats 12 times>, "\001",

"\000\000k\b\000\000����\000����\202\004\b����0\202\004\b\001\000\000", "����0���.N=�4���)\233��$���0\202\004\b\030�",

"������\001\000\000\000����\001\000\000\000\000\000\000\000\001\000\000\000\000\000\000", '\0' <repeats 20 times>, "$���\030���\000",

"\000\000\000\000\000\000`���x����\202\004\b", '\0' <repeats 11 times>, '\0' <repeats 28 times>, "��", "��\016����\217���\237\004\b\b���D\203\004\b�\217���\237\004\b"}

 

Preste atenção no que você escreve

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consetei o meu código,e o programa não está funcionando.E minhas dúvidas:

1º)Se eu não usar o gets eu vou usar o que? o scanf?

2º) Eu coloquei para o vetor: "nome[5][5]".Isto está certo?

3º) O jeito pelo qual o meu código está ordenando alfabeticamente está correto?

 

 

 

/* Crie um programa para ler 5 nomes e armazená-los no vetor NOMES. Depois, organize
os nomes no vetor de forma que eles fiquem em ordem alfabética*/


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


int main(){
    int i,j;
    char nome[5][5],x;
    
    for(i=0;i<5;i++){
       printf("Digite um nome: ");
       gets(nome[i]);
    }
 
    
       for(i = 0; i< 5; i++){
           if(strcmp(nome[i],nome[i+1])>0){
              strcpy(nome[i+1],x);
              strcpy(nome[i],nome[i+1]);
              strcpy(x, nome[i]); 
           }
       }
                                        
                           
    for (i=0;i<5;i++){
        for(j=0;j<5;j++){
           printf("%s",nome[i][j]);
        }    
    }    
getchar();        
}
 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu consertei de novo o meu codigo e o meu programa ta rodando. Só que a minha dúvida é: porque o meu programa não está ordenando em ordem alfabética os nomes que eu digito?

 

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

int main(){
    char nome[5][30], aux[30];
    int i = 0;
    
    
    for(i = 0; i < 5; i++){
        printf("Entre com o %d%c nome: ", i + 1, 167);
        gets(nome[i]);
    }
    
    for(i = 0; i < 5; i++){
       if(strcmp(nome[i], nome[i + 1]) > 0){
           strcpy(aux, nome[i]);
           strcpy(nome[i], nome[i + 1]);
           strcpy(nome[i + 1], aux); 
       }
    }
    
    printf("\n\nNomes em ordem alfabetica: \n");
    for(i = 0; i < 5; i++){
        printf("\n%s",nome[i]);
    }
    
    system("Pause");    
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bruno, não sei muito de ordem alfabética em c e não achei erro no teu código mas tenho isso aqui feito:

 

void qs_struct1(struct registro r[], int left, int right)
{
     int i,j;
     char *x;
     struct registro temp;
     
     i = left; j = right;
     x = r[(left+right)/2].nome;
     
     do{
         while(strcmp(r[i].nome,x)<0 && i<right) i++;
         while(strcmp(r[i].nome,x)>0 && j>left) j--;
         if(i<=j) {
           temp = r[i];
           r[i] = r[j];
           r[j] = temp;
           i++; j--;
       }
       }while(i<=j);
       if(left<j) qs_struct1(r, left, j);
       if(i<right) qs_struct1(r, i, right);
}

void quick_struct1(struct registro r[], int count)
{
     qs_struct1(r,0,count-1);
}

Não é muito elegante mas funciona. Tirei de um livro, só não lembro qual.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem bastante tópico aqui falando de gets. É só procurar. Eu gosto das manpages da libc porque no final existem recomendações.

 

APPLICATION USAGE

Reading a line that overflows the array pointed to by s results in undefined behavior. The use of fgets() is recommended.

 

Since the user cannot specify the length of the buffer passed to gets(), use of this function is discouraged. The length of the string read is

unlimited. It is possible to overflow this buffer in such a way as to cause applications to fail, or possible system security violations.

 

It is recommended that the fgets() function should be used to read input lines.

 

No próximo padrão da linguagem C vão tirar essa função dos diabos. Quero só ver o que vai acontecer com "90%" dos livros e professores por aí...

 

 

isis@linux-45c9:~/src> ./a.out

Entre com o 1� nome: luciana

Entre com o 2� nome: cassio

Entre com o 3� nome: marina

Entre com o 4� nome: jorge

Entre com o 5� nome: andrea

 

 

Nomes em ordem alfabetica:

 

cassio

luciana

jorge

andrea

Falha de segmentação

 

 

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

int main(){
char nome[5][30], aux[30];
int i = 0;


for(i = 0; i < 5; i++){
	printf("Entre com o %dº nome: ", i + 1);
	fgets(nome[i], 30, stdin);
}


	int j;

	for(j=1; j<5; j++)
	{
	strcpy(aux,nome[j]);
	i = j-1;
	while(i >= 0 && strcmp(nome[i], aux) > 0)
	{
	strcpy(nome[i+1],nome[i]);
	i--;
	}
	strcpy(nome[i+1],aux);
	}


printf("\n\nNomes em ordem alfabetica: \n");
for(i = 0; i < 5; i++){
	printf("\n%s",nome[i]);
}
return 0;
}

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.