PDA

View Full Version : [c] ancora sul progr. x fare sottrazione tra 2 numeri da 20 cifre..correzione urgente


Andre_Santarell
24-07-2006, 20:39
ciao, visto che l'altro post è andato un po' off topic, mi permetto di aprirne un altro, dove vi chiedevo la "correzione" del programma che ho battuto insieme ad un amico per fare la sottrazione tra due numeri naturali di massimo 20 cifre cad.

come appoccio ho seguito quello suggeritomi da Marinelli, moderatore del forum, ossia:

- Leggi il primo numero da input (come stringa) e verifichi che sia lungo 20 caratteri;
- Leggi il secondo numero da input e verifichi che sia lungo 20 caratteri o meno;
- Usando la funzione "atoi" dentro ad un for converti carattere per carattere la stringa in interi, che metti in un array (lo fai per entrambi i numeri)
- Con una funzione costruita ad hoc esegui la sottrazione tra i due array, facendo attenzione ai riporti e alla lunghezza dei due array; se entrambi gli array sono di 20 cifre devi controllare se il sottraendo non sia più grande del minuendo (se non sbaglio in questo caso devi restituire 0).

Per la conversione da carattere a intero puoi usare la funzione atoi:

http://www.cplusplus.com/ref/cstdlib/atoi.html

Per conoscere la lunghezza di una stringa puoi usare la funzione strlen:

http://www.cplusplus.com/ref/cstring/strlen.html

tuttavia il programma non funziona e io devo consegnarlo domani mattina.. per favore, è urgentissimo, qualcuno potrebbe correggere gli errori ?

grazie mille
ciao




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

#define TERM 100

int main(int argc, char *argv[])
{
char num[21];
char num2[21];

printf("Inserisci il primo numero\n");
scanf("%s",&num);
printf("Inserisci il secondo numero\n");
scanf("%s",&num2);

//Inizio a copiare l'array char dentro un array int
unsigned int num_i[20];
unsigned int num_i2[20];

int pos;
char temp[2];
temp[1]='\0';
for (pos=0; pos<=20; pos++)
{
temp[0]=num[pos];
num_i[pos]=atoi(temp);
printf("%i\n",num_i[pos]);
}

temp[1]='\0';
for (pos=0; pos<=20; pos++)
{
temp[0]=num2[pos];
num_i2[pos]=atoi(temp);
printf("%i\n",num_i2[pos]);
}

int numero[20],numero2[20];
memset(numero,'0',sizeof(numero));
memcpy(numero+20-strlen(num),num_i,strlen(num));
memset(numero2,'0',sizeof(numero2));
memcpy(numero2+20-strlen(num2),num_i2,strlen(num2));

//Inizio la sottrazione
int cicle,int result[20];
for (cicle=20;cicle>=0;cicle--)
{
if( sizeof(numero2) > sizeof(numero) )
printf("Errore! Perfavore inserire prima il numero maggiore!\n");
exit 0;
if( numero[cicle] > numero2[cicle])
result[cicle] = numero[cicle] - numero2[cicle];
if( numero[cicle] < numero2[cicle])
{
numero[cicle-1]--;
numero[cicle] += 10;
result[cicle] = numero[cicle] - numero2[cicle];
}
if( numero[cicle] < 0)
printf("Errore!\n");
printf("Il risultato della sottrazione è: %i",reult);

return(0);
}




:muro: :muro:

trallallero
25-07-2006, 07:43
ormai é tardi e comunque ci sarebbe voluto troppo tempo ... é pieno di e/orrori ! in bocca al lupo ;)

Marinelli
25-07-2006, 08:05
Ti ho risposto in privato stanotte.
Si poteva comunque continuare sull'altra discussione (ora le unisco), anche se effettivamente qualcuno ci aveva fatto i cavolacci propri sopra.

Ciao :)

Marinelli
25-07-2006, 08:11
Anzi, vedo che hai scritto la stessa cosa anche lì, dunque questa discussione la chiudo.

Ciao