Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: Xung đột giữa các chương trình con trong bài tính tổng,hiệu, tích 2 số nguyên???

  1. #1
    Ngày gia nhập
    02 2011
    Nơi ở
    Kinh Thành Thăng Long
    Bài viết
    10

    Mặc định Xung đột giữa các chương trình con trong bài tính tổng,hiệu, tích 2 số nguyên???

    -Bài toán yêu cầu nhập 2 số nguyên dương <=20 chữ số, tính tổng hiệu tích của chúng.
    Mình nghĩ thuật toán rồi viết và chạy thử từng cái một thì không vấn đề gì nhưng khi ghép vào 1 chương trình thì chương trình con tính hiệu xung đột với chương trình con tính tích.
    -Nếu gọi chương trình tính tích trước rồi tính hiệu sau thì kết quả đúng.
    -Nếu gọi chương trình tính hiệu trước rồi tính tích sau thì kết quả của tích bị sai.
    Cụ thể: Mình chạy từng dòng lệnh để kiểm tra thì trong lúc tính tích sau một vài giá trị (chạy từ hàng đơn vị) đúng với kết quả cần tìm thì bắt đầu xảy ra hiện tượng lạ. Lỗi xảy ra ở dòng m=b[i]*a[j]+k; mà cụ thể là tích b[i]*a[i] kết quả nhân nhận được rất khó hiểu trong khi giá trị của b[i] và a[i] vẫn xác định được.

    VD: 2 số 54684 và 145798
    Tích đúng : 7972817832
    Tích sai: 2504417832
    (kq tích đúng 5 số cuối là 17832 còn sau nhảy giá trị lung tung)
    Mình tìm mãi mà không thể hiểu được, ai có thể giải thích giúp mình được không?

    -Khi nhập số để kết thúc nhập ấn dấu chấm hoặc nhập hết 20 số.
    Code:
    #include<stdio.h>
    #include<conio.h>
    #include<math.h>
    #include<stdlib.h>
    void nhap(int x[20])
    	{
    	int k[100],i=-1,j,t=0;
    	do {i++;k[i]=getche()-48;}while((i!=19) && (k[i]!=-2) );
    	if (i!=19) i--;
    	for (j=19-i;j<20;j++) {x[j]=k[t];t++;}
    	}
    void tong(int a[20],int b[20])
    	{
    	int k=0,i,c[21];
    	for (i=19;i>=0;i--)
    		{
    		c[i+1]=a[i]+b[i]+k;
    		if (c[i+1]>9) {c[i+1]-=10;k=1;} else k=0;
    		}
    	if (k==1) c[0]=1;
    	for (i=0;i<21;i++) printf("%d",c[i]);
    	}
    int sosanh(int a[20],int b[20])
    	{
    	int i=0;
    	while ((a[i]==0 && b[i]==0) || (a[i]==b[i])) {i++;}
    	if (a[i]>=b[i]) return 1; else return 0;
    	}
    void tich(int a[20],int b[20])
    	{
    	int x=0,k=0,i,j,t,m,c[40];
    	for (i=0;i<40;i++) c[i]=0;
    	for (i=19;i>0;i--)
    		{
    		t=i+20;
    		for (j=19;j>=0;j--)
    			{
    			m=b[i]*a[j]+k;
    			c[t]=c[t]+m%10+x;if (c[t]>=10) {c[t]-=10;x=1;} else x=0;
    			k=m/10;
    			t--;
    			}
    		}
    	for (i=0;i<40;i++) printf("%d",c[i]);
    	}
    void hieu(int a[20],int b[20])
    	{
    	if (sosanh(a,b)==0)
    		{
    		int k=0,i,c[20],j;
    		for (i=19;i>=0;i--)
    			{
    			b[i]-=k;
    			if (a[i]<=b[i]) {c[i]=b[i]-a[i];k=0;}
    			else {c[i]=10+b[i]-a[i];k=1;}
    			}
    		i=0;
    		while (c[i]==0) {i++;}c[i]*=-1;
    		for (i=0;i<20;i++) printf("%d",c[i]);
    		}
    		else
    		{
    		int k=0,i,c[20];
    		for (i=19;i>=0;i--)
    			{
    			a[i]-=k;
    			if (a[i]>=b[i]) {c[i]=a[i]-b[i];k=0;}
    			else {c[i]=10+a[i]-b[i];k=1;}
    			}
    		printf(" ");
    		for (i=0;i<20;i++) printf("%d",c[i]);
    		free(c);
    		}
    	}
    int main()
    {
    int a[20],b[20],i;
    for (i=0;i<20;i++) {a[i]=0;b[i]=0;}
    printf("nhap a:"); nhap(a);printf("\n");
    printf("nhap b:"); nhap(b);printf("\n");
    printf("tong =");tong(a,b);printf("\n");
    
    printf("hieu =");hieu(a,b);printf("\n");
    printf("tich =");tich(a,b);printf("\n");
    getch();
    }

  2. #2
    Ngày gia nhập
    10 2008
    Bài viết
    258

    Trích dẫn Nguyên bản được gửi bởi VitaminC Xem bài viết
    -Bài toán yêu cầu nhập 2 số nguyên dương <=20 chữ số, tính tổng hiệu tích của chúng.
    Mình nghĩ thuật toán rồi viết và chạy thử từng cái một thì không vấn đề gì nhưng khi ghép vào 1 chương trình thì chương trình con tính hiệu xung đột với chương trình con tính tích.
    -Nếu gọi chương trình tính tích trước rồi tính hiệu sau thì kết quả đúng.
    -Nếu gọi chương trình tính hiệu trước rồi tính tích sau thì kết quả của tích bị sai.
    Cụ thể: Mình chạy từng dòng lệnh để kiểm tra thì trong lúc tính tích sau một vài giá trị (chạy từ hàng đơn vị) đúng với kết quả cần tìm thì bắt đầu xảy ra hiện tượng lạ. Lỗi xảy ra ở dòng m=b[i]*a[j]+k; mà cụ thể là tích b[i]*a[i] kết quả nhân nhận được rất khó hiểu trong khi giá trị của b[i] và a[i] vẫn xác định được.

    VD: 2 số 54684 và 145798
    Tích đúng : 7972817832
    Tích sai: 2504417832
    (kq tích đúng 5 số cuối là 17832 còn sau nhảy giá trị lung tung)
    Mình tìm mãi mà không thể hiểu được, ai có thể giải thích giúp mình được không?

    -Khi nhập số để kết thúc nhập ấn dấu chấm hoặc nhập hết 20 số.
    Code:
    #include<stdio.h>
    #include<conio.h>
    #include<math.h>
    #include<stdlib.h>
    void nhap(int x[20])
    	{
    	int k[100],i=-1,j,t=0;
    	do {i++;k[i]=getche()-48;}while((i!=19) && (k[i]!=-2) );
    	if (i!=19) i--;
    	for (j=19-i;j<20;j++) {x[j]=k[t];t++;}
    	}
    void tong(int a[20],int b[20])
    	{
    	int k=0,i,c[21];
    	for (i=19;i>=0;i--)
    		{
    		c[i+1]=a[i]+b[i]+k;
    		if (c[i+1]>9) {c[i+1]-=10;k=1;} else k=0;
    		}
    	if (k==1) c[0]=1;
    	for (i=0;i<21;i++) printf("%d",c[i]);
    	}
    int sosanh(int a[20],int b[20])
    	{
    	int i=0;
    	while ((a[i]==0 && b[i]==0) || (a[i]==b[i])) {i++;}
    	if (a[i]>=b[i]) return 1; else return 0;
    	}
    void tich(int a[20],int b[20])
    	{
    	int x=0,k=0,i,j,t,m,c[40];
    	for (i=0;i<40;i++) c[i]=0;
    	for (i=19;i>0;i--)
    		{
    		t=i+20;
    		for (j=19;j>=0;j--)
    			{
    			m=b[i]*a[j]+k;
    			c[t]=c[t]+m%10+x;if (c[t]>=10) {c[t]-=10;x=1;} else x=0;
    			k=m/10;
    			t--;
    			}
    		}
    	for (i=0;i<40;i++) printf("%d",c[i]);
    	}
    void hieu(int a[20],int b[20])
    	{
    	if (sosanh(a,b)==0)
    		{
    		int k=0,i,c[20],j;
    		for (i=19;i>=0;i--)
    			{
    			b[i]-=k;
    			if (a[i]<=b[i]) {c[i]=b[i]-a[i];k=0;}
    			else {c[i]=10+b[i]-a[i];k=1;}
    			}
    		i=0;
    		while (c[i]==0) {i++;}c[i]*=-1;
    		for (i=0;i<20;i++) printf("%d",c[i]);
    		}
    		else
    		{
    		int k=0,i,c[20];
    		for (i=19;i>=0;i--)
    			{
    			a[i]-=k;
    			if (a[i]>=b[i]) {c[i]=a[i]-b[i];k=0;}
    			else {c[i]=10+a[i]-b[i];k=1;}
    			}
    		printf(" ");
    		for (i=0;i<20;i++) printf("%d",c[i]);
    		free(c);
    		}
    	}
    int main()
    {
    int a[20],b[20],i;
    for (i=0;i<20;i++) {a[i]=0;b[i]=0;}
    printf("nhap a:"); nhap(a);printf("\n");
    printf("nhap b:"); nhap(b);printf("\n");
    printf("tong =");tong(a,b);printf("\n");
    
    printf("hieu =");hieu(a,b);printf("\n");
    printf("tich =");tich(a,b);printf("\n");
    getch();
    }
    Mình không xem code nhưng xem ví dụ của bạn thì bạn nên lưu ý rằng kiểu int thì chỉ nhận giá trị từ -2^31 đến 2^32 thôi. vì số 7972817832 lớn hơn 2^32 nên kết quả bị sai. bạn thử khai báo kiểu float xem.
    Anh yêu em hí hí

  3. #3
    Ngày gia nhập
    02 2011
    Nơi ở
    Kinh Thành Thăng Long
    Bài viết
    10

    Không phải, vì số lớn nên mình lưu số bằng mảng cơ mà. Không thể hiểu tại sao việc xảy ra hay ko xảy ra 1 chương trình con này lại tác động được đến kết quả của chương trình con khác.

  4. #4
    Ngày gia nhập
    04 2008
    Nơi ở
    Bốn bề là nhà
    Bài viết
    703

    C++ Code:
    1. else
    2.         {
    3.         int k=0,i,c[20];
    4.         for (i=19;i>=0;i--)
    5.             {
    6.             a[i]-=k;
    7.             if (a[i]>=b[i]) {c[i]=a[i]-b[i];k=0;}
    8.             else {c[i]=10+a[i]-b[i];k=1;}
    9.             }
    10.         printf(" ");
    11.         for (i=0;i<20;i++) printf("%d",c[i]);
    12.         free(c);
    13.         }
    Lưu ý chỗ này trong hàm tính "Hiệu" nhé.
    Vì bạn đã thay đổi giá trị của mảng a[] nên sau này gọi hàm tính "Tích" mảng a[] sẽ không còn như trước nữa => Kết quả sai.
    Đó là lí do vì sao nếu bạn gọi hàm "Tích" trước rồi mới đến hàm "Hiệu" thì kết quả vẫn đúng.

  5. #5
    Ngày gia nhập
    02 2011
    Nơi ở
    Kinh Thành Thăng Long
    Bài viết
    10

    Trích dẫn Nguyên bản được gửi bởi G.Perelman Xem bài viết
    Lưu ý chỗ này trong hàm tính "Hiệu" nhé.
    Vì bạn đã thay đổi giá trị của mảng a[] nên sau này gọi hàm tính "Tích" mảng a[] sẽ không còn như trước nữa => Kết quả sai.
    Đó là lí do vì sao nếu bạn gọi hàm "Tích" trước rồi mới đến hàm "Hiệu" thì kết quả vẫn đúng.
    Đúng sai chỗ này rồi, rất cám ơn bạn.

Các đề tài tương tự

  1. xử lý xung tín hiệu trong vẽ phổ phóng xạ, moi xung chua 256 gia tri
    Gửi bởi dangbui88 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 0
    Bài viết cuối: 08-04-2013, 10:35 AM
  2. Database Bị xung đột khóa ngoài khi xóa một bản ghi trong Quan hệ 1-1
    Gửi bởi nobita2009hp trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 29-04-2012, 01:03 PM
  3. Trả lời: 0
    Bài viết cuối: 18-06-2011, 09:26 AM
  4. Algorithm Dùng Toolbox nào để hiển thị các xung như trong hình?
    Gửi bởi diepa9k39 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 31-03-2011, 12:22 AM
  5. Chống xung đột Multi - Thread Trong VC++ API
    Gửi bởi thansautk trong diễn đàn Windows API, Hooking, xử lý Windows Message
    Trả lời: 12
    Bài viết cuối: 23-08-2010, 01:37 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn