Ir ao conteúdo
  • Cadastre-se
Beatriz Castro

C Verificação de sequência de vetores

Recommended Posts

Boa noite!! To aqui novamente pedindo pelo amor de Deus uma ajuda de vocês! Tenho uma lista pra entregar essa semana e preciso de ajuda nessa questão. Não tá compilando do jeito que quero e não acho o erro :[

A questão diz: Dadas duas sequências de n e m valores inteiros, onde n<=m, escreva um programa que verifica quantas vezes a primeira sequência ocorre na segunda. Exemplo:
primeira sequência: 1 0 1

segunda sequência: 1 1 0 1 0 1 0 0 1 1 0 1 0

Resultado: 3

/*Dadas duas sequências de n e m valores inteiros, onde n<=m, escreva um programa que verica quantas vezes a primeira sequência ocorre na segunda.*/

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


int main(){
	int vetorM[7], vetorN[6], n1, n2;
	int i, j, umEmComum;
	
	for(i=0; i<n1; i++)
		printf("Digite a quantidade de numeros para vetorM (max. 7): ");
		scanf("%d", &n1);
	
	for(i=0; i<n1; i++)
		printf("Digite a quantidade de numeros para vetorN (max. 6): ");
		scanf("%d", &n2);

	for(i=0; i<n1; i++){
		printf("Entre com valor da posicao %d para vetor M:", i);
		scanf("%d",&vetorM[i]);
}
		printf("\n\n");

	for(i=0; i<n2; i++){
		printf("Entre com valor da posicao %d para vetor N:",i);
		scanf("%d",&vetorN[i]);
}
	
	umEmComum = 0;
	for(i = 0; i < 5 ; i++)
		for(j = 0; j < 5; j++)
			if(vetorM[i] == vetorN[j]){
				umEmComum = 1;
				printf("%d valores iguais!", i);
}
			if(!umEmComum)
			printf("Nenhum elemento em comum!\n");
			
return 0;
			
}

Valeu mais uma vez! ~~

Compartilhar este post


Link para o post
Compartilhar em outros sites

e aí cara.. beleza..?! Então, voce poderia usar a primeira sequencia como um valor inteiro apenas, nao como um vetor, usa o vetor apenas na segunda sequencia, assim você pode comparar a primeira sequencia com cada celula do vetor entendeu??

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para contar quantas vezes a sequencia se repete faça algo assim:

int iguais, contador;


contador = 0;
for(i=0; i < m - n + 1; i++){
    iguais = 1;
    for(j=0; j < n; j++){
        if(vetorM[i+j] != vetorN[j]){
            iguais = 0;
        }
    }
    if(iguais){
        contador++;
    }
}
  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá a todos.

 

@Beatriz Castro Vou tentar verificar alguns pontos do seu código e tentar passar algumas dicas. Vamos lá:

 

1#

Em relação a sintaxe do C.

 

Veja, apenas peguei o seu código e indentei usando esse site  (<-- créditos para @isrnick ou algum outro usuário que nos apresentou essa ferramenta). Ficou assim:

/*Dadas duas sequências de n e m valores inteiros, onde n<=m, escreva um programa que verica quantas vezes a primeira sequência ocorre na segunda.*/

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

int main() {
    int vetorM[7], vetorN[6], n1, n2;
    int i, j, umEmComum;

    for(i=0; i<n1; i++)
        printf("Digite a quantidade de numeros para vetorM (max. 7): ");
    scanf("%d", &n1);

    for(i=0; i<n1; i++)
        printf("Digite a quantidade de numeros para vetorN (max. 6): ");
    scanf("%d", &n2);

    for(i=0; i<n1; i++) {
        printf("Entre com valor da posicao %d para vetor M:", i);
        scanf("%d",&vetorM[i]);
    }
    printf("\n\n");

    for(i=0; i<n2; i++) {
        printf("Entre com valor da posicao %d para vetor N:",i);
        scanf("%d",&vetorN[i]);
    }

    umEmComum = 0;
    for(i = 0; i < 5 ; i++)
        for(j = 0; j < 5; j++)
            if(vetorM[i] == vetorN[j]) {
                umEmComum = 1;
                printf("%d valores iguais!", i);
            }
    if(!umEmComum)
        printf("Nenhum elemento em comum!\n");

    return 0;
}

Compare com seu código e veja a diferença...

 

Por exemplo, no seu código está assim:

11 horas atrás, Beatriz Castro disse:

    for(i=0; i<n1; i++)
        printf("Digite a quantidade de numeros para vetorM (max. 7): ");
        scanf("%d", &n1);

 

Mas o correto seria assim:

    for(i=0; i<n1; i++)
        printf("Digite a quantidade de numeros para vetorM (max. 7): ");
    scanf("%d", &n1);

 

Perceba que a terceira linha ficou um dente para trás após indentar... ou seja, se seu objetivo era deixar o scanf() dentro do for , deveria usar o { }. Ficaria algo assim:

    for(i=0; i<n1; i++) {
        printf("Digite a quantidade de numeros para vetorM (max. 7): ");
        scanf("%d", &n1);
    }

 

 

 

2#

Agora entrando na lógica, vamos pegar por exemplo o mesmo trecho:

    for(i=0; i<n1; i++) {
        printf("Digite a quantidade de numeros para vetorM (max. 7): ");
        scanf("%d", &n1);
    }

Então, você está utilizando n1 como parâmetro de configuração do for, mas n1 ainda nem foi inicializado (qual o valor de n1 ali no for?)... mas em fim... pelo o contexto, não é necessário um laço for (ou algum laço de repetição)... apenas exiba a frase e leia a variável... Algo como:

    printf("Digite a quantidade de numeros para vetorM (max. 7): ");
    scanf("%d", &n1);

 

Resumidamente... poderia ficar algo assim:

/*Dadas duas sequências de n e m valores inteiros, onde n<=m, escreva um programa que verica quantas vezes a primeira sequência ocorre na segunda.*/

#include <stdio.h>
//#include <stdlib.h>  NÃO ESTÁ SENDO UTILIZADO

int main() {
    int vetorM[7], vetorN[6], n1, n2;
    int i, j, umEmComum;

    printf("Digite a quantidade de numeros para vetorM (max. 7): ");
    scanf("%d", &n1);
    printf("Digite a quantidade de numeros para vetorN (max. 6): ");
    scanf("%d", &n2);

 

 

Até o momento, minha sugestão seria deixar assim:

/*
Dadas duas sequências de n e m valores inteiros, onde n<=m, escreva um programa que vericca quantas vezes a primeira sequência ocorre na segunda.
Exemplo:
primeira sequência: 1 0 1
segunda sequência : 1 1 0 1 0 1 0 0 1 1 0 1 0
Resultado: 3
*/

#include <stdio.h>
#include <locale.h> //setlocale()
int main() {
    setlocale(LC_CTYPE,"Portuguese_Brazil"); //para funcionar os acentos no console
    int vetorN[7], vetorM[7]; //armazenar a primeira e segunda sequências
    int m, n;                 //tamanho das respectivas sequências

    //obter o tamanho dos vetores
    printf("Digite a quantidade de números para vetorM (máx. 7): ");
    scanf("%d",&m);
    printf("Digite a quantidade de números para vetorN (máx. 7): ");
    scanf("%d",&n);

    //preencher os vetores (EM CONSTRUÇÃO)
    
    //verificar quantas vezes a sequência no vetorN ocorre em vetorM (EM CONSTRUÇÃO)

    //exibir o resultado (EM CONSTRUÇÃO)

    return 0;
}

Até aqui beleza?

 

 

 

3#

Implementando a próxima etapa:

 

Começando o for para preencher os vetores.

...
    scanf("%d", &n);
    
    //preencher os vetores (EM CONSTRUÇÃO)
    int i;
    for (i=0; i<m; i++) {
        
    }
    
    //verificar quantas vezes a sequência no vetorN ocorre em vetorM (EM CONSTRUÇÃO)

    //exibir o resultado (EM CONSTRUÇÃO)

    return 0;
}

 

Vai continuando:

    //preencher os vetores (EM CONSTRUÇÃO)
    printf("PRIMEIRA SEQUÊNCIA (vetorM) : \n");
    int i;    
    for (i=0; i<m; i++) {
        printf("%dº número : ",i+1);
        scanf("%d",&vetorM[i]);
    }

 

Continuando:

    //preencher os vetores (EM CONSTRUÇÃO)
    printf("PRIMEIRA SEQUÊNCIA (vetorM) : \n");
    int i;    
    for (i=0; i<m; i++) {
        printf("%dº número : ",i+1);
        scanf("%d",&vetorM[i]);
    }
    printf("\nSEGUNDA SEQUÊNCIA (vetorN) : \n");
    for (i=0; i<m; i++) {
        printf("%dº número : ",i+1);
        scanf("%d",&vetorN[i]);
    }

 

Pronto... só para ter certeza se está cadastrando certo, poderia colocar para imprimir os vetores...
Ai o código estaria mais ou menos assim:

/*
Dadas duas sequências de n e m valores inteiros, onde n<=m, escreva um programa que vericca quantas vezes a primeira sequência ocorre na segunda.
Exemplo:
primeira sequência: 1 0 1
segunda sequência : 1 1 0 1 0 1 0 0 1 1 0 1 0
Resultado: 3
*/

#include <stdio.h>
#include <locale.h> //setlocale()
int main() {
    setlocale(LC_CTYPE,"Portuguese_Brazil");
    
    int vetorN[7], vetorM[7]; //armazenar a primeira e segunda sequências
    int m, n;                 //tamanho das respectivas sequências

    //obter o tamanho dos vetores
    printf("Digite a quantidade de números para vetorM (máx. 7): ");
    scanf("%d",&m);
    printf("Digite a quantidade de números para vetorN (máx. 7): ");
    scanf("%d",&n);

    //preencher os vetores
    printf("\nPRIMEIRA SEQUÊNCIA (vetorM) : \n");
    int i;    
    for (i=0; i<m; i++) {
        printf("%dº número : ",i+1);
        scanf("%d",&vetorM[i]);
    }
    printf("\nSEGUNDA SEQUÊNCIA (vetorN) : \n");
    for (i=0; i<m; i++) {
        printf("%dº número : ",i+1);
        scanf("%d",&vetorN[i]);
    }
    
    
    
    
    //IMPRIME OS VETORES (para testar se leu os vetores corretamente)
    printf("\nPRIMEIRA SEQUÊNCIA : ");
    for (i=0; i<m; i++) {
        printf("%d ",vetorM[i]);
    }        
    printf("\nSEGUNDA SEQUÊNCIA  : ");
    for (i=0; i<m; i++) {
        printf("%d ",vetorN[i]);
    }

    
    
    
    
    
    
    //verificar quantas vezes a sequência no vetorN ocorre em vetorM (EM CONSTRUÇÃO)

    //exibir o resultado (EM CONSTRUÇÃO)

    return 0;
}

 

 

 

***

 

Ai vai ajustando o que já está pronto... após parte para a uma próxima etapa... Perceba que fiz questão de testar se leu os vetores corretamente, pois se a leitura não estivesse funcionando, a verificação depois também não iria funcionar...

 

Então, ai poderia usar esse código como base para ajustar o seu... e vai dando continuidade.

 

 

No aguardo.

 

 

  • Curtir 1
  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Simon Viegas Obrigada pela ajuda com a indentação! Eu venho focando tanto na questão lógica que acabo deixando de lado esse tipo de coisa que realmente é super importante. Percebi mesmo o meu erro em colocar o for antes de ler com o scanf no começo, que burrice da minha parte. Muito obrigada novamente, acho essa área incrível e quero sempre aprender. @isrnick Muito obrigada pela ajuda com essa parte do código, eu realmente não estava conseguindo raciocinar. Por enquanto o código está assim, mas ainda não deu certo rsrsrs

/*Dadas duas sequências de n e m valores inteiros, onde n<=m, escreva um programa que verica quantas vezes a primeira sequência ocorre na segunda.*/

#include <stdio.h>
#include <stdlib.h>
#include <locale.h> //setlocale()


int main(){
	setlocale(LC_CTYPE,"Portuguese_Brazil");
	int vetorM[50], vetorN[50], m = 0, n = 0, i = 0, j = 0, iguais, contador;
	
	printf("Digite a quantidade de numeros para vetorM: ");
	scanf("%d", &m);
	
	for(i=0; i<m; i++){
		printf("Entre com valor da posicao %d para vetor M:", i);
		scanf("%d",&vetorM[i]);
}
	
	
	printf("Digite a quantidade de numeros para vetorN: ");
	scanf("%d", &n);
	
	for(i=0; i<n; i++){
		printf("Entre com valor da posicao %d para vetor N:", i);
		scanf("%d",&vetorN[i]);
}
		printf("\n\n");

	contador = 0;
	for(i=0; i < m - n + 1; i++){
    	iguais = 1;
    		for(j=0; j < n; j++){
        		if(vetorM[i] != vetorN[j+i-1]){
            	iguais = 0;
        }
    }
    if(iguais){
        contador++;
    }
    
    printf("Resultado %d", contador);
}

return 0;
			
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá.

 

1#

Sobre a indentação:

57 minutos atrás, Beatriz Castro disse:

@Simon Viegas Obrigada pela ajuda com a indentação! Eu venho focando tanto na questão lógica que acabo deixando de lado esse tipo de coisa que realmente é super importante.

 

Tá, mas porque continuou postando um código não indentado?

 

Veja, não são coisas excludentes... a indentação simplesmente faz parte da implementação... o código deve ficar O TEMPO TODO INDENTADO. A medida que vai implementando, já deixa indentado. A indentação faz parte da estrutura.

 

Qualquer coisa coloque seu código lá no site que citei no 1# da postagem anterior... e compare para ver a diferença... ai passa a usar o código indentado.

 

 

 

2#

Em relação ao "contador de ocorrências" (a parte mais difícil), o código já foi dado por @isrnick.

 

Em 31/05/2018 às 23:30, isrnick disse:

contador = 0;
for(i=0; i < m - n + 1; i++){
    iguais = 1;
    for(j=0; j < n; j++){
        if(vetorM[i+j] != vetorN[j]){
            iguais = 0;
        }
    }
    if(iguais){
        contador++;
    }
}

 

Basta usar.

 

 

***

 

No aguardo.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Minha lógica já estava certa, não havia necessidade de modificar.

 

Só coloquei a lógica como eu havia escrito, também mudei o printf do resultado para fora do ciclo for (sem indentação correta você não visualiza facilmente que está dentro do for), e mudei a ordem da entrada de dados fazendo o vetorN ser lido primeiro pois segundo o enunciado (pois n<=m e a primeira sequência é a menor).

 

/*Dadas duas sequências de n e m valores inteiros, onde n<=m, escreva um programa que verica quantas vezes a primeira sequência ocorre na segunda.*/

#include <stdio.h>
#include <stdlib.h>
#include <locale.h> //setlocale()

int main() {
    setlocale(LC_CTYPE,"Portuguese_Brazil");
    int vetorM[50], vetorN[50], m = 0, n = 0, i = 0, j = 0, iguais, contador;
    
    printf("Digite a quantidade de numeros para vetorN: ");
    scanf("%d", &n);
    
    for(i=0; i<n; i++) {
        printf("Entre com valor da posicao %d para vetor N: ", i);
        scanf("%d",&vetorN[i]); //1 0 1
    }
    
    printf("\nDigite a quantidade de numeros para vetorM: ");
    scanf("%d", &m);
    
    for(i=0; i<m; i++) {
        printf("Entre com valor da posicao %d para vetor M: ", i);
        scanf("%d",&vetorM[i]); //1 1 0 1 0 1 0 0 1 1 0 1 0
    }
    
    printf("\n\n");

    contador = 0;
    for(i=0; i < m - n + 1; i++) {
        iguais = 1;
        for(j=0; j < n; j++) { 
            if(vetorM[i+j] != vetorN[j]) {
                iguais = 0;
            }
        }
        if(iguais) {
            contador++;
        }
    }
    
    printf("\nResultado %d", contador);
    
    return 0;
}

 

  • Curtir 1
  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×