Ir ao conteúdo

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


Posts recomendados

Postado

 

 

 

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");
}

 

Postado

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

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.

Postado

@mauro_b , obrigada! Mas não sei ainda a forma de mudar isso, o que devo colocar no lugar. Você poderia me ajudar?

Postado

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

 

Postado

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

Postado

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.

Postado

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

Postado

 

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.

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!