读书人

测试版2 c语言创建三角形,该怎么解决

发布时间: 2012-03-21 13:33:15 作者: rapoo

测试版2 c语言创建三角形
/*
名称: 创建三角形

需求: 任意输入三条线段的长度,判断它们可以组成一个
什么形状的三角形(锐角三角形 钝角三角形 等腰三角形 等边三角形 直角三角形 等腰直角三角形)

实现: 首先判断输入的数据是否满足构建一个三角形,IsOk()实现此功能
如果不满足则要求重新输入一组数据,直到满足要求。

通过调用Form ()函数我们可以知道这是个什么形状的三角形

主函数规定了输入结束的条件

编译环境: VC6.0

版本号: beta 2
*/

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>

/* 对被调函数进行申明 */
int IsOk (double x, double y, double z);/* 判断是否可以组建一个三角形 */
void Form (double x, double y, double z);/* 判断三角形的形状 */

int main (void)
{
double x, y, z;/* 三角形的三条边 */
int check = 0;/* 程序结束的判断条件 */

/* 格式控制,使光标处于屏幕中央 */
for (int i=0; i <10; i++)
{
printf ( "\n ");
}
for (int j=0; j <26; j++)
{
printf ( " ");
}
puts ( "> > > > > 欢迎使用本软件 < < < < < ");
printf ( "\n\t\t\t\t ");
system ( "pause ");/* 等待键盘输入 */
system ( "cls ");/* 清屏 */
puts ( "\n任意输入三条边长 ");

/* 程序结束的条件 */
while (!check)
{
printf ( "\n提示: 请在你输完一个数字后按回车以便输入下一个数\n\n输入第一条边长: ");
while (scanf ( "%lf ", &x) != 1 || x <= 0)
{
while (getchar () != '\n ') /* 将堵在输入流中的后半行字符读入并抛弃(这个地方写得好) */
;
system ( "cls ");
printf ( "\n边长只能为大于0的数字!\n\n重新输入第一条边长: ");
}

printf ( "\n输入第二条边长: ");
while (scanf ( "%lf ", &y) != 1 || y <= 0)
{
while (getchar() != '\n ')
;
system ( "cls ");
printf( "\n边长只能为大于0的数字!\n\n重新输入第二条边长: ");
}

printf ( "\n输入第三条边长: ");
while (scanf ( "%lf ", &z) != 1 || z <= 0)
{
while (getchar() != '\n ')
;
system ( "cls ");
printf( "\n边长只能为大于0的数字!\n\n重新输入第三条边长: ");
}

/* 当输入的数字无法满足构建一个三角形 */
while (!IsOk (x, y, z))
{
system ( "cls ");
puts ( "\n抱歉!!不满足构建一个三角形,请重输! ");
printf ( "\n提示: 请在你输完一个数字后按回车以便输入下一个数\n\n输入第一条边长: ");
while (scanf ( "%lf ", &x) != 1 || x <= 0)
{
while (getchar () != '\n ') /* 将堵在输入流中的后半行字符读入并抛弃(这个地方写得好) */
;
system ( "cls ");
puts( "\n边长只能为大于0的数字!\n\n重新输入第一条边长: ");
}



printf ( "\n输入第二条边长: ");
while (scanf ( "%lf ", &y) != 1 || y <= 0)
{
while (getchar() != '\n ')
;
system ( "cls ");
printf( "\n边长只能为大于0的数字!\n\n重新输入第二条边长: ");
}

printf ( "\n输入第三条边长: ");
while (scanf ( "%lf ", &z) != 1 || z <= 0)
{
while (getchar() != '\n ')
;
system ( "cls ");
printf( "\n边长只能为大于0的数字!\n\n重新输入第三条边长: ");
}
}

system ( "cls ");
printf ( "\n你输入的数据(精确到小数点后7位)是: %.7lf %.7lf %.7lf\n ", x, y, z);
printf ( "\n这是一个: ");

/* 判断三角形的形状 */
Form (x, y, z);

/* 是否继续程序 */
printf ( "\n继续-> 按数字0 | 退出-> 按任意键(除0) \n\n-> ");

/* 只有输入0时才继续程序 */
if (scanf ( "%d ", &check) ==1 && check == 0)
{
system ( "cls ");
puts ( "\n请任意输入三条边的长度 ");
}
else break;

}

system ( "cls ");
for (int k=0; k <10; k++)
{
printf ( "\n ");
}
for (int l=0; l <30; l++)
{
printf ( " ");
}
puts ( "谢谢您的使用! ");
for (int m=0; m <10; m++)
{
printf ( "\n ");
}

return 0;
}

/* 判断这三条线段是否可以组成一个三角形 */
int IsOk (double x, double y, double z)
{
if ((x + y > z) && (fabs(x - y) < z))
{/* the same: if ((x + y > z) && ((x - y > 0) ? (x - y < z):(y - x < z))) */
return 1;/* 满足条件 */
}
return 0;
}

/* 判断三角形的形状 */
void Form (double x, double y, double z)
{

double temp;
int flag = 0;
/* const double delta = 1e-5; */
const double delta = (x + y + z) * 1e-8;/* 浮点数总有一些舍入误差, 这样写是为了进行更准确的判断 */

if (x == y && x == z)
{
puts ( "等边三角形\n ");
}

else
{
if (x > y)/* 以下三个if语句是对x, y, z 进行从小到大的排序 */
{
temp = x;
x = y;
y = temp;
}
if (x > z)
{
temp = x;
x = z;
z = temp;
}
if (y > z)
{
temp = y;


y = z;
z = temp;
}/* 至此 x <= y <= z */

if (x == y || x == z || y == z)/* 判断等腰 */
{
flag = 1;
}

if (flag)/* 当前是等腰三角形 */
{
if (x * x + y * y > z * z)/* 两小边的平方和大于第三边的平方 */
{
puts ( "等腰锐角三角形\n ");
}
else if (fabs(x * x + y * y - z * z) < delta)
{
puts ( "等腰直角三角形\n ");
}
else
{
puts ( "等腰钝角三角形\n ");
}
}

else/* 当前不是等腰三角形 */
{
if (x * x + y * y > z * z)
{
puts ( "锐角三角形\n ");
}

else if (fabs(x * x + y * y - z * z) < delta)
{
puts ( "直角三角形\n ");
}
else
{
puts ( "钝角三角形\n ");
}
}
}
}




[解决办法]
while (getchar () != '\n ') /* 将堵在输入流中的后半行字符读入并抛弃(这个地方写得好) */
;

- -b
[解决办法]
好象还是有问题
最后敲 回车还是退不出来 
不知道楼主要做什么?
[解决办法]
等着看看测试版3

读书人网 >C语言

热点推荐