HACKING 120% {Hacking, programmazione, computer & molto altro}

[C] Sommare 2 stringhe

« Older   Newer »
  Share  
carbos
view post Posted on 27/8/2013, 10:57     +1   -1




In realtà questo esercizio l'ho fatto per imparare meglio il C sotto consiglio di un amico, siccome gli Int e i Large Int hanno un massimo di capienza (dipende dalla macchina) ho creato un programma che riceve i dati di input come stringa e che poi li adatta per fare le somme, aggiungendo gli 0 se riscontra spazi, o altri caratteri non uguali a numeri (il tutto nella funzione migliora) , poi passa le stringhe ottenute nel programma "sommastringa" dove ogni carattere viene trasformato nel suo corrispondente "intero" e poi vengono sommati, e di conseguenza ritrasformati in carattere.
Se siete alla prima vista di un linguaggio nativo, o vedete cose che non sapete chiedete pure, però vorrei precisare una cosa, che quando ero nabbo aveva colpito anche a me, per gli interi faccio "- '0' " perchè quando fai il cast , ovvero trasformare un char in int , mettendo (int) all'inizio, il carattere , viene trasformato nel suo valore ASCII, e siccome se noi facciamo (int) '0' ci verrà come int 48, e noi abbiamo bisogno dello 0, basterà sottrare il nostro carattere a 48 oppure a '0' (ricordate che in C i caratteri vengono sempre messi tra gli apici unici, ovvero ' e non tra i doppi apici, quelli si usano per le stringhe).
Detto ciò, eccovi il source:
CODICE
#include <stdio.h>
#include <malloc.h>
#include <string.h>
char* sommastringa(char* , char* , int);
char* migliora(char* , int);
char* migliora(char *arr , int c){
       char *res = (char*) malloc(sizeof(char) * c);
       int i, a = 0;
       for(i = 0 ; i < c ; i++){
               if(arr[i] < '0' || arr[i] > '9'){
                       res[a] = '0';
                       a++;
               }
       }
       for(i = 0; i < c ; i++){
               if(arr[i] > '0' && arr[i]  < '9'){
                       res[a] = arr[i];
                       a++;
               }
       }
       return res;
}


char* sommastringa(char *a , char *b , int c){
       char *res = (char*) malloc(sizeof(char) * c);
       int i , q , w , e , tot;
       for(i = c - 1 ; i >= 0 ; i--){
               q = (int) a[i] - '0';
               w = (int) b[i] - '0';
               e = (int) res[i] == '1' ? 1 : 0;
               tot = q + w + e;
               if(tot > 9){
                       res[i] = (char) tot - 10 + '0';
                       res[i - 1 ] = '1';
               } else {
                       res[i] = (char) tot + '0';
               }
       }
       return res ;
}


main(){
       int c;
       printf("Dimensione massime del numero: ");
       scanf("%d" , &c);
       char *a = (char*) malloc(sizeof(char) * c );
       char *b = (char*) malloc(sizeof(char) * c );
       printf("Inserire il primo numero: ");
       scanf("%­s" , a);
       printf("Inserire il secondo numero: ");
       scanf("%­s" , b);
       char *f = migliora(a , c);
       char *g = migliora(b , c);
       char *h = sommastringa(f , g , c);
       int i;
       printf("%­s",  h);
       free(h);
       free(g);
       free(f) ;
       free(a) ;
       free(b) ;
}

L'unica cosa che non mi piace del mio codice è che uso troppi puntatori, forse potevo evitare di crearne così tanti... ma vabbe asd buon divertimento
 
Top
PaperonePazzo
view post Posted on 27/8/2013, 12:02     +1   -1




Questo source è meglio, asd.


CODICE
#include <iostream>

int main()
{
 
 std::cout << "Inserisci il primo numero" << std::endl;

 
 int numero1;

 std::cin >> numero1;

 std::cout << "Inserisci il secondo numero" << std::endl;
 int numero2;
 std::cin >> numero2;

 
 int somma(numero1 + numero2);
 std::cout << "Il risultato e' " << somma << std::endl;

 return 0;
}


Appena fatto, è C++
 
Top
carbos
view post Posted on 27/8/2013, 22:39     +1   -1




Solo in C ho fatto veri source perchè me li faceva fare una persona per imparare
 
Top
PaperonePazzo
view post Posted on 28/8/2013, 08:33     +1   -1




CITAZIONE (carbos @ 27/8/2013, 23:39) 
Solo in C ho fatto veri source perchè me li faceva fare una persona per imparare

Comunque, il tuo source è baggato, hai controllato se funge? L'ho compilato con l'ultima versione di devc++ e sul secondo numero sull'inserisci il secondo numero si bugga, comunque, lol, continua a studiare il C, e non saltare gli argomenti.
 
Top
carbos
view post Posted on 28/8/2013, 11:05     +1   -1




sisi l'ho provato a me con devc++ funziona... non capisco come ti si bugghi D: forse metti un numero troppo alto al primo elemento... Cmq si sto ancora studiando, adesso mi sto pure leggendo il Deitel :asd:
 
Top
PaperonePazzo
view post Posted on 28/8/2013, 13:27     +1   -1




asd, non mi va di debuggare il tuo code, è troppo impicciato, piuttosto lo riscriverei, tu comunque, stai più attento nello studio. Più è semplice il tuo code e meglio è.
 
Top
carbos
view post Posted on 28/8/2013, 19:11     +1   -1




asd cmq tranquillo che funziona, paperone, lo so che può essere fatto in modo migliore XD però le mie conoscenze fanno a fatica quel codice :asd:
 
Top
RootkitNeo
view post Posted on 1/9/2013, 17:53     +1   -1




CITAZIONE (PaperonePazzo @ 27/8/2013, 13:02) 
Questo source è meglio, asd.


CODICE
#include <iostream>

int main()
{
 
 std::cout << "Inserisci il primo numero" << std::endl;

 
 int numero1;

 std::cin >> numero1;

 std::cout << "Inserisci il secondo numero" << std::endl;
 int numero2;
 std::cin >> numero2;

 
 int somma(numero1 + numero2);
 std::cout << "Il risultato e' " << somma << std::endl;

 return 0;
}


Appena fatto, è C++

Sarà anche meglio, però è sbagliato. La somma deve essere fatta sottoforma di stringhe non di interi. Un int non contiene più di 32bit.
 
Top
PaperonePazzo
view post Posted on 1/9/2013, 18:34     +1   -1




CITAZIONE (RootkitNeo @ 1/9/2013, 18:53) 
CITAZIONE (PaperonePazzo @ 27/8/2013, 13:02) 
Questo source è meglio, asd.


CODICE
#include <iostream>

int main()
{
 
 std::cout << "Inserisci il primo numero" << std::endl;

 
 int numero1;

 std::cin >> numero1;

 std::cout << "Inserisci il secondo numero" << std::endl;
 int numero2;
 std::cin >> numero2;

 
 int somma(numero1 + numero2);
 std::cout << "Il risultato e' " << somma << std::endl;

 return 0;
}


Appena fatto, è C++

Sarà anche meglio, però è sbagliato. La somma deve essere fatta sottoforma di stringhe non di interi. Un int non contiene più di 32bit.

Omg, vero, asd.

Modifico il code includendo LIMITS
 
Top
RootkitNeo
view post Posted on 1/9/2013, 23:01     +1   -1




Lo scopo era comunque non utilizzare alcuna libreria, ma scriversi tutto il codice "a mano". ^^
 
Top
carbos
view post Posted on 6/9/2013, 11:05     +1   -1




Si è stato root a dirmi di fare questo :asd:
 
Top
PaperonePazzo
view post Posted on 6/9/2013, 14:03     +1   -1




CITAZIONE (RootkitNeo @ 2/9/2013, 00:01) 
Lo scopo era comunque non utilizzare alcuna libreria, ma scriversi tutto il codice "a mano". ^^

infatti mi è sembrato strano complicarsi la vita in quel modo.
 
Top
carbos
view post Posted on 6/9/2013, 14:44     +1   -1




Paperone era per esercitarsi :asd:
 
Top
PaperonePazzo
view post Posted on 6/9/2013, 14:50     +1   -1




CITAZIONE (carbos @ 6/9/2013, 15:44) 
Paperone era per esercitarsi :asd:

Era meglio bubblesort come esercizio, asd.
 
Top
RootkitNeo
view post Posted on 6/9/2013, 14:54     +1   -1




CITAZIONE (PaperonePazzo @ 6/9/2013, 15:50) 
CITAZIONE (carbos @ 6/9/2013, 15:44) 
Paperone era per esercitarsi :asd:

Era meglio bubblesort come esercizio, asd.

Gli ho assegnato anche quello, e la ricerca dicotomica.

Quello della somma tra stringhe era un esercizio postato sul forum, non assegnato a lui direttamente.
 
Top
16 replies since 27/8/2013, 10:57   227 views
  Share