Ir ao conteúdo
  • Cadastre-se

C Ordenar um struct de strings


Visitante
Ir à solução Resolvido por kgin,

Posts recomendados

Como ordenar um struct de strings, segundo o enunciado(anexo)?

 

Meu código:

 

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

static int qtd_musica = 0;

struct info_album
{
	char nome[25];
	char genero[25];
}; struct info_album album;

struct info_musica
{
	char nome[25];
	char duracao[5];
	int numero;
}; struct info_musica musica[10];

void criar_album()
{
	printf("\nEntre com o nome do álbum:\n");
	scanf(" %24[^\n]s", album.nome);
	printf("Entre com o gênero do álbum:\n");
	scanf(" %24[^\n]s", album.genero);
	printf("\nO álbum de nome '%s' e gênero '%s' foi criado com sucesso!\n", album.nome, album.genero);
}

void inserir_musica()
{
	int i;
	for(i = 0; i < qtd_musica; i++)
	{
		printf("\nEntre com o número da música:\n");
		scanf("%d%*c", &musica[i].numero);
		printf("Entre com o nome da música %d:\n", musica[i].numero);
		scanf(" %24[^\n]s", musica[i].nome);
		printf("Entre com a duração da música %d (MM:SS):\n", musica[i].numero);
		scanf(" %4[^\n]s", musica[i].duracao);
	}
}

void listar_musica()//parte citada
{
	int i;  
	printf("\tAs músicas de '%s' são: \n", album.nome);
	for(i = 0; i < qtd_musica; i++)
	{
		printf("\n%d - %s - %s\n", musica[i].numero, musica[i].nome, musica[i].duracao);
	}
}

int main()
{
	int opcao1 = 1, opcao2 = 1;

	do
	{
		printf("\n\tCRIADOR DE ÁLBUM MUSICAL\n");
		printf("\n1. Criar álbum músical\n");
		printf("2. Adicionar música ao álbum\n");
		printf("3. Listar músicas do álbum\n");
		printf("0. Sair\n");

		scanf("%d", &opcao1);

		switch(opcao1)
		{
		    case 1:
				criar_album();
				do
				{
					printf("\n1. Criar álbum músical\n");
					printf("2. Adicionar música ao álbum\n");
					printf("3. Listar músicas do álbum\n");
					printf("0. Sair\n");
					scanf("%d", &opcao2);
					switch(opcao2)
					{
						case 2:	
							printf("\nDigite a quantidade de músicas: \n");
							scanf("%d%*c", &qtd_musica);
							inserir_musica();
							break;
						case 3:
							listar_musica();
							break; 
						case 0:
							printf("\nAté logo.\n");
							return 0;
					}
				} while (opcao2);
			case 0:
				printf("\nAté logo.\n");
				return 0;
			default:
				printf("\nDigite uma opção válida.\n");
		}
	} while(opcao1);
}

 

enunciado.png

Link para o comentário
Compartilhar em outros sites

@Elize Yakamura você pode usar um algoritmo de ordenação como o bubble sort ou qualquer outro.

Se você procurar por tabela ascii vai ver que a letra "A" e menor que a letra "Z" com isso você pode aplicar a mesma comparação que você faria com os números.

 

Exemplo

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

int main(void)
{
    char nomes[5][100] = {"Racionais", "Nedinho", "Tame ipala", "Yellow", "Abba"};
    char tmp[100] = {0};
    int vezes = 0, contador;
    /* Bubble sort */
    do {
        vezes = 0;
        for (contador = 0; contador < 5-1; contador++) {
            if (toupper(nomes[contador][0]) > toupper(nomes[contador+1][0])) {
                strcpy(tmp, nomes[contador]);
                strcpy(nomes[contador], nomes[contador+1]);
                strcpy(nomes[contador+1], tmp);
                vezes++;
            }
        }
    } while (vezes > 0);

    for (contador = 0; contador < 5; contador++) {
        printf("%s\n", nomes[contador]);
    }
    return(0);
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@kgin Algo mais ou menos assim? A função ordena certinho, exceto a primeira letra dos nomes e o primeiro número da duração.

 

void bubbleSort(int n, struct info_musica *a)
{
    int i, j;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n-1-i; j++)
        {
            if(musica[j].numero > musica[j+1].numero)
            {
                int aux; 
                aux = musica[j].numero;
                musica[j].numero = musica[j+1].numero;
                musica[j+1].numero = aux;
                
                char aux1;
                aux1 = *musica[j].nome;
                *musica[j].nome = *musica[j+1].nome;
                *musica[j+1].nome = aux1;
                
                char aux2;
                aux2 = *musica[j].duracao;
                *musica[j].duracao = *musica[j+1].duracao;
                *musica[j+1].duracao = aux2;
            }
        }
    }
}

 

Link para o comentário
Compartilhar em outros sites

  • Solução

@Elize Yakamura Sim, mas o algoritmo de organização está errado.

Você pode passar as estruturas ao invés de copiar campo por campo.

Exemplo

void organizaAlbuns(struct album *albuns, int quantidade)
{
    int contador, vezes;
    /* Bubble sort */
    do {
        vezes = 0;
        for (contador = 0; contador < quantidade-1; contador++) {
            if (toupper(albuns[contador].nome[0]) > toupper(albuns[contador+1].nome[0])) {
                struct album tmp = albuns[contador];
                albuns[contador] = albuns[contador+1];
                albuns[contador+1] = tmp;
                vezes++;
            }
        }
    } while (vezes > 0);
}

 

O resto do exemplo.

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

#define T_NOME 25
#define T_GENERO T_NOME
#define T_DURACAO 6

#define Q_MUSICAS 10

struct musica
{
    char nome[T_NOME];
    char duracao[T_DURACAO];
};

struct album
{
    char nome[T_NOME];
    char genero[T_GENERO];
    struct musica musicas[Q_MUSICAS];
};

void organizaAlbuns(struct album *albuns, int quantidade);

void mostraAlbum(struct album *album);

int main(void)
{
    int contador;
    struct album 
        albuns[3] = {
        {.nome = "Kiss", .genero = "Rock"},
        {.nome = "Gap The Band", .genero = "Pop Rock"},
        {.nome = "Isley Brothers", .genero = "Romantico"}};
    
    /* Mostra os albuns sem organização */
    for (contador = 0; contador < 3; contador++) {
        printf("Nome:%s\n", albuns[contador].nome);
    }

    putchar('\n');

    mostraAlbum(&albuns[1]);

    organizaAlbuns(albuns, 3);
    /* Mostra os albuns organizados */
    for (contador = 0; contador < 3; contador++) {
        printf("Nome:%s\n", albuns[contador].nome);
    }
    return(0);
}

void organizaAlbuns(struct album *albuns, int quantidade)
{
    int contador, vezes;
    /* Bubble sort */
    do {
        vezes = 0;
        for (contador = 0; contador < quantidade-1; contador++) {
            if (toupper(albuns[contador].nome[0]) > toupper(albuns[contador+1].nome[0])) {
                struct album tmp = albuns[contador];
                albuns[contador] = albuns[contador+1];
                albuns[contador+1] = tmp;
                vezes++;
            }
        }
    } while (vezes > 0);
}

void mostraAlbum(struct album *album)
{
    int contador;
    printf("Nome do album:%s\n", album->nome);
    printf("Nome do genero musical:%s\n", album->genero);

    for (contador = 0; contador < Q_MUSICAS; contador++) {
        printf("%d-Nome da musica:%s\n", contador, album->musicas[contador].nome);
        printf("\t\tDuracao:%s\n", album->musicas[contador].duracao);
    }
}

 

 

Link para o comentário
Compartilhar em outros sites

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