Ir ao conteúdo
  • Cadastre-se

C Estou com dificuldade em um código sobre números primos e vetores. Eis o codigo:


Visitante

Posts recomendados

 

 

 

esse é o comando da questão:

 

 

//Faça uma função que receba, por referência, um vetor K[15] e retorna, também
//por referência, um vetor P contendo apenas os valores primos de K.

 

mas não estou conseguindo imprimir corretamente. Gostaria da ajuda de alguém.

//Faça uma função que receba, por referência, um vetor K[15] e retorna, também
//por referência, um vetor P contendo apenas os valores primos de K.

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

typedef	int boolean;
	#define true 1
	#define false 0
	
void verifica_primo (int K[15], int P[15])	
{
	
int i=0, cont=1;

	while(cont<=15)
	{
		boolean primo=true;		
			for (i=2;i<K[i];i++)
			{
				int resto;
				resto=K[i]%i;						
					if(resto==0)
					{
						primo=false;			
					}
			}
			if (primo==true)
			{
				P[cont]=K[i];
			}
	cont++;
	}
}
	
	int main()
{          
	
 	setlocale(LC_ALL,"Portuguese");
 	
    int P[15], K[15], i=0, j, primos;
 
        for (j=1; j<=15; j++)
		{
            printf("Digite os valores [%d]:",j);
            scanf(" %d", &K[j]);
        }
 
        verifica_primo(K,P);
 
        for (i=1; i<=15; i++)
		{
            printf("Os valores primos são [%d]: %d \n",P[i]);
        }
        system("pause");
}

 

Link para o comentário
Compartilhar em outros sites

Algumas dicas:

  1. Procure usar funções, para isolar determinadas responsabilidades. Por exemplo:
    1. Uma para determinar se um número é primo.
    2. Outra para decidir o que fazer com esse número, caso seja primo.
  2. TRUE e FALSE já são definidos no cabeçalho stdbool.h, você não precisa esquentar a cabeça com isso reinventando a roda 😉.
  3. Como você precisa de ao menos dois vetores e duas variáveis para guardar seus tamanhos (C não tem isso nativo), então terá dois pares de dados iguais (o vetor e o tamanho dele). Uma solução mais elaborada poderia usar struct para encapsular esses dados.
  4. Sobre o código, dê um pouquinho mais de capricho à organização dele (indentação, espaçamento de linhas, etc), isso facilita muito quando precisa encontrar algum problema.
Link para o comentário
Compartilhar em outros sites

Na programação (ou função) que faz o teste e seleção de primos no vetor (K) existe erro lógico no 'loop' de fatores divisores. A mesma falha há também na expressão de cálculo no resto da divisão (inteira) do número testado no corpo desse mesmo 'loop'. for (i=2; i<K[i]; i++), resto=K[i]%i; essas e outras falhas são apartes cruciais de tua aprendizagem e corrija-as.

Link para o comentário
Compartilhar em outros sites

Eis seu código com algumas correções na função de contagem:

/*
 * Faça uma função que receba, por referência, um vetor K[15] e retorna, também
 * por referência, um vetor P contendo apenas os valores primos de K.
 */

#include <stdio.h>
#include <locale.h>

#define QUANTIDADE 15

void limparBuffer() {
    while (getchar() != '\n');
}

int verifica_primo(int K[], int P[]) {
    // Indica a posicao de P que o valor deve ser adicionado
    int posicao = 0;

    // Indica a quantidade de numeros primos encontrada
    int quantidadePrimos = 0;

    // Percorre todos os valores de K
    for (int i = 0; i < QUANTIDADE; ++i) {
        // Os valores sao resetados a cada iteracao
        int cont = 0;
        int resto = 0;

        /*
         * Verifica os divisores de K[i], um numero primos possui apenas dois
         * divisores. Logo P recebera o valor apenas se cont for igual a dois.
         */
        for (int j = 1; j <= K[i]; ++j) {
            resto = K[i] % j;

            if (resto == 0) {
                cont++;
            }
        }

        if (cont == 2) {
            P[posicao] = K[i];
            posicao++;
            quantidadePrimos++;
        }
    }

    return quantidadePrimos;
}

int main() {
    setlocale(LC_ALL, "Portuguese");

    int K[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    int P[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

    int lido = 0;
    int quantidadePrimos = 0;

    for (int j = 0; j < QUANTIDADE; j++) {
        do {
            // Fica pedindo o valor enquanto a entrada for invalida
            printf("Digite o valor [ %d de %d ]: ", (j + 1), QUANTIDADE);
            lido = scanf("%d", &K[j]);
            limparBuffer();
        } while (lido == 0);
    }

    quantidadePrimos = verifica_primo(K, P);

    printf("%d valores primos: \n", quantidadePrimos);

    for (int i = 0; i < quantidadePrimos; i++) {
        printf("%d \n", P[i]);
    }

    return 0;
}

 

Link para o comentário
Compartilhar em outros sites

@AdrianoSiqueira , moço, muito obrigada! Eu estou há alguns dias tentando fazer, mas realmente não tinha ideia de como retornar os números que eu queria. Vou entender o código. Só tenho mais uma dúvida quanto a isso while (getchar() != '\n')... para que serve? Agradeço se responder. 

Link para o comentário
Compartilhar em outros sites

A função scanf não foi feita para ler dados do teclado e quando usada para isso, principalmente para ler valores numéricos, fica resíduos (lixo) no buffer do teclado.

 

É mais ou menos assim, quando você digita um número, o buffer fica dessa forma:

123\n

 

O 123 é o valor digitado, o \n é o ENTER. O scanf pega apenas o 123 e deixa o \n. Na próxima vez que você chamar o scanf para pegar algum dado não numérico, ela vai usar o \n que ficou no buffer e passar direto sem deixar você digitar alguma coisa.

Link para o comentário
Compartilhar em outros sites

 

Para ver acontecendo, execute esse código:

#include <stdio.h>

void limpar() {
    while(getchar() != '\n');
}

int main() {
    int numero1 = 0;
    int numero2 = 0;
    
    char palavra[100] = "";
    
    printf("Digite um numero: ");
    scanf("%d", &numero1);
    // limpar();
    
    printf("Digite outro numero: ");
    scanf("%d", &numero2);
    // limpar();
    
    printf("Digite uma palavra: ");
    scanf("%[^\n]", palavra);
    // limpar();
    
    printf("-------------------- \n");
    printf("Numero 1: %d \n", numero1);
    printf("Numero 2: %d \n", numero2);
    printf("Palavra: '%s' \n", palavra);
    printf("-------------------- \n");
    
    return 0;
}
  

Depois, descomente as 3 linhas que chama limpar() e execute de novo. Depois me conta a diferença 😉.

1 minuto atrás, Aluna gab disse:

@AdrianoSiqueira , entendi! Muito obrigada! E para que colocou o do-while? O código estaria certo sem isso, isto é, ele funcionaria sem essa função?

É apenas uma camada de segurança para evitar entrada inválida, o scanf retorna a quantidade de dados válidos que foram lidos, como eu quero apenas um número, eu verifico se o scanf conseguiu ler 1 dado válido.

Para ver o retorno do scanf, execute esse código:

#include <stdio.h>

void limpar() {
    while(getchar() != '\n');
}

int main() {
    int numero1 = 0;
    int numero2 = 0;
    int lido = 0;
    
    printf("Digite um numero: ");
    lido = scanf("%d", &numero1);
    limpar();
    
    printf("Entrada valida lida: %d \n", lido);
    
    printf("Digite dois numeros: ");
    lido = scanf("%d %d", &numero1, &numero2);
    limpar();
    
    printf("Entradas validas lidas: %d \n", lido);
    return 0;
}

Digite dados válidos e inválidos de propósito e veja o que acontece.

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