Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Phermitheus

Programa em C

Recommended Posts

Boas pessoal,

 

Tenho um projecto da faculdade para fazer que é o seguinte:

 

Enunciado

 

O programa deve ler um número inteiro positivo e escrever no ecrã a

soma dos produtos dos seus dígitos pelas respectivas posições que

ocupam. As posições são enumeradas da esquerda para a direita e

devem começar em 1. O programa deve certificar que o número lido é

válido e que todas as condições de erro são tratadas de forma adequada.

O programa só deve escrever mensagens em Português. O programa

deve possuir um ciclo de leitura e, portanto, ser capaz de processar mais

do que um número de cada vez.

Por exemplo, se 456789 for o inteiro lido, a posições dos dígitos 4 5 6 7 8

e 9 são respectivamente 1 2 3 4 5 e 6. O programa deve, portanto,

escrever o resultado da seguinte soma

1*4 + 2*5 + 3*6 + 4*7 + 5*8 + 6*9

Valores como 34a56 devem ser considerados inválidos.

 

Sabendo que neste programa não posso usar strings, nem vectores, qual é a melhor solução que me aconselham para fazer o programa?

 

Cumprimentos,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom com ctz ñ é a melhor forma, + você pode ir lendo caracter por caracter até encontrar um \n, q vai denominar o fim da linha, seria td dentro de um loop!

 

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom com ctz ñ é a melhor forma, + você pode ir lendo caracter por caracter até encontrar um \n, q vai denominar o fim da linha, seria td dentro de um loop!

 

[]s

 

Boas :)

 

Pois compreendo.. não tou a ver como vou fazer isso.

 

Abraço

 

CF

Compartilhar este post


Link para o post
Compartilhar em outros sites

p*** m*** sem vetor é complicado FHDUSAHFUADSH.

To pensando numa maneira...

 

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

matemática.

 

Um número inteiro pode ser escrito como um polinômio na forma:

x0*10^n + x1*10^(n-1) + ... + xN * 10^0

No caso do exemplo, o número 456789, imagine que (x0, ..., x5) = (4, ..., 9)

Logo, para pegar o n-ésimo digito fazemos:

Seja a pertencente aos inteiros,

| a | (mod 10^n)
----------------
    10^(n-1)

Portanto:

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

//a "fórmula" que mostrei ali em cima
inline int pegaDigito(int numero, int n)
{	return (fmodf(numero, pow(10.0, n)) / pow(10.0, n-1));	}

int mostraDigitos(int a)
{
int n = 1;
int total;
	
	//vamos descobrir a ordem do número:
	while (fmodf(a, pow(10.0, n)) != a)
		n++;
		
	total = n+1;
	
	for (; n>0; n--)
		printf("%d*%d + ", total-n, pegaDigito(a, n));
		
	printf("0\n");
}

int main()
{
	mostraDigitos(456789);
	return 0;
}

=D

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Detalhe: o problema não é a conversão, e sim a leitura:

 

Valores como 34a56 devem ser considerados inválidos.

 

- Sem string

- Sem array

 

O que sobra é leitura de char por char (já que pede pra validar a entrada) ou operações exóticas com memória, FILE * e outros.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Detalhe: o problema não é a conversão, e sim a leitura:

 

Valores como 34a56 devem ser considerados inválidos.

- Sem string

- Sem array

 

O que sobra é leitura de char por char (já que pede pra validar a entrada) ou operações exóticas com memória, FILE * e outros.

 

Bom dia,

 

Pois é, a solução deve ser ler valor por valor, mas é complicado não usar vector/array, deixa muito que pensar ..

 

Cumprimentos,

CarlosF

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha, andei pensando, e podemo usar uma gambiarra:

int main()
{
char c;
int readN;
FILE *f;

	f = fopen("~file.txt", "w+");

	while (fread(&c, 1, 1, stdin) && (c != '\n'))
		if (!('0' <= c && c <= '9'))
		{
			fputs("Error: invalid number\n", stderr);
			return 1;
		}
		else
			fputc((int)c, f);

	rewind(f);
	fscanf(f, "%d", &readN);
	
		
	mostraDigitos(readN);
	return 0;
}

-------------------

edit:

 

Se não puder criar um arquivo temporário, o único jeito que eu vejo é com pipes.

Com pipes vai ficar razoavelmente grande a parte da leitura.

você deve ler caractere à caractere, escrever na write-end do pipe, depois converta o pipe para um FILE* e leia o número que la estiver com um fscanf(f, "%d", &num).

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.