PDA

نسخه کامل مشاهده نسخه کامل : حل يك مشكل



rell
18-07-2008, 23:07
با سلام. برنامه اي به شرح زير داريم:

برنامه اي كه با استفاده از توابع و با روشdynamic memory allocationاعمال زير را انجام دهد:
1.دو عدد صحيح حداكثر 50 رقمي را از ورودي بخواند.
2.توسط يك تابع اين دو عدد را با هم جمع نموده و توسط تابع ديگري اين دو عدد و حاصل جمع آنها را در خروجي بنويسد.
3.تابعي بنويسيد كه اين دو عدد رااز تابع main دريافت نموده و حاصل ضرب آنها را بدست آورده و در تابع main در خروجي بنويسد.
4.تابعي بنويسيد كه اين دو عدد را از تابع main دريافت نموده و عدد بزرگتر را بدست آورده و در تابع main در خروجي بنويسد.
5.تابعي بنويسيد كه اين دو عدد را از تابع main دريافت نموده و عدد كوچكتر را از عدد بزرگتر كم نموده و نتيجه را در تابع main در خروجي بنويسد.
(چون اعداد بزرگ هستند از آرايه ها بايد براي نگهداري اعداد استفاده كرد.)

اين برنامه به صورت زير نوشته شده ولي مورد شماره 4 رو اعمال نميكنه. ممنون ميشم اگه كسي بتونه اين مشكل برنامه رو حل كنه.

#include <stdio.h>
#include <string.h>
#include<stdlib.h>
#define MAX_DIGITS 50

int* read(void);
void write(int*);
int* add(int*, int*);
int* mult1dig(int, int*);
int* multiply(int*, int*);
void shiftLeft(int* a);
int* createZero();
int length(int*);
int cmp(int*, int*);
int* subtract(int*, int*);
int main(){
printf("\n\n");
int* a=read();
int* b=read();
int* c=add(a,b);
printf("\n\n");
write(a);
printf("+");
write(b);
printf("=");
write(c);
printf("\n");
c=multiply(a,b);
write(a);
printf("*");
write(b);
printf("=");
write(c);
c=subtract(a,b);
printf("\n");
write(a);
printf("-");
write(b);
printf("=");
write(c);
delete(a);
delete(b);
delete(c);
return (0);
}

int* read (void)
{
char* x=(char*)malloc(MAX_DIGITS*sizeof(char));
int* result=(int*)malloc(MAX_DIGITS*sizeof(int));
scanf("%s",x);
int i,k,j=0 ;
int end=MAX_DIGITS;
for(i=0 ; i < MAX_DIGITS ; i++)
if(x[i]=='\0'){
end=i;
break;}

for(i=end-1 ; i>=0 ; i--){
if(x[i]>='0' && x[i]<='9'){
result[j++]=(x[i]-48);}


for(k=j ; k<MAX_DIGITS ; k++)
result[k]=0; }
delete(x);
return result;
}


void write(int* number) {
int i,started=0;
for(i=MAX_DIGITS-1 ; i>=0 ; i--){
if(number[i]!=0)
started=1;
if(started==1)
printf("%d",number[i]);
}
if(started==0)
printf("0");
}

int* add(int* a, int* b){
int* result=(int*)malloc(MAX_DIGITS*sizeof(int));
int carry=0;
for(int i=0 ; i<MAX_DIGITS ; i++){
result[i]=a[i]+b[i]+carry;
carry=result[i]/10;
result[i]%=10;
}
return result;
}

int* mult1dig(int d, int* a){
int* x=(int*)malloc(MAX_DIGITS*sizeof(int));
int carry=0;
for(int i=0 ; i<MAX_DIGITS ; i++){
x[i]=d*a[i]+carry;
carry=x[i]/10;
x[i]%=10;
}
return x;
}

int* multiply(int* a, int* b){
int* result=createZero();
int* temp;
for(int i=0 ; i<MAX_DIGITS; i++){
temp=mult1dig(b[i],a);
for(int k=0 ; k<i ; k++)
shiftLeft(temp);
//int* x=result;
result=add(result,temp);
}
return result;
}

void shiftLeft(int* a){
for(int i=MAX_DIGITS-1 ; i>0 ; i--){
a[i]=a[i-1];
}
a[0]=0;
}

int* createZero(){
int* result=(int*)malloc(MAX_DIGITS*sizeof(int));
for(int i=0 ; i<MAX_DIGITS ; i++)
result[i]=0;
return result;
}

int length(int* number){
int i;
for(i=MAX_DIGITS-1 ; i>=0 ; i--){
if(number[i]!=0)
return i+1;
}
return 0;
}

int cmp(int* a, int* b){
int n=length(a),m=length(b);
if(n>m)
return 1;
if(n<m)
return -1;

for(int i=n-1 ; i>=0 ; i--){
if(a[i]>b[i])
return 1;
if(a[i]<b[i])
return -1;
}
return 0;
}

int* subtract(int* a, int* b){

int c=cmp(a,b);
int i;
if(c==0)
return createZero();
if(c<0){
int* t=a;
a=b;
b=t;
}

int* d=(int*)malloc(MAX_DIGITS*sizeof(int));
int* result=(int*)malloc(MAX_DIGITS*sizeof(int));
for(i=0 ; i<MAX_DIGITS ; i++)
d[i]=a[i];
a=d;
for(i=0 ; i<MAX_DIGITS ; i++){
if(a[i]>=b[i]){
result[i]=a[i]-b[i];
}else{
int j;
a[i]+=10;
j=i+1;
while(a[j]==0){
a[j]=9;
j++;
}
a[j]--;
result[i]=a[i]-b[i];
}
}
return result;
}

s_0o0
19-07-2008, 19:53
ببخشید شما تابع بزرگترین عدد را در برنامه اصلی فراخوانی کردید ؟

چون من هر چی برنامه اصلی را نگاه کردم ندیدم از چنین تابعی استفاده کرده باشید .