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

Đề tài: Bài toán Vua Arthur và các hiệp sĩ bàn tròn, code chạy không ra kết quả?

  1. #1
    Ngày gia nhập
    12 2011
    Bài viết
    4

    Exclamation Bài toán Vua Arthur và các hiệp sĩ bàn tròn, code chạy không ra kết quả?

    Đề bài
    VUA ARTHUR VÀ CÁC HIỆP SĨ BÀN TRÒN
    1. Giới thiệu

    Vua Arthur là một vị vua huyền thoại trong lịch sử nước Anh, là người dẫn dắt các hiệp sĩ Bàn Tròn (Knights of the Round Table) chuyên chiến đấu để giữ gìn và bảo vệ công lý. Gần như bất khả chiến bại trên chiến trường, vua Arthur và các hiệp sĩ Bàn Tròn chỉ gặp các đối thủ xứng tầm khi đương đầu cùng các chiến binh Saxon, được dẫn dắt bởi vua Cerdic, trong cuộc chiến quyết định ngai vàng của nước Anh. Theo tinh thần thượng võ, họ quyết định sẽ tổ chức các cuộc đấu tay đôi giữa các đại diện của hai bên để giải quyết mọi vấn đề tranh chấp.

    Các hiệp sĩ Bàn Tròn và các chiến binh Saxon đều là các dũng sĩ thiện chiến, mỗi trận đánh tay đôi giữa họ luôn là một cuộc chiến khốc liệt mà sự thắng bại đôi khi không chỉ quyết định bởi tài nghệ của các đấu sĩ mà còn bởi các yếu tố khác như vũ khí, áo giáp, địa hình, v.v… Thông thường, một trận chiến như vậy chỉ kết thúc khi một trong hai đấu sĩ tử thương.

    Do vậy, trước mỗi trận chiến tay đôi, vua Arthur luôn lo lắng cho số phận của hiệp sĩ Bàn Tròn anh em của mình. Vua Arthur không biết rằng vào khoảng 1500 năm sau, máy tính có thể giúp ông ước lượng được khả năng thắng bại của mỗi hiệp sĩ trước mỗi cuộc chiến.

    2. Yêu cầu
    Trong bài tập lớn này, sinh viên sẽ được cung cấp chứa dữ liệu nhập, bao gồm các thông số cho một trận chiến tay đôi giữa một hiệp sĩ Bàn Tròn và một chiến binh Saxon. Chương trình sẽ tính toán và in ra màn hình xác suất chiến thắng của hiệp sĩ Bàn Tròn.
    3. Dữ liệu nhập
    Thông tin về hiệp sĩ Bàn Tròn và chiến binh Saxon tham gia vào trận chiến tay đôi. Cấu trúc như sau:

    429
    1
    325
    1
    1

    Giải thích:
    • baseHP1: Chỉ số sức mạnh cơ bản của hiệp sĩ Bàn Tròn, là một số nguyên từ 99 đến 999
    • wp1: Thông tin về vũ khí của hiệp sĩ Bàn Tròn, nhận một trong các giá trị 0,1,2,3
    • baseHP2: Chỉ số sức mạnh cơ bản của chiến binh Saxon, là một số nguyên từ 1 đến 888
    • wp2: Thông tin về vũ khí của chiến binh Saxon, nhận một trong các giá trị 0,1,2,3
    • ground: Thông tin về địa hình nơi diễn ra cuộc chiến tay đôi, là một số nguyên từ 1 đến 999

    4. Dữ liệu xuất

    Chương trình sẽ xuất trực tiếp ra màn hình giá trị xác suất p(R) dự đoán về khả năng chiến thắng của hiệp sĩ Bàn Tròn trong trận chiến tay đôi. Giá trị p(R) sẽ được tính bằng công thức sau:

    Trong đó realHP1 và realHP2 là chỉ số sức mạnh thật của hiệp sĩ Bàn Tròn và chiến binh Saxon khi chiến đấu. Chỉ số sức mạnh thật này sẽ được tính dựa trên chỉ số sức mạnh cơ bản và vũ khí được sử dụng, được mô tả như sau:

    i) wpi = 1: vũ khí bình thường được sử dụng. Khi đó realHPi = baseHPi
    ii) wpi = 0: đấu sĩ bỏ quên vũ khí và phải chiến đấu bằng tay không. Khi đó realHPi = baseHPi /10 (chỉ tính phần nguyên).

    Ngoài ra đấu sĩ sẽ có thêm lợi thế nếu được chiến đấu trên địa hình quen thuộc, được mô tả như sau:

    iii) Nếu ground = baseHPi, thì realHPi sẽ được tăng thêm 10% sau khi đã tính điểm vũ khí như đã mô tả ở mục i và ii. Tuy nhiên nếu realHPi vượt quá 999 thì sẽ được tự động giảm xuống giá trị 999

    Giá trị in ra màn hình sẽ có dạng 0.XX (tức là phần thập phân có đúng hai chữ số). KHÔNG IN THÊM BẤT KỲ THÔNG TIN NÀO KHÁC RA MÀN HÌNH (kể cả dấu xuống hàng).

    Ví dụ 1: Nếu baseHP1 = 450, wp1= 1, baseHP2 = 150, wp2= 1, ground = 302, giá trị in ra màn hình sẽ là (450-150+999)/2000 = 0.65.

    Ví dụ 2: Nếu baseHP1 = 807, wp1= 0, baseHP2 = 750, wp2= 1, ground = 156, giá trị in ra màn hình sẽ là (80-750+999)/2000 = 0.16.

    Ví dụ 3: Nếu baseHP1 = 417, wp1= 1, baseHP2 = 416, wp2= 0, ground = 417, giá trị in ra màn hình sẽ là (417*1.1-41+999)/2000 = 0.71.

    Ví dụ 4: Nếu baseHP1 = 235, wp1= 1, baseHP2 = 624, wp2= 0, ground = 624, giá trị in ra màn hình sẽ là (235-62*1.1+999)/2000 = 0.58.

    Ví dụ 5: Nếu baseHP1 = 998, wp1= 1, baseHP2 = 517, wp2= 1, ground = 998, giá trị in ra màn hình sẽ là (999-517+999)/2000 = 0.74.

    Ngoài ra chương trình còn chấp nhận một số trường hợp dữ liệu đặc biệt như sau:

    iv) Nếu wpi = 2, vũ khí được sử dụng bao gồm một áo giáp đặc biệt được làm từ mithril. Không vũ khí nào có thể xuyên thủng được áo giáp này, vì vậy đấu sĩ mặc áo giáp này sẽ không bao giờ thua trận. Trong trường hợp này realHPi của đấu sĩ vẫn được tính qua các mô tả ở mục i và mục iii và kết quả in ra màn hình vẫn được tính như cũ; tuy nhiên nếu realHPi thấp hơn chỉ số tương ứng của đối thủ, giá trị in ra màn hình sẽ là 0.50 (trận đấu hoà).

    Ví dụ 6: Nếu baseHP1 = 238, wp1= 2, baseHP2 = 113, wp2= 1, ground = 145, giá trị in ra màn hình sẽ là (238-113+999)/2000 = 0.56.

    Ví dụ 7: Nếu baseHP1 = 738, wp1= 1, baseHP2 = 45, wp2= 2, ground = 26, giá trị in ra màn hình sẽ là 0.50.

    v) Nếu wpi = 3, vũ khí sử dụng là gươm Excalibur. Đối với một chiến binh Saxon, thanh gươm này cũng chỉ là một vũ khí bình thường, vì vậy chỉ số realHP2 vẫn được tính bình thường sử dụng mô tả ở mục i và iii. Nếu một hiệp sĩ Bàn Tròn sử dụng thanh gươm này, chỉ số realHP1 sẽ được nhân đôi sau khi đã tính như đã mô tả ở mục i và iii. Tuy nhiên nếu chỉ số realHP1 sau khi tính toán cao hơn 999, nó sẽ được tự động giảm xuống 999. Lưu ý là khi một hiệp sĩ Bàn Tròn sử dụng gươm Excalibur, nếu đối thủ có áo giáp mithril thì áo giáp này cũng mất tác dụng, trở thành vũ khí bình thường.

    Ví dụ 8: Nếu baseHP1 = 414, wp1= 1, baseHP2 = 415, wp2= 3, ground = 199, giá trị in ra màn hình sẽ là (414-415+999)/2000 = 0.50.

    Ví dụ 9: Nếu baseHP1 = 221, wp1= 3, baseHP2 = 600, wp2= 1, ground = 221, giá trị in ra màn hình sẽ là (221*1.1*2-600+999)/2000 = 0.44.

    Ví dụ 10: Nếu baseHP1 = 612, wp1= 3, baseHP2 = 800, wp2= 1, ground = 800, giá trị in ra màn hình sẽ là (999-800*1.1+999)/2000 = 0.56.

    Ví dụ 11: Nếu baseHP1 = 189, wp1= 3, baseHP2 = 517, wp2= 2, ground = 444, giá trị in ra màn hình sẽ là (189*2 – 517 + 999 )/2000 = 0.43.

    vi) Nếu baseHP1 = 999, đích thân Vua Arthur ra trận. Kết quả là Arthur luôn luôn thắng bất chấp đối thủ là ai và sử dụng vũ khí gì. Kết quả in ra màn hình là 1. (Không phải ở dạng 0.XX như bình thường)

    vii) Nếu baseHP2 = 888, đích thân Cerdic ra trận. Không hiệp sĩ Bàn Tròn nào đủ sức chống lại Cerdic, dù sử dụng bất kỳ vũ khí gì. Trong trường hơp này kết quả in ra màn hình là 0.00. Tuy nhiên nếu đối thủ của Cerdic là Vua Arthur, kết quả sẽ được xử lý như mô tả ở mục vi.

    viii) Nếu baseHPi là một số nguyên tố, đấu sĩ tương ứng thực chất là một Paladin cải trang. Vì Paladin có khả năng dùng phép thuật khi giao tranh, nên chắc chắn sẽ luôn chiến thắng bất chấp đối phương dùng vũ khí gì. Paladin chỉ thua khi gặp Arthur, Cerdic hoặc một Paladin có chỉ số baseHP cao hơn. Nếu Paladin chiến thắng là một hiệp sĩ Bàn Tròn, màn hình sẽ in ra giá trị 0.99; nếu Paladin chiến thắng là một chiến binh Saxon, màn hình sẽ in ra giá trị 0.01. Trường hợp hai Paladin có chỉ số baseHP bằng nhau, màn hình sẽ in ra giá trị 0.50. Trường hợp Paladin gặp Arthur hoặc Cerdic, kết quả được in ra như mô tả ở mục vi và VII


    Đây là bài giải của mình nhưng không biết sai chỗ nào mà không ra kết quả??
    C Code:
    1. #include "stdafx.h"
    2. #include <stdio.h>
    3. #include <conio.h>
    4. #include <math.h>
    5. void main()
    6. {
    7.     int BaseHP1, BaseHP2, wp1, wp2, ground, i, SNT1 = 1, SNT2 = 1;
    8.     float P,R1,R2;
    9.     printf ("Nhap ground:");
    10.     scanf ("%d",&ground);
    11.     for (;ground <1 || ground > 999;)
    12.     {
    13.         printf("\n nhap lai ground : ");
    14.         scanf("%d",&ground);
    15.     }
    16.     printf ("Nhap BaseHP1:");
    17.     scanf ("%d",&BaseHP1);
    18.     for (;BaseHP1 <99 || BaseHP1 > 999;)
    19.     {
    20.         printf("\n nhap lai BaseHP1 : ");
    21.         scanf("%d",&BaseHP1);
    22.     }
    23.     printf("Nhap BaseHP2: ");
    24.     scanf("%d",&BaseHP2);
    25.     for (;BaseHP2 < 1|| BaseHP2 > 888;)
    26.     {
    27.         printf("\nnhap lai BaseHP2 : ");
    28.         scanf("%d",&BaseHP2);  
    29.     }
    30.     printf("Nhap wp1 : ");
    31.     scanf("%d",&wp1);
    32.     for (;wp1 < 0  || wp1 > 3;)
    33.     {
    34.         printf("\nnhap lai wp1 : ");
    35.         scanf("%d",&wp1);
    36.     }
    37.     printf("Nhap wp2 : ");
    38.     scanf("%d",&wp2);
    39.     for (;wp2 < 0  || wp2 > 3;)
    40.     {
    41.         printf("\nnhap lai wp2 = ");
    42.         scanf("%d",&wp2);
    43.     }
    44.     //Kiem tra BaseHp co phai la SNT ko
    45.      for (i=2; BaseHP1/2 ; i++)
    46.       if (BaseHP1%i == 0)
    47.       {
    48.       SNT1 = 0;
    49.       break;
    50.     }
    51.        for (i=2; i<=BaseHP2/2; i++)
    52.       if (BaseHP2%i == 0)
    53.       {
    54.       SNT2 = 0;
    55.       break;
    56.     }
    57.       //Truong hop vua Arthur or Cerdic dich than chien dau
    58.     if (BaseHP1=999)
    59.         P=1;
    60.     else
    61.         if(BaseHP2=888)
    62.         P=0.00;
    63.     //Xet truong hop dau si la Paladin
    64.     if (SNT1==1 || SNT2==1)
    65.     {
    66.         if (SNT1==1 && SNT2==1)
    67.         {
    68.             if ( BaseHP1 < BaseHP2 )
    69.                 P=0.01;
    70.             else
    71.                 if ( BaseHP1 > BaseHP2 )
    72.                     P=0.99;
    73.                 else P=0.5;
    74.         }
    75.         else
    76.         {
    77.             if (SNT1=1)
    78.                 P=0.99;
    79.             else
    80.                 if(SNT2=1)
    81.                     P=0.01;
    82.         }
    83.     }
    84.     //Truong hop ve cac dia hinh chien dau
    85.     if (ground=BaseHP1)
    86.         R1=R1*1.10;//Dia hinh quen thuoc cua HSBT
    87.     if (ground=BaseHP2)
    88.         R2=R2*1.10;//Dia hinh quen thuoc cua Saxon
    89.    
    90. P= (R1-R2+999)/2000;
    91. //Truong hop dac biet ve vu khi chien dau
    92.     if (wp1=3)
    93.     {
    94.         R1=R1*2;
    95.         if (wp2=2)
    96.             wp2=1;//Ao giap cua Saxon mat tac dung
    97.     }
    98.     if (R1>999)
    99.         R1=999;
    100.     if (R2>999)
    101.         R2=999;
    102.     //Truong hop cac dau si bo quen vu khi
    103.     if (wp1=0)
    104.         R1=BaseHP1/10;
    105.     else R1=BaseHP1;
    106.     if (wp2=0)
    107.         R1=BaseHP2/10;
    108.     else R1=BaseHP2;   
    109. //Truong hop mac ao giap dac biet
    110. if ((P<0.5 && wp1==2) || (P>0.5 && wp2==2))
    111.     P=0.5;
    112. if (P=1) printf("P=1");
    113. else printf("P=%1.2f",P);
    114. getch();
    115. }

  2. #2
    Ngày gia nhập
    12 2011
    Bài viết
    4

    Mình đã sữa lại tất cả các trường hợp đều đúng hết chỉ trừ trường hợp thứ 8 là ko thực hiện mọi người tìm cách sữa lại dùm với.
    Code:
    #include "stdafx.h"
    #include <conio.h>
    #include <math.h>
    #include <stdio.h>
    void main() 
    {
    	int BaseHP1, BaseHP2, wp1, wp2, ground, SNT1=1, SNT2=1, i;
    	float P, realHP1, realHP2;
    	printf ("Nhap ground:");
    	scanf ("%d",&ground);
    	for (;ground <1 || ground > 999;)
    	{
    		printf("\n nhap lai ground : ");
    		scanf("%d",&ground);
    	}
    	printf ("Nhap BaseHP1:");
    	scanf ("%d",&BaseHP1);
    	for (;BaseHP1 <99 || BaseHP1 > 999;)
    	{
    		printf("\n nhap lai BaseHP1 : ");
    		scanf("%d",&BaseHP1);
    	}
    	printf("Nhap BaseHP2: ");
    	scanf("%d",&BaseHP2);
    	for (;BaseHP2 < 1|| BaseHP2 > 888;)
    	{
    		printf("\nnhap lai BaseHP2 : ");
    		scanf("%d",&BaseHP2);	
    	}
    	printf("Nhap wp1 : ");
    	scanf("%d",&wp1);
    	for (;wp1 < 0  || wp1 > 3;)
    	{
    		printf("\nnhap lai wp1 : ");
    		scanf("%d",&wp1);
    	}
    	printf("Nhap wp2 : ");
    	scanf("%d",&wp2);
    	for (;wp2 < 0  || wp2 > 3;)
    	{
    		printf("\nnhap lai wp2 = ");
    		scanf("%d",&wp2);
    	}
    
    	//Kiem tra BaseHp co phai la SNT ko
    	while (BaseHP1<=1)
    	for (i=2; i<=BaseHP1/2 ; i++)
    	  if (BaseHP1%i == 0)
    	  {
          SNT1 = 0;
          break;
    	  }
    	while (BaseHP2<=1)
    	  for (i=2; i<=BaseHP2/2; i++)
    	  if (BaseHP2%i == 0)
    	  {
          SNT2 = 0;
          break;
    	  }
    	//Truong hop dau si bo quen vu khi
    	if (wp1==0)
    		realHP1=BaseHP1/10;
    	else realHP1=BaseHP1;
    	if (wp2==0)
    		realHP2=BaseHP2/10;
    	else realHP2=BaseHP2;
    	//Truong hop dia hinh dac biet
    	if (ground==BaseHP1)
    		realHP1*=1.10;
    	if (ground==BaseHP2)
    		realHP2*=1.10;
    	//Truong hop su dung vu khi dac biet
    	if (wp1==3)
    	{
    		realHP1*=2;
    		if (wp2==2)
    			wp2=1;//Ao giap cua Saxon mat tac dung
    	}
    	if (realHP1>999)//Neu realHP vuot qua 999 thi lay bang 999
    		realHP1=999;
    	if (realHP2>999)
    		realHP2=999;
    P=(realHP1-realHP2+999)/2000;//Cho de ct tinh xa´c suat
    
    //Truong hop vua Arthur va Cerdic dich than chien dau
    	if (BaseHP1==999)
    		P=1;
    	else 
    		if (BaseHP2==888)
    			P=0;
    if ((P<0.5 && wp1==2) || (P>0.5 && wp2==2))
    	P=0.5;
    if (P==1) printf("P=1");
    else
    	printf("P=%1.2f",P);
    
    //2 dau si la paladin
    	if ((SNT1==1 || BaseHP1==2) || (SNT2==1 || BaseHP2==2))
    	{ 
    		if ((SNT1==1 ||BaseHP1==2) && (SNT1==2 ||BaseHP2==2))
    		{
    			if (BaseHP1<BaseHP2) P=0.01;
    			else 
    			{ 
    				if (BaseHP1>BaseHP2) P=0.99;
    				else P=0.5;
    			}
    		}
    		else 
    		{
    			if (SNT1==1 ||BaseHP1==2)
    			P=0.99;
    			else 
    				if (SNT2==1 ||BaseHP2==2)
    				P=0.01;
    		}
    	}
    
    
    getch();
    }

  3. #3
    Ngày gia nhập
    12 2009
    Bài viết
    69

    Mình đã xem qua nội dung bài của bạn. Không biết sai trường hợp với input là bao nhiêu (có phải trường hợp thứ 8?) và kết quả thế nào. Đoạn code nào của bạn đã chạy đúng. Đã chạy đúng hết các trường hợp khác rồi à. Và chỉ sửa trường hợp wp1 = 3 thối sao.

  4. #4
    Ngày gia nhập
    12 2011
    Bài viết
    4

    Trích dẫn Nguyên bản được gửi bởi Mr.Quit Xem bài viết
    Mình đã xem qua nội dung bài của bạn. Không biết sai trường hợp với input là bao nhiêu (có phải trường hợp thứ 8?) và kết quả thế nào. Đoạn code nào của bạn đã chạy đúng. Đã chạy đúng hết các trường hợp khác rồi à. Và chỉ sửa trường hợp wp1 = 3 thối sao.
    Trường hợp mình nói là trường hợp 2 đấu sĩ là paladin. Ví dụ như bạn nhập Ground= 500, BaseHP1= 101, BaseHP2 =500, wp1=1, wp2=2 thì kết quả của chương trình phải là P=0.99 nhưng đằng này nó lại ko ra như vậy mình ko bik tại sao lại như vậy nên nhờ mọi người tìm ra nguyên nhân giúp.tks

  5. #5
    Ngày gia nhập
    12 2009
    Bài viết
    69

    - Xem lại đoạn code lần 2 bạn gửi lên. (Check 1 số là nguyên tố)
    - Thử thay thế đoạn xét 2 Pladin như của mình xem sao



    #include <conio.h>
    #include <math.h>
    #include <stdio.h>
    #include <iostream>
    using namespace std;

    void main()
    {
    int BaseHP1, BaseHP2, wp1, wp2, ground, SNT1=1, SNT2=1, i;
    float P, realHP1, realHP2;
    printf ("Nhap ground:");
    scanf ("%d",&ground);
    for (;ground <1 || ground > 999
    {
    printf("\n nhap lai ground : ");
    scanf("%d",&ground);
    }
    printf ("Nhap BaseHP1:");
    scanf ("%d",&BaseHP1);
    for (;BaseHP1 <99 || BaseHP1 > 999
    {
    printf("\n nhap lai BaseHP1 : ");
    scanf("%d",&BaseHP1);
    }
    printf("Nhap BaseHP2: ");
    scanf("%d",&BaseHP2);
    for (;BaseHP2 < 1|| BaseHP2 > 888
    {
    printf("\nnhap lai BaseHP2 : ");
    scanf("%d",&BaseHP2);
    }
    printf("Nhap wp1 : ");
    scanf("%d",&wp1);
    for (;wp1 < 0 || wp1 > 3
    {
    printf("\nnhap lai wp1 : ");
    scanf("%d",&wp1);
    }
    printf("Nhap wp2 : ");
    scanf("%d",&wp2);
    for (;wp2 < 0 || wp2 > 3
    {
    printf("\nnhap lai wp2 = ");
    scanf("%d",&wp2);
    }

    //Kiem tra BaseHp co phai la SNT ko
    // Kiem tra so nguyen to sao lai co lenh while nay? -- comment by Mr.Quit
    // while (BaseHP1<=1)
    for (i=2; i<=BaseHP1/2 ; i++)
    if (BaseHP1%i == 0)
    {
    SNT1 = 0;
    break;
    }
    // Kiem tra so nguyen to sao lai co vong while nay -- comment by Mr.Quit
    //while (BaseHP2<=1)
    for (i=2; i<=BaseHP2/2; i++)
    if (BaseHP2%i == 0)
    {
    SNT2 = 0;
    break;
    }
    //Truong hop dau si bo quen vu khi
    if (wp1==0)
    realHP1=BaseHP1/10;
    else realHP1=BaseHP1;
    if (wp2==0)
    realHP2=BaseHP2/10;
    else realHP2=BaseHP2;
    //Truong hop dia hinh dac biet
    if (ground==BaseHP1)
    realHP1*=1.10;
    if (ground==BaseHP2)
    realHP2*=1.10;
    //Truong hop su dung vu khi dac biet
    if (wp1==3)
    {
    realHP1*=2;
    if (wp2==2)
    wp2=1;//Ao giap cua Saxon mat tac dung
    }
    if (realHP1>999)//Neu realHP vuot qua 999 thi lay bang 999
    realHP1=999;
    if (realHP2>999)
    realHP2=999;
    P=(realHP1-realHP2+999)/2000;//Cho de ct tinh xa´c suat

    //Truong hop vua Arthur va Cerdic dich than chien dau
    if (BaseHP1==999)
    P=1;
    else
    if (BaseHP2==888)
    P=0;
    if ((P<0.5 && wp1==2) || (P>0.5 && wp2==2))
    P=0.5;
    if (P==1) printf("P=1");
    else
    printf("P=%1.2f",P);

    // Comment by Mr.Quit
    // //2 dau si la paladin
    // if ((SNT1==1 || BaseHP1==2) || (SNT2==1 || BaseHP2==2))
    // {
    // if ((SNT1==1 ||BaseHP1==2) && (SNT1==2 ||BaseHP2==2))
    // {
    // if (BaseHP1<BaseHP2) P=0.01;
    // else
    // {
    // if (BaseHP1>BaseHP2) P=0.99;
    // else P=0.5;
    // }
    // }
    // else
    // {
    // if (SNT1==1 ||BaseHP1==2)
    // P=0.99;
    // else
    // if (SNT2==1 ||BaseHP2==2)
    // P=0.01;
    // }
    // }

    // Code by Mr.Quit
    // 2 dau si la paladin
    // Neu HSBT la paladin
    if (SNT1)
    {
    // Neu chien binh Saxon khong phai la paladin => P = 0.99
    // HSBT win
    if (!SNT2)
    P = 0.99;

    // Neu chien binh Saxon cung la paladin
    // Luc nay so sanh 2 baseHP cua ca 2 dau thu
    if (SNT2)
    {
    if (BaseHP1 < BaseHP2)
    P = 0.01; // HSBT lose
    if (BaseHP1 == BaseHP2)
    P = 0.5; // Hoa`
    if (BaseHP1 > BaseHP2)
    P = 0.99; // HSBT win
    }

    }
    system("pause");
    }

  6. #6
    Ngày gia nhập
    12 2009
    Bài viết
    69

    Mặc định Bài toán Vua Arthur và các hiệp sĩ bàn tròn, code chạy không ra kết quả?

    Mình đã sửa chỗ:
    + Check số nguyên tố
    + Tính P khi 2 Pladin gặp nhau. Bạn thử xem sao



    C++ Code:
    1. #include <conio.h>
    2. #include <math.h>
    3. #include <stdio.h>
    4. #include <iostream>
    5. using namespace std;
    6.  
    7. void main()
    8. {
    9.     int BaseHP1, BaseHP2, wp1, wp2, ground, SNT1=1, SNT2=1, i;
    10.     float P, realHP1, realHP2;
    11.     printf ("Nhap ground:");
    12.     scanf ("%d",&ground);
    13.     for (;ground <1 || ground > 999;)
    14.     {
    15.         printf("\n nhap lai ground : ");
    16.         scanf("%d",&ground);
    17.     }
    18.     printf ("Nhap BaseHP1:");
    19.     scanf ("%d",&BaseHP1);
    20.     for (;BaseHP1 <99 || BaseHP1 > 999;)
    21.     {
    22.         printf("\n nhap lai BaseHP1 : ");
    23.         scanf("%d",&BaseHP1);
    24.     }
    25.     printf("Nhap BaseHP2: ");
    26.     scanf("%d",&BaseHP2);
    27.     for (;BaseHP2 < 1|| BaseHP2 > 888;)
    28.     {
    29.         printf("\nnhap lai BaseHP2 : ");
    30.         scanf("%d",&BaseHP2);  
    31.     }
    32.     printf("Nhap wp1 : ");
    33.     scanf("%d",&wp1);
    34.     for (;wp1 < 0  || wp1 > 3;)
    35.     {
    36.         printf("\nnhap lai wp1 : ");
    37.         scanf("%d",&wp1);
    38.     }
    39.     printf("Nhap wp2 : ");
    40.     scanf("%d",&wp2);
    41.     for (;wp2 < 0  || wp2 > 3;)
    42.     {
    43.         printf("\nnhap lai wp2 = ");
    44.         scanf("%d",&wp2);
    45.     }
    46.  
    47.     //Kiem tra BaseHp co phai la SNT ko
    48.     // Kiem tra so nguyen to sao lai co lenh while nay? -- comment by Mr.Quit
    49.     //  while (BaseHP1<=1)
    50.     for (i=2; i<=BaseHP1/2 ; i++)
    51.         if (BaseHP1%i == 0)
    52.         {
    53.             SNT1 = 0;
    54.             break;
    55.         }
    56.         // Kiem tra so nguyen to sao lai co vong while nay -- comment by Mr.Quit
    57.         //while (BaseHP2<=1)
    58.         for (i=2; i<=BaseHP2/2; i++)
    59.             if (BaseHP2%i == 0)
    60.             {
    61.                 SNT2 = 0;
    62.                 break;
    63.             }
    64.             //Truong hop dau si bo quen vu khi
    65.             if (wp1==0)
    66.                 realHP1=BaseHP1/10;
    67.             else realHP1=BaseHP1;
    68.             if (wp2==0)
    69.                 realHP2=BaseHP2/10;
    70.             else realHP2=BaseHP2;
    71.             //Truong hop dia hinh dac biet
    72.             if (ground==BaseHP1)
    73.                 realHP1*=1.10;
    74.             if (ground==BaseHP2)
    75.                 realHP2*=1.10;
    76.             //Truong hop su dung vu khi dac biet
    77.             if (wp1==3)
    78.             {
    79.                 realHP1*=2;
    80.                 if (wp2==2)
    81.                     wp2=1;//Ao giap cua Saxon mat tac dung
    82.             }
    83.             if (realHP1>999)//Neu realHP vuot qua 999 thi lay bang 999
    84.                 realHP1=999;
    85.             if (realHP2>999)
    86.                 realHP2=999;
    87.             P=(realHP1-realHP2+999)/2000;//Cho de ct tinh xa´c suat
    88.  
    89.             //Truong hop vua Arthur va Cerdic dich than chien dau
    90.             if (BaseHP1==999)
    91.                 P=1;
    92.             else
    93.                 if (BaseHP2==888)
    94.                     P=0;
    95.             if ((P<0.5 && wp1==2) || (P>0.5 && wp2==2))
    96.                 P=0.5;
    97.  
    98.             // Comment by Mr.Quit
    99.             //2 dau si la paladin
    100.             //if ((snt1==1 || basehp1==2) || (snt2==1 || basehp2==2))
    101.             //{
    102.             //  if ((snt1==1 ||basehp1==2) && (snt1==2 ||basehp2==2))
    103.             //  {
    104.             //      if (basehp1<basehp2) p=0.01;
    105.             //      else
    106.             //      {
    107.             //          if (basehp1>basehp2) p=0.99;
    108.             //          else p=0.5;
    109.             //      }
    110.             //  }
    111.             //  else
    112.  
    113.             //      if (snt1==1 ||basehp1==2)
    114.             //          p=0.99;
    115.             //      else
    116.             //          if (snt2==1 ||basehp2==2)
    117.             //              p=0.01;
    118.             //  }
    119.             //}
    120.  
    121.             // Code by Mr.Quit
    122.             // 2 dau si la paladin
    123.             // Neu HSBT la paladin
    124.             if (SNT1)
    125.             {
    126.                 // Neu chien binh Saxon khong phai la paladin => P = 0.99
    127.                 // HSBT win
    128.                 if (!SNT2)
    129.                     P = 0.99;
    130.  
    131.                 // Neu chien binh Saxon cung la paladin
    132.                 // Luc nay so sanh 2 baseHP cua ca 2 dau thu
    133.                 if (SNT2)
    134.                 {
    135.                     if (BaseHP1 < BaseHP2)
    136.                         P = 0.01; // HSBT lose
    137.                     if (BaseHP1 == BaseHP2)
    138.                         P = 0.5; // Hoa`
    139.                     if (BaseHP1 > BaseHP2)
    140.                         P = 0.99; // HSBT win
    141.                 }
    142.  
    143.             }
    144.  
    145.             if (P==1) printf("P=1");
    146.             else
    147.                 printf("P=%1.2f",P);
    148.  
    149.             system("pause");
    150. }

  7. #7
    Ngày gia nhập
    12 2011
    Bài viết
    4

    Trích dẫn Nguyên bản được gửi bởi Mr.Quit Xem bài viết
    Mình đã sửa chỗ:
    + Check số nguyên tố
    + Tính P khi 2 Pladin gặp nhau. Bạn thử xem sao



    C++ Code:
    1. #include <conio.h>
    2. #include <math.h>
    3. #include <stdio.h>
    4. #include <iostream>
    5. using namespace std;
    6.  
    7. void main()
    8. {
    9.     int BaseHP1, BaseHP2, wp1, wp2, ground, SNT1=1, SNT2=1, i;
    10.     float P, realHP1, realHP2;
    11.     printf ("Nhap ground:");
    12.     scanf ("%d",&ground);
    13.     for (;ground <1 || ground > 999;)
    14.     {
    15.         printf("\n nhap lai ground : ");
    16.         scanf("%d",&ground);
    17.     }
    18.     printf ("Nhap BaseHP1:");
    19.     scanf ("%d",&BaseHP1);
    20.     for (;BaseHP1 <99 || BaseHP1 > 999;)
    21.     {
    22.         printf("\n nhap lai BaseHP1 : ");
    23.         scanf("%d",&BaseHP1);
    24.     }
    25.     printf("Nhap BaseHP2: ");
    26.     scanf("%d",&BaseHP2);
    27.     for (;BaseHP2 < 1|| BaseHP2 > 888;)
    28.     {
    29.         printf("\nnhap lai BaseHP2 : ");
    30.         scanf("%d",&BaseHP2);  
    31.     }
    32.     printf("Nhap wp1 : ");
    33.     scanf("%d",&wp1);
    34.     for (;wp1 < 0  || wp1 > 3;)
    35.     {
    36.         printf("\nnhap lai wp1 : ");
    37.         scanf("%d",&wp1);
    38.     }
    39.     printf("Nhap wp2 : ");
    40.     scanf("%d",&wp2);
    41.     for (;wp2 < 0  || wp2 > 3;)
    42.     {
    43.         printf("\nnhap lai wp2 = ");
    44.         scanf("%d",&wp2);
    45.     }
    46.  
    47.     //Kiem tra BaseHp co phai la SNT ko
    48.     // Kiem tra so nguyen to sao lai co lenh while nay? -- comment by Mr.Quit
    49.     //  while (BaseHP1<=1)
    50.     for (i=2; i<=BaseHP1/2 ; i++)
    51.         if (BaseHP1%i == 0)
    52.         {
    53.             SNT1 = 0;
    54.             break;
    55.         }
    56.         // Kiem tra so nguyen to sao lai co vong while nay -- comment by Mr.Quit
    57.         //while (BaseHP2<=1)
    58.         for (i=2; i<=BaseHP2/2; i++)
    59.             if (BaseHP2%i == 0)
    60.             {
    61.                 SNT2 = 0;
    62.                 break;
    63.             }
    64.             //Truong hop dau si bo quen vu khi
    65.             if (wp1==0)
    66.                 realHP1=BaseHP1/10;
    67.             else realHP1=BaseHP1;
    68.             if (wp2==0)
    69.                 realHP2=BaseHP2/10;
    70.             else realHP2=BaseHP2;
    71.             //Truong hop dia hinh dac biet
    72.             if (ground==BaseHP1)
    73.                 realHP1*=1.10;
    74.             if (ground==BaseHP2)
    75.                 realHP2*=1.10;
    76.             //Truong hop su dung vu khi dac biet
    77.             if (wp1==3)
    78.             {
    79.                 realHP1*=2;
    80.                 if (wp2==2)
    81.                     wp2=1;//Ao giap cua Saxon mat tac dung
    82.             }
    83.             if (realHP1>999)//Neu realHP vuot qua 999 thi lay bang 999
    84.                 realHP1=999;
    85.             if (realHP2>999)
    86.                 realHP2=999;
    87.             P=(realHP1-realHP2+999)/2000;//Cho de ct tinh xa´c suat
    88.  
    89.             //Truong hop vua Arthur va Cerdic dich than chien dau
    90.             if (BaseHP1==999)
    91.                 P=1;
    92.             else
    93.                 if (BaseHP2==888)
    94.                     P=0;
    95.             if ((P<0.5 && wp1==2) || (P>0.5 && wp2==2))
    96.                 P=0.5;
    97.  
    98.             // Comment by Mr.Quit
    99.             //2 dau si la paladin
    100.             //if ((snt1==1 || basehp1==2) || (snt2==1 || basehp2==2))
    101.             //{
    102.             //  if ((snt1==1 ||basehp1==2) && (snt1==2 ||basehp2==2))
    103.             //  {
    104.             //      if (basehp1<basehp2) p=0.01;
    105.             //      else
    106.             //      {
    107.             //          if (basehp1>basehp2) p=0.99;
    108.             //          else p=0.5;
    109.             //      }
    110.             //  }
    111.             //  else
    112.  
    113.             //      if (snt1==1 ||basehp1==2)
    114.             //          p=0.99;
    115.             //      else
    116.             //          if (snt2==1 ||basehp2==2)
    117.             //              p=0.01;
    118.             //  }
    119.             //}
    120.  
    121.             // Code by Mr.Quit
    122.             // 2 dau si la paladin
    123.             // Neu HSBT la paladin
    124.             if (SNT1)
    125.             {
    126.                 // Neu chien binh Saxon khong phai la paladin => P = 0.99
    127.                 // HSBT win
    128.                 if (!SNT2)
    129.                     P = 0.99;
    130.  
    131.                 // Neu chien binh Saxon cung la paladin
    132.                 // Luc nay so sanh 2 baseHP cua ca 2 dau thu
    133.                 if (SNT2)
    134.                 {
    135.                     if (BaseHP1 < BaseHP2)
    136.                         P = 0.01; // HSBT lose
    137.                     if (BaseHP1 == BaseHP2)
    138.                         P = 0.5; // Hoa`
    139.                     if (BaseHP1 > BaseHP2)
    140.                         P = 0.99; // HSBT win
    141.                 }
    142.  
    143.             }
    144.  
    145.             if (P==1) printf("P=1");
    146.             else
    147.                 printf("P=%1.2f",P);
    148.  
    149.             system("pause");
    150. }
    keke đc rồi tks bạn nhiều lắm. Mình còn nhiều bài như dzị lắm nữa lỡ có bị như dzị nữa có gì nhờ bạn giúp dùm.tks nhiều

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

  1. Mã nguồn C Lỗi Code thuật toán Minpoint vẽ đường tròn không biết lỗi ở đâu mà không chạy được mong mọi người chỉ giúp.
    Gửi bởi keodautaydang trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 0
    Bài viết cuối: 23-02-2013, 10:04 AM
  2. Di chuyển hình tròn chạy theo biên một hình tròn khác như thế nào?
    Gửi bởi ktxc15 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 17
    Bài viết cuối: 16-03-2012, 12:01 PM
  3. code tính diện tích và chu vi hình tròn...hiện số không cần thiết sau đáp án
    Gửi bởi dexter2011 trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 5
    Bài viết cuối: 16-09-2011, 11:13 PM
  4. Database Ý tưởng làm tròn tiền trong phần mềm quản lý(Làm tròn tiền thanh toán cho khách)
    Gửi bởi cchangkhongayngo trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 3
    Bài viết cuối: 12-06-2011, 08:09 AM
  5. Code chạy nhưng kết quả không chuẩn
    Gửi bởi ga_vit_c++ trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 6
    Bài viết cuối: 19-02-2010, 03:31 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