Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
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
Postado (editado)

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

Editado por Arima
erro

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
Postado (editado)

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

 

Editado por Beatriz Castro
  • 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






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

×