/* nobody */ #include #include #include struct ZAHL {int stellen; int zellen; int *feld;}; struct ZAHL newZ(int lange); char *mult(char*, char*); void summe(struct ZAHL *o, struct ZAHL *u, struct ZAHL *e); void mulZ(struct ZAHL *a, struct ZAHL *e, int z); void mal10(struct ZAHL *z); int check(char *t); void prife(struct ZAHL *feld, char *name); char *multtest(char *a, char *b); int main(void){ char string[81]; /* Speicher fuer einen String der Laenge 81 reservieren */ char string2[81], string3[81], *ergebnis; char t1[]="1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"; char t2[]="12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"; int i=0; /* sauberer Bildschirm */ clrscr(); printf("Pflichtprogramm zum Multiplizieren zweier Dezimalzahlen E-Tech. Sem.3\n"); printf("(mit Vorzeichen und Komma ;-)\n\n"); printf("\nBitte geben Sie die erste Zahl (String) ein:\n\t"); gets(string2); printf("Bitte geben Sie die zweite Zahl (String) ein:\n\t"); gets(string3); if(check(string2)&&check(string3)){ ergebnis=mult(string2, string3); printf("\nDie Multiplikation ergab:\n\t%s\n", ergebnis); free(ergebnis); } else printf("\nBuchstaben werden hier nicht multipliziert!!\n"); /* Ergebnis Betrachten */ printf("\n\n\nBitte eine Taste drcken\n"); getch(); clrscr(); /* zweiter TEST */ printf("Zweiter Test:\n\n"); printf("%s\nmal\n%s\n=\n",t1,t2); ergebnis=mult(t1,t2); printf("%s\n",ergebnis); /* Ergebnis Betrachten */ printf("\n\n\nBitte ein etaste drcken\n"); getch(); return 0; } char *mult(char *a, char *b){ int i,k,lena,lenb,nkstellen=0,vz=1,biszu=0; struct ZAHL aZ, bZ, eZ, hZ; char *dummy, *erg; erg=(char *)malloc(strlen(a)+strlen(b)+1); /* kurze Zahl hinten -> b */ if(strlen(a)=biszu;i--){ if(a[i]=='.'||a[i]==',') nkstellen+=lena-i-1; else{ aZ.feld[k]=a[i]-'0'; aZ.stellen++; /*printf("%i ",aZ.feld[k]);*/ k--; } } biszu=0; if(b[0]=='-'){ vz*=-1; biszu=1; } if(b[0]=='+') biszu=1; k=bZ.zellen; for(i=lenb-1;i>=biszu;i--){ if(b[i]=='.'||b[i]==',') nkstellen+=lenb-i-1; else{ bZ.feld[k]=b[i]-'0'; bZ.stellen++; k--; } } /*prife(&aZ, "erste Zahl");*/ /* Rechnen */ mulZ(&aZ,&eZ,bZ.feld[bZ.zellen-bZ.stellen+1]); i=bZ.zellen-bZ.stellen+2; for(i;i<=bZ.zellen;i++){ mal10(&eZ); mulZ(&aZ,&hZ,bZ.feld[i]); summe(&eZ,&hZ,&eZ); } /*summe(&aZ,&bZ,&eZ);*/ /*printf("\n%i<>%s<>%s<<%i--%i",nkstellen,a,b,aZ.stellen,aZ.feld[1]);*/ /* zurck zum String */ k=0; if(vz<0){ erg[k]='-'; k++; biszu=1; } i=eZ.zellen-eZ.stellen+1; for(;i<=eZ.zellen;i++){ if(k==eZ.stellen-nkstellen+biszu){ erg[k]='.'; i--; } else erg[k]=eZ.feld[i]+'0'; /*printf("%i ",eZ.feld[i]);*/ k++; } erg[k]='\0'; /*prife(&eZ, 'Y');*/ free(aZ.feld); free(bZ.feld); free(eZ.feld); return erg; } /* Summe zweier Zahlen */ void summe(struct ZAHL *o, struct ZAHL *u, struct ZAHL *e){ int i,ku,ke,es=0,x,y,s,c,c_=0; struct ZAHL *dummy; /* lange Zahl oben -> *o */ if(o->stellenstellen){ dummy=o; o=u; u=dummy; } ku=u->zellen; ke=e->zellen; for(i=o->zellen;i>o->zellen-o->stellen;i--){ x=o->feld[i]; if(ku>u->zellen-u->stellen) y=u->feld[ku]; else y=0; s=(x+y+c_)%10; c=(x+y+c_)/10; e->feld[ke]=s; /* printf("\n%i+%i=%i",x,y,e->feld[ke]); */ es++; c_=c; ku--; ke--; if(i==o->zellen-o->stellen+1&&c_>0){ e->feld[ke]=c_; es++; /*printf("\nšbertrag: %i",e->feld[ke]); */ } } e->stellen=es; /*prife(e, "summe");*/ } /* Zahl mal Ziffer */ void mulZ(struct ZAHL *a, struct ZAHL *e, int z){ int i,k,es=0,s,c,c_=0; k=e->zellen; for(i=a->zellen;i>a->zellen-a->stellen;i--){ s=(a->feld[i]*z+c_)%10; c=(a->feld[i]*z+c_)/10; e->feld[k]=s; es++; /*printf("\n%i*%i=%i",a->feld[i],z,e->feld[k]);*/ c_=c; k--; if(i==a->zellen-a->stellen+1&&c_>0){ e->feld[k]=c_; es++; /*printf("\nšbertrag: %i",e->feld[k]);*/ } } e->stellen=es; /*prife(e, "mulZ");*/ } /* Zahl mal 10 */ void mal10(struct ZAHL *z){ int i,k; for(i=z->zellen-z->stellen;i<=z->zellen;i++){ z->feld[i]=z->feld[i+1]; } z->feld[z->zellen]=0; z->stellen++; /*prife(z, "mal10");*/ } struct ZAHL newZ(int lange){ struct ZAHL z; z.stellen=0; z.zellen=lange; z.feld=(int *)calloc(lange,sizeof(int)); /* mal alles voller Nuller */ return z; } int check(char *t){ int lange=strlen(t); int re=1; int i=0; char a; if(*t=='\0') return 0; for(i;ifeld[i]);} printf(" Stellen=%i\n",feld->stellen); } /* šbung 2 zum Testen */ char *multtest(char *a, char *b){ long int la, lb, lerg; int len=strlen(a)+strlen(b); char *erg=malloc(len+1); la=atol(a); lb=atol(b); lerg=la*lb; /*hier wird in die Variable "erg" geschrieben!!*/ sprintf(erg, "%ld", lerg); return erg; }