【问题标题】:Finding if two triangle are congruent判断两个三角形是否全等
【发布时间】:2014-08-01 01:15:14
【问题描述】:

问题是这样的:

编写一个程序,读取两个三角形的三个角和三个边,并打印它们是否全等。我们不知道用户想要执行多少次。

#include <stdio.h>
#include <conio.h>
int main()
{
    float l1,l2,l3,l4,l5,l6;
    float a1,a2,a3,a4,a5,a6;
    char ans;
    int d=1;

    while(d<=2)
    {            
        printf("\nIntroduce the sides of triangle %d:",d);
        scanf("%f %f %f",&l1,&l2,&l3);
        printf("Introduce the angles of triangle %d:",d);
        scanf("%f %f %f",&a1,&a2,&a3);
        {
        if(l1==l4 &&l2==l5 && l3==l6 && a1==a4 && a2==a5 && a3==a6)
             printf("\n\tCongruent");
        else
             printf("\n\tNot congruent");
        }
    }
    getch();
    return 0;
}

那是我的代码,但开始时有问题,因为我一旦结束角度提示,程序就完成并说它们不全等,没有要求三角形编号 2,因此我没有完成“问的是用户想要做其他三角形的事情”。我知道我的代码有些错误,但我不知道在哪里。

感谢所有帮助!

【问题讨论】:

  • 在浮点数中比较相等性不会很好!
  • 调试器将帮助您逐步完成代码。一个程序是否有效并不是什么神奇的事情。 Visual Studio 有一个很棒的调试器。只需一次按 F10 即可。
  • @bathsheba 通常是正确的,不建议使用== 比较浮点数,因为会出现截断和舍入错误。不过,只要您不对浮点数进行任何算术运算,大多数合理的输入都可以在这种情况下使用。
  • 没有l4、l5和l6的赋值。也不需要检查所有边和三角形,只需 3 个相等的边或相等的边角边或角边角就足够了
  • 如果您认为下面给出的任何答案都解决了您的问题,请考虑接受它,以便它可以浮在上面,让其他读者受益。

标签: c loops if-statement while-loop


【解决方案1】:

我去更改并添加了一些东西,现在看起来像这样:

#include <stdio.h>
#include <conio.h>
int main()
{
float l1,l2,l3,l4,l5,l6;
float a1,a2,a3,a4,a5,a6;
char resp;
printf("\n\t Triangles");
printf("\nBegin?");
 while(resp=getchar()=='y')
    {
      fflush(stdin);
      printf("\nIntroduce the sides of the first triangle:");
      scanf("%f %f %f",&l1,&l2,&l3);
      printf("Introduce the angles of first triangle:");
      scanf("%f %f %f",&a1,&a2,&a3);
      printf("\nIntroduce the sides of the second triangle:");
      scanf("%f %f %f",&l4,&l5,&l6);
      printf("Introduce the angles of the second triangle:");
      scanf("%f %f %f",&a4,&a5,&a6);
      fflush(stdin);
            if((l1==l4|| l1==l5 ||l1==l6) && (l2==l4 ||l2==l5 || l2==l6) && (l3==l4 || l3==l5 || l3==l6))
                 printf("\n\tCongruent");
            else
              printf("\n\tNot congruent");

             printf("\nMore triangles?:");
    }
     getch();
     return 0;
 }

它运行得很好,一切都很好,但我想知道有没有什么方法可以在不要求 printf("\nBegin?"); 的情况下解决问题,或者要求它是唯一的方法?

如果有其他方法,是否意味着我必须更改 mywhile(resp=getchar()=='y')

【讨论】:

  • fflush(stdin) 导致未定义的行为,不要这样做
  • 也不确定resp 的用途;并且您的测试条件在逻辑上不正确(例如,它将报告 (3,3,4)(3,4,5) 一致),如果 scanf 未成功完成,您应该采取一些措施。
  • resp 就像说答案一样,只是我换了另一种语言。所以我也应该同时消除fflush(stdin)?另外,我应该如何解决这个问题?
  • 我不知道你想对 resp 说什么。 resp 的值从未使用过,为什么它在程序中?是的,不要这样做fflush(stdin);
  • 我的老师告诉我们,当我们想要得到提示的答案时,使用resp
【解决方案2】:
  • 在读取两个三角形的数据之前,您正在比较边。比较必须在 while 之外。

  • 您需要在循环内的某处(任何地方)增加 d。

  • 你不需要那些 { } 关闭 if-else。

  • 你没有检查这些值是否可以接受,所以我们假设使用这个程序的人只会提供正确的值,所以......

  • 检查一致性的最简单方法是检查第一个三角形的所有边是否在第二个三角形上都有对应边。

    进行比较的方法我将留给您作为挑战...您可以开始:

    if(l1 == l4 && l2 == l5 && l3 == l6) ...
    

    想想你将如何在纸上或其他东西中解决这个问题,一旦你知道如何解决,尝试并实施它。 =)

【讨论】:

    【解决方案3】:

    这是因为您的循环不完整。我推荐for (int d = 1; d &lt;= 2; ++d),而不是while(d&lt;=2)

    是否要求用户以相同的顺序输入两个三角形的顶点?如果不是,那么您需要检查哪些角度匹配,然后检查相应的边。此外,是否有必要验证给定的角度和边形成有效的三角形?这可能会成为一个非常复杂的问题。

    【讨论】:

    • 对于 SSS、SAS、ASA、RHS 或 AAS 的一致性 1 就足够了。现在因为 OP 读取所有 3 个边,所以可以使用 SSS 公理仅比较边并完全忽略角度。这不能归类为复杂问题,而是测试您有效编写循环和条件块的技能的好方法。
    • 所以我最好只用一个?为了安全起见,我正在考虑同时使用 SSS 和 SAS 。
    猜你喜欢
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多