Ir ao conteúdo
  • Cadastre-se
Karinac3

C Problemas com vetor char

Recommended Posts

Boa noite pessoal, estou aprendendo programação e preciso criar duas funções segundo este enunciado:

Escreva uma função, chamada numero_perfeito, que receba um número inteiro positivo como parâmetro e retorne um inteiro 1 caso o número for perfeito ou 0 caso contrário. Após, escreva outra função, chamada de encontra_perfeito, que recebe dois inteiros positivos representando um intervalo fechado (min e max) e um vetor de caracteres. A função colocará dentro do vetor de caracteres todos os números inteiros perfeitos dentro do intervalo recebido, separados por vírgula e sem vírgula após o último número. A função não retorna nada (void). Por exemplo, se min for 1 e max for 100, o vetor deverá conter "6,28".

Obs.: Diz-se que um número inteiro é um número perfeito se a soma de seus fatores, incluindo 1 (mas não o numero em si), resulta no próprio número. Por exemplo, 6 é um número perfeito porque 6 = 1+2 + 3. 

 

Este foi o meu desenvolvimento:

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

int numero_perfeito (int num){
    int fat = 0, i;
    for (i=1; i<num; i++){
        if ((num%i) == 0)
            fat = fat + i;}

    if (fat == num){
        return 1;}

    else
        return 0;}

void encontra_perfeito (int max, int min, char vetp[0]){
    int cont=0, i, n=0;
    char perf[0];

    for (i=0; i<max; i++){
        vetp = 0;
        perf = 0;
    }
    for (i=1; i<max; i++){
        vetp[n]= min+1;
        n = n+1;
        if (numero_perfeito(vetp) == 0){
            perf[cont] = vetp;
                cont = cont+1;
        }
    }
    for (i=0; i<cont; i++){
        printf("%c ,", perf);
    }
}

int main(){
    int max, min;
    char vetp[0];
    printf("Digite o intervalo: ");
    scanf ("%i %i", &min, &max);

    encontra_perfeito(max, min, vetp[0]);
    return(0);
}

 

Porém a função encontra_perfeito retorna apenas lixo da memória e eu não consigo achar meu erro. Alguém pode me ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiro que não é a soma dos seus fatores e sim de seus divisores.

adicionado 5 minutos depois

O vetor, não pode ser declarado com zero elementos, dessa forma qualquer coisa que você atribuir a ele não será gravado.

Você terá que colocar uma quantidade válida de elementos na declaração do vetor, tipo vetp[100].

 

C não é uma linguagem dinâmica, tudo tem que ficar amarrado na declaração das variáveis.

adicionado 11 minutos depois

Outro erro, nessa declaração:

void encontra_perfeito (int max, int min, char vetp[0])

vetp deve ser declarado vetp[], pois recebe um vetor determinado.

adicionado 13 minutos depois

A declaração de perf[0] tem quantidade de elementos inválida.

No caso aqui:

vetp = 0;
perf = 0;

Não pode atribuir zero ao vetor, e si ao seus índices.

  • Curtir 3

Compartilhar este post


Link para o post
Compartilhar em outros sites

Os índices [ i ] sumiram pois originalmente o código foi postado sem usar o botão Code < > , depois o tópico foi editado e o código foi colocado no lugar correto, mas aí já estava sem os índices. Pra o código aparecer corretamente é preciso colocar o código original, contendo os [ i ], no fórum usando o botão Code < >.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
8 horas atrás, Karinac3 disse:

A função colocará dentro do vetor de caracteres todos os números inteiros perfeitos dentro do intervalo recebido, separados por vírgula e sem vírgula após o último número.

Nessa parte do sistema o número se perfeito é convertido do digital para strings.  Use a função snprintf cplusplus.com. No link há todas as explicações, mesmo assim não hesite em perguntar.

 

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá pessoal, obrigada pela ajuda. Já arrumei o erro com os vetores e aprendi a usar a função snprintf, porém a minha segunda função continua a retornar um valor negativo mesmo com todas as atualizações:

void encontra_perfeito (int max, int min, char vetp[]){
    int cont=0, i, n=0;
    char perf [max];

    for (i=0; i<max; i++){
        vetp[i] = 0;
    }
    vetp[0] = min;
    for (i=1; i<max; i++){
        vetp[n]= min+1;
        n = n+1;
    }
    for (i=0; i<max; i++){
        if (numero_perfeito(vetp[i]) == 0){
            perf[cont] = vetp[i];
                cont = cont+1;
        }
    }
    for (i=0; i<cont; i++){
        snprintf(vetp, sizeof(vetp), "Vetor: %s,", perf[i]);
    }
}

Alguém consegue achar algum erro na lógica que eu fiz e ainda não notei?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi que, a conversão para string do número perfeito ocorre logo em seguida que definido perfeito.

Então:

  1. Um loop percorre de min até max; Todos os valores k : min  ≤  ki  ≤  max
  2. Se ki é perfeito então converte ki para string;
  3. Salva no vetor de char e coloca uma vírgula;
  4. Repete 1 ... 3 até que ki  ≤  max;
  5. Remove a última vírgula do último perfeito.

 

Essa é um sugestão, acho melhor ir convertendo a medida que tem a confirmação para perfeito do que acumular esses números para depois salvar no vetor.

 
 
1 hora atrás, Karinac3 disse:

snprintf(vetp, sizeof(vetp), "Vetor: %s,", perf[i]);

Quando salvar no vetor: segundo o enunciado, as únicas coisas que são salvas nele é: o número perfeito e uma virgula depois dele para separa-los; a vírgula somente se não for o último perfeito caso seja o último tem que remover a vírgula.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
21 minutos atrás, AnsiC disse:

Essa é um sugestão, acho melhor ir convertendo a medida que tem a confirmação para perfeito do que acumular esses números para depois salvar no vetor.

Mas como seria possível converter o inteiro para string e aloca-lo no vetor que tem que ser impresso se eu não possuir o tamanho do vetor que tem que ser impresso?

 

Para o problema da vírgula pensei em usar um for para adicionar a pontuação apenas nas posições ímpares do vetor. Mas ainda estou pensando em com implementar isso.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seguindo todos os meus conselhos até o momento, será capaz de fazer isto:

#include  <stdio.h>  /**< Inclua printf; */

void encontrar_perfeito (char lista[], int minimo_positivo, int max_positivo);
int numero_perfeito (int positivo);

int main (int argc, char **argv){
    char lista[BUFSIZ];
        encontrar_perfeito (lista, 1, 10000);
        printf ("números perfeitos de %d à %d: %s\n\n", 1, 10000, lista);
    return  0; }


/** algoritmo [@Karinac3] */
int numero_perfeito (int num){
    int i, fat = 0;
        for (i = 1; i  <  num; i++){
              if ((num%i)  ==  0){ fat = fat + i; }}
  
        if (fat  ==  num){ return  1; }
    return  0; }


void encontrar_perfeito (char lista[BUFSIZ], int min, int max){
    int x = 0;
        for (int k = min; k  <=  max; k++){
              if (numero_perfeito(k)){
                    x += snprintf (lista + x, BUFSIZ - x, "%d,", k); }}
  
        lista[(x - 1)  >  -1? (x - 1) : (0)] = '\0';
    return  ; }

Alguma dúvida?

 
 
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@AnsiC Obrigada pela ajuda! 

Com as suas sugestões o meu programa passou em 1 dos 3 testes propostos pelo professor.

Os erros são: vírgula após o último número e dar como resposta 28, quando era esperado 28,486

Vou tentar conversar com ele amanhã e verificar como corrigir esses problemas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O programa implementado no post #8 é bom exemplo de solução para essa questão.

 

 

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

×