Ir ao conteúdo
  • Cadastre-se

C++ Algoritmo pra reconhecer musica


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

Posts recomendados

 

#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
Link para o comentário
Compartilhar em outros sites

  • Solução
#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
Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

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;

 

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!