[Resolvido] Prova dos noves C

Faço Análise e Desenvolvimento de Sistemas, meu professor pediu um algoritmo que calcule a prova dos noves, porém, não estou conseguindo finalizar.

char num[4];
int numero,soma,i;
scanf("%d",&numero);
sprintf(buffer,"%d",numero);  
while(strlen(num)>1){
    soma=0;
    for(i=0; i <strlen(num);i++){
        soma += num[i] -'0';
    }
    //falta uma coisa aqui, não sei o que
}
printf("Resultado é: %??",??);  
return 0;

Pois é cara… Já tentou procurar o algoritmo de prova dos nove?

Ali parece que você não fez nada, só colou o exercício. Mas, bota como texto pre-formatado pra ser possível ler. E colocar todo o programa ajuda também.

2 curtidas

Bom, na verdade o código acima eu quem escrevi, porém só não estou conseguindo finalizar.
Procurei o algoritmo sim, achei em diversas linguagens menos em C. Inclusive eu fiz ele em C# no semestre anterior, porém em C não consigo, não tenho tanto conhecimento da linguagem.

[quote="IWiLL]
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <conio.h>

int main()
{
    char num[4];
int numero,soma,i;
scanf("%d",&numero);
sprintf(num,"%d",numero);
while(strlen(num)>1){
    soma=0;
    for(i=0; i <strlen(num);i++){
        soma += num[i] -'0';
    }
    //falta uma coisa aqui, não sei o que
}
printf("Resultado é: %??",??);
return 0;
}

[/quote]

O algoritmo é a descrição dos passos pra resolver o problema, não precisa ser em nenhuma linguagem de programação específica. Você só tem que entender ele.

No código acima você só está somando os dígitos. Beleza, mas prova dos nove não é pra testar em relação à soma/divisão/subtração entre 2 números? Tem vários jeitos de calcular, dá pra usar raiz digital, resto da divisão e aquele jeito ensinado na escola.

Sem saber o que tu quer complica. Vê no código que você já tem pra tentar entender, e qualquer coisa depois cola ele que tento te ajudar.

1 curtida

O que eu quero é pegar um numero exemplo 4096 e fazer a prova dos nove com ele

4 + 0 + 9 + 6= 19
1 + 9 = 10
1 + 0 = 1

É basicamente isso que preciso que o código faça.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Noves
{
 class Program
 {
 static void Main(string[] args)
 {
 Console.Write("Digite um número: ");
 string num = Console.ReadLine();
 int soma;
 while (num.Length > 1)
 {
 soma = 0;
 for (int i = 0; i < num.Length; i++)
 {
 soma = soma + int.Parse(num[i].ToString());
 }
 num = soma.ToString();
 }
 Console.WriteLine("Resultado: {0}", num);
 Console.ReadKey();
 }
 }
}

Esse é o código que escrevi em C#.

Peço desculpas pela falta de conhecimento em relação a formatação do código aqui no fórum.

Ta, o que falta é essa linha parece. Né? Ou to vendo vesgo as coisas?

Pra converter o numero em string faz assim:

snprintf(num, 4, "%d", soma);

Onde 4 é o tamanho do buffer.

Você já tem uma linha que faz isso no começo do programa. Mas não use sprintf, usa snprintf que é melhor devido a que garante que vai caber no string.

1 curtida

Pelo que entendi, no final sempre vai sobrar um número menor que 10, né?

Se for isso mesmo, acho que tenho uma solução.

O primeiro passo é não tentar converter string pra números e vice-versa. Vamos trabalhar apenas com números.

O segredo pra isso funcionar vai ser o seguinte:

  1. Dividimos o número por 10, porém pegamos apenas a parte que sobrou usando o operador %. Essa sobra será acumulada num variável temporária.

  2. Dividimos o número mais uma vez por 10, mas dessa vez guardamos o resultado normal. Esse resultado vai ser usado na próxima iteração do loop.

Bom, fiz o código abaixo pra demonstrar. Não fiz muitos testes, mas espero que sirva, pelo menos, pra demonstrar um forma alternativa de decompor um número inteiro.

Também não usei scanf, inseri o número direto no código. Essa parte vc já sabe, só lembre-se de usar o %d pra pegar um inteiro ao invés do %s.

#include <stdio.h>

int main(void) {
    int num = 4096;

    while(num > 9) {
        int temp = 0;
        while(num > 0) {
            temp = temp + num % 10;
            num = num / 10;
            printf("%6d  %6d\n", num, temp);
        }
        num = temp;
        puts("---------------");
    }

    printf("result: %d\n", num);
    return 0;
}
1 curtida

Se é pra fazer uma solução simples, a “prova dos nove” é simplesmente

prova_dos_nove = soma_dos_dígitos % 9;.

É o resto da divisão por 9. Não precisa iterar, mas ele pelo jeito deseja fazer do jeito mais semelhante ao manual por questões didáticas. Por isso que eu questionei ele tanto em relação a que algoritmo ele queria implementar, que me pareceu ser a intenção: exercício de implementar um algoritmo especifico.

2 curtidas

De fato é o que falta, porém, não resolveu o problema, já que ele finaliza no valor 4, o prazo para envio do trabalho é até 10h, infelizmente não irei conseguir resolver desta maneira, mas vou tirar minhas duvidas do que fiz de errado com meu professor e depois posto aqui só para fins de esclarecimento.
Agradeço sua ajuda!

Por questões didáticas mesmo é que queria fazer utilizando string, porém meu prazo se esgotou, então, utilizarei sua maneira.
Muito obrigado por me ajudar!

Por questões éticas, deveria mostrar apenas o que fez.
É parte do aprendizado errar. É parte entregar as coisas pela metade.
Além disso, se a maior parte da turma não entrega um produto bonito e bem feito, o professor deve fazer uma auto crítica e entender que ele está ensinando errado, ou indo muito rápido e pulando elementos essenciais ao aprendizado ou está utilizando uma linguagem de difícil compreensão, o que causa problemas com o o teu.
Sobre o que o @Kronal disse sobre algoritmos, ele está correto. A ideia de exercitar algoritmos é tornar a organização dos elementos necessários a resolução de um determinado problema automática, mental. É como decorar a tabuada, só que de números infinitos.
Reflita: nem todo mundo vai ser bom em C, é uma linguagem difícil e complicada, perto de outras como PHP, java e C#

1 curtida

Bom, desde o primeiro semestre ele costuma explicar o conteúdo, passar atividades em sala e listas para casa, tem funcionado, as atividades de casa, ele passa umas mais complicadas já que tem um certo tempo para faze-las.
O professor sempre incentivou buscar ajuda em problemas como este, já que como vc mesmo disse: “Nem todo mundo vai ser bom em C…” Participar de fóruns, grupos é uma ótima maneira de se aprender.
Não me orgulho de pegar algo da internet, porém aceito que meus conhecimentos são limitados e necessitei de ajuda para ter uma visão diferente de algo que precisava ser feito.
Para fazer o exercício por conta própria me baseei em um código que eu mesmo escrevi, fiquei aproximadamente 1 semana tentando faze-lo funcionar sozinho, quando resolvi pedir ajuda aqui foi pq aceitei que não iria conseguir fazer sozinho. Não desisti de fazer do jeito que iniciei, vou mandar o projeto com todas questões resolvidas e essa em especial irei linkar o tópico e deixar claro que não é de minha autoria. Em sala irei apresentar meu código inicial e pedir a ajuda dele.
Enfim, agradeço sua resposta!

Bom pessoal, tirei as duvidas com meu professor. Finalizei o código inicial com algumas modificações, segue abaixo.

 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 int main()
 {
    char num[10];
    int i, soma;
    printf("Digite um numero ");
   scanf("%9s",num);
   while(strlen(num)>1){
     soma=0;
     for(i=0; i<strlen(num);i++){
         if(num[i] == '\0') break;
         soma +=  num[i]-'0';
     }
     itoa(soma,num,10);
    }
    printf("O resultado e: %d\n",soma);
     return 0;
 }

Obrigado a todos que me ajudaram aqui!

1 curtida

itoa() não faz parte das bibliotecas do C nem C++ padrão. Usar snprintf() como recomendei é melhor.

O problema é que você parece não estar entendendo o que quer fazer.

Mas que bom que conseguiu solucionar seu problema.

1 curtida