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

Editado por Karinac3

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.

 

 

Editado por AnsiC
  • 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.

Editado por AnsiC
melhorar a mensagem
  • 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?

 
 
Editado por AnsiC
melhorar a mensagem
  • 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.

 

 

Editado por AnsiC
melhorar a mensagem

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

×