Ir ao conteúdo

C Ordenar um struct de strings


Ir à solução Resolvido por kgin,

Posts recomendados

Postado

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

Postado

@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
Postado

@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;
            }
        }
    }
}

 

  • Solução
Postado

@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);
    }
}

 

 

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!