Ir ao conteúdo

C++ Algoritmo pra reconhecer musica


Ir à solução Resolvido por Flávio Pedroza,

Posts recomendados

Postado

 

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

int main(void) {
  
  char baseDadosMusicasTitulos[10][30] = {"Ring of fire", 
                                  "Hurt", 
                                  "Brianstorm", 
                                  "Do me a favour",
                                  "Turn it again",
                                  "I walk the line",
                                  "Wet sand",
                                  "Aint no grave",
                                  "Riders in the sky",
                                  "The man comes around"};
                                  
  int baseDadosMusicasCodificadas[10][40] = {{10,24,33,78,54,92,10,29,36,96,2,66,87,54,-1},
                                              {57,33,20,2,99,87,120,33,69,87,41,1,97,41,23,127,17,-1},
                                              {74,11,20,36,87,62,36,96,77,42,36,38,77,21,22,9,77,8,-1},
                                              {1,22,74,56,98,125,37,32,75,99,2,3,40,-1},
                                              {95,43,55,7,91,63,53,10,24,44,81,6,-1},
                                              {87,64,28,33,40,41,94,72,63,104,99,115,33,-1},
                                              {5,65,95,21,30,14,107,51,50,67,111,121,34,72,91,55,-1},
                                              {64,63,22,78,18,99,21,123,4,95,9,42,32,14,17,52,-1},
                                              {7,66,12,20,87,119,32,44,89,21,3,89,16,4,58,1,1,57,10,21,-1},
                                              {17,10,13,1,7,23,36,54,124,100,32,20,27,89,66,32,-1}};
  
  printf("Musica: %s\n",baseDadosMusicasTitulos[9]);
  
  int NA,vet[10],i,j, vetm[10];
  
  	printf("Digite o tamanho da amostra da musica:");
  	scanf("%d",&NA);
 	for(i=0; i<NA; i++){
 		
 				printf("Digite os numeros da amostra da musica:");
 			scanf("%d",&vet[i]);  		  	
	 }
	 for(i=0; i<127; i++){
	 	for(j=0; j<127; j++){
	 		
	 		if (vet[i] == baseDadosMusicasCodificadas[10][40] ){
	 			(vetm[10] = vet[i]);
			 }
		 }
		
	 }
	 if (vetm[10] == baseDadosMusicasCodificadas[10][40] &&   baseDadosMusicasTitulos[10][30]){
	 	
	 
	 printf("A musica econtrada e : " , baseDadosMusicasTitulos[10][30]);
	 	 }
	 	 else
	 	 printf("A musica nao foi encontrada");
  
  return 0;
}

Bem, alguém poderia me ajudar a arrumar a parte do código eu não estou conseguindo verificar os números um por um para ver se tem na matriz principal das músicas e armazendo em um vetor onde eu posso estar verificando se existe essa música e mostrando na tela o nome da música.

 

alg2.jpg

Alg1.jpg

  • Curtir 1
  • Solução
Postado
#include <stdio.h>
#include <stdlib.h>
 

int main(void) {
  
  char baseDadosMusicasTitulos[10][30] = {"Ring of fire", 
                                  "Hurt", 
                                  "Brianstorm", 
                                  "Do me a favour",
                                  "Turn it again",
                                  "I walk the line",
                                  "Wet sand",
                                  "Aint no grave",
                                  "Riders in the sky",
                                  "The man comes around"};
                                  
  int baseDadosMusicasCodificadas[10][40] = {{10,24,33,78,54,92,10,29,36,96,2,66,87,54,-1},
                                              {57,33,20,2,99,87,120,33,69,87,41,1,97,41,23,127,17,-1},
                                              {74,11,20,36,87,62,36,96,77,42,36,38,77,21,22,9,77,8,-1},
                                              {1,22,74,56,98,125,37,32,75,99,2,3,40,-1},
                                              {95,43,55,7,91,63,53,10,24,44,81,6,-1},
                                              {87,64,28,33,40,41,94,72,63,104,99,115,33,-1},
                                              {5,65,95,21,30,14,107,51,50,67,111,121,34,72,91,55,-1},
                                              {64,63,22,78,18,99,21,123,4,95,9,42,32,14,17,52,-1},
                                              {7,66,12,20,87,119,32,44,89,21,3,89,16,4,58,1,1,57,10,21,-1},
                                              {17,10,13,1,7,23,36,54,124,100,32,20,27,89,66,32,-1}};
  
  
  int NA,vet[10],i,j, k, vetm[10], count = 0;
  
  for (int i=0; i < 10; i++)
  {
    printf("Musica: %d.%s\n",i+1, baseDadosMusicasTitulos[i]);
  }
  
  	printf("Digite o tamanho da amostra da musica:");
  	scanf("%d",&NA);
 	for(i=0; i<NA; i++){
 		
 				printf("Digite os numeros da amostra da musica:");
 			scanf("%d",&vet[i]);  		  	
	 }
	 for(i=0; i<10; i++){
	    
	 	for(j=0; j<30; j++){
	 	    count = 0;
	 	    for(k=0; k<NA; k++){
	 	        if (vet[k] == baseDadosMusicasCodificadas[i][k+j])
	 		    {
	 		        count++;
	 		    } else break;
	 		    
	 	    }
	 	    if (count == NA) break; //achou a musica
		 }
	   if (count == NA) break;	
	 }
	 //if (vetm[10] == baseDadosMusicasCodificadas[10][40] &&   baseDadosMusicasTitulos[10][30]){
	 	
	 if (count == NA) printf("A musica econtrada e : %s" , baseDadosMusicasTitulos[i]);
	 else printf("A musica nao foi encontrada");
  
  return 0;
}

 

  • Curtir 1
  • Obrigado 1
Postado

Olá, estou aqui para pedir ajuda aos especialista no assunto, estou com esse enunciado e vim aqui trazer a minha ideia de como fazer e colocar em prática o código, estou com algumas dificuldades na hora de passar para o algoritmo e fazer ele funcionar.

 

Na minha cabeça o que eu preciso fazer é testar os numeros, se o numero da amostra for diferente da canção a depender do tamanho da amostra eu aumentar como diz no enunciado. 
Então eu devo determinar a minha variavel de controle para que aumente.

Certo até ai tudo bem, mas agora que vem o problema eu meio que travo e não consigo fazer

Por exemplo se a minha variavel for k.. na minha cabeça o codigo deve ser assim
 

  if(vet[k] != baseDadosMusicasCodificadas[i][k+j]){
          	if(k==4 || k==5){
			 (k+1); } 
			if(k==6 || k==7 || k==8);{
			(k+2);}
			if(k==9 || k==10);{
			(k+3);

Mas de certa maneira ele não funciona, ai começo a pensar eu devo rodar um for para ir nas posições do vetor, mas com um for ele vai rodar até certo numero e terminar. 
Eu declaro que meu for vá ate o numero de amostras, e abro um if para que se o numero for diferente ele acrescentar, mas ai que está o problema novamente, o meu código da erro quando eu tento fazer...
O Flávio Pedroza que ajudou a fazer o algoritmo abaixo, meus agradecimentos a ele novamente.
 

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

int main(void) {
  
  char baseDadosMusicasTitulos[10][30] = {"Ring of fire", 
                                  "Hurt", 
                                  "Brianstorm", 
                                  "Do me a favour",
                                  "Turn it again",
                                  "I walk the line",
                                  "Wet Sand",
                                  "Aint no grave",
                                  "Riders in the sky",
                                  "The man comes around"};
                                  
  int baseDadosMusicasCodificadas[10][40] = {{10,24,33,78,54,92,10,29,36,96,2,66,87,54,-1},
                                              {57,33,20,2,99,87,120,33,69,87,41,1,97,41,23,127,17,-1},
                                              {74,11,20,36,87,62,36,96,77,42,36,38,77,21,22,9,77,8,-1},
                                              {1,22,74,56,98,125,37,32,75,99,2,3,40,-1},
                                              {95,43,55,7,91,63,53,10,24,44,81,6,-1},
                                              {87,64,28,33,40,41,94,72,63,104,99,115,33,-1},
                                              {5,65,95,21,30,14,107,51,50,67,111,121,34,72,91,55,-1},
                                              {64,63,22,78,18,99,21,123,4,95,9,42,32,14,17,52,-1},
                                              {7,66,12,20,87,119,32,44,89,21,3,89,16,4,58,1,1,57,10,21,-1},
                                              {17,10,13,1,7,23,36,54,124,100,32,20,27,89,66,32,-1}};
  
  
  int NA,vet[10],i,j, k, vetm[10], count = 0;
  
  
  
  // printf("Digite o tamanho da amostra da musica:");
   scanf("%d",&NA);
  for(i=0; i<NA; i++){
   
    // printf("Digite os numeros da amostra da musica:");
    scanf("%d",&vet[i]);       
 }
 for(i=0; i<10; i++){
    
  for(j=0; j<30; j++){
      count = 0;
      for(k=0; k<NA; k++){
          if (vet[k] == baseDadosMusicasCodificadas[i][k+j])
       {
           count++;
       } else break;
       
      }
      if (count == NA) break; //achou a musica
  }
   if (count == NA) break; 
 }
 //if (vetm[10] == baseDadosMusicasCodificadas[10][40] &&   baseDadosMusicasTitulos[10][30]){
  
 if (count == NA) printf("Musica: %s" , baseDadosMusicasTitulos[i]);
 else printf("Musica nao encontrada");
  
  return 0;
}

 

Codigo.jpg

Postado
10 horas atrás, Josuke disse:

Olá, estou aqui para pedir ajuda aos especialista no assunto, estou com esse enunciado e vim aqui trazer a minha ideia de como fazer e colocar em prática o código, estou com algumas dificuldades na hora de passar para o algoritmo e fazer ele funcionar.

 

Na minha cabeça o que eu preciso fazer é testar os numeros, se o numero da amostra for diferente da canção a depender do tamanho da amostra eu aumentar como diz no enunciado. 
Então eu devo determinar a minha variavel de controle para que aumente.

Certo até ai tudo bem, mas agora que vem o problema eu meio que travo e não consigo fazer

Por exemplo se a minha variavel for k.. na minha cabeça o codigo deve ser assim
 


  if(vet[k] != baseDadosMusicasCodificadas[i][k+j]){
          	if(k==4 || k==5){
			 (k+1); } 
			if(k==6 || k==7 || k==8);{
			(k+2);}
			if(k==9 || k==10);{
			(k+3);

Mas de certa maneira ele não funciona, ai começo a pensar eu devo rodar um for para ir nas posições do vetor, mas com um for ele vai rodar até certo numero e terminar. 
Eu declaro que meu for vá ate o numero de amostras, e abro um if para que se o numero for diferente ele acrescentar, mas ai que está o problema novamente, o meu código da erro quando eu tento fazer...
O Flávio Pedroza que ajudou a fazer o algoritmo abaixo, meus agradecimentos a ele novamente.
 


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

int main(void) {
  
  char baseDadosMusicasTitulos[10][30] = {"Ring of fire", 
                                  "Hurt", 
                                  "Brianstorm", 
                                  "Do me a favour",
                                  "Turn it again",
                                  "I walk the line",
                                  "Wet Sand",
                                  "Aint no grave",
                                  "Riders in the sky",
                                  "The man comes around"};
                                  
  int baseDadosMusicasCodificadas[10][40] = {{10,24,33,78,54,92,10,29,36,96,2,66,87,54,-1},
                                              {57,33,20,2,99,87,120,33,69,87,41,1,97,41,23,127,17,-1},
                                              {74,11,20,36,87,62,36,96,77,42,36,38,77,21,22,9,77,8,-1},
                                              {1,22,74,56,98,125,37,32,75,99,2,3,40,-1},
                                              {95,43,55,7,91,63,53,10,24,44,81,6,-1},
                                              {87,64,28,33,40,41,94,72,63,104,99,115,33,-1},
                                              {5,65,95,21,30,14,107,51,50,67,111,121,34,72,91,55,-1},
                                              {64,63,22,78,18,99,21,123,4,95,9,42,32,14,17,52,-1},
                                              {7,66,12,20,87,119,32,44,89,21,3,89,16,4,58,1,1,57,10,21,-1},
                                              {17,10,13,1,7,23,36,54,124,100,32,20,27,89,66,32,-1}};
  
  
  int NA,vet[10],i,j, k, vetm[10], count = 0;
  
  
  
  // printf("Digite o tamanho da amostra da musica:");
   scanf("%d",&NA);
  for(i=0; i<NA; i++){
   
    // printf("Digite os numeros da amostra da musica:");
    scanf("%d",&vet[i]);       
 }
 for(i=0; i<10; i++){
    
  for(j=0; j<30; j++){
      count = 0;
      for(k=0; k<NA; k++){
          if (vet[k] == baseDadosMusicasCodificadas[i][k+j])
       {
           count++;
       } else break;
       
      }
      if (count == NA) break; //achou a musica
  }
   if (count == NA) break; 
 }
 //if (vetm[10] == baseDadosMusicasCodificadas[10][40] &&   baseDadosMusicasTitulos[10][30]){
  
 if (count == NA) printf("Musica: %s" , baseDadosMusicasTitulos[i]);
 else printf("Musica nao encontrada");
  
  return 0;
}

 

Codigo.jpg



Bem consegui achar a solução!
 

if(count >= X){
     break;
}
 e depois de receber A, você faz:

X = A * 0.7;

 

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

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!