高分请教c的小问题!!高手一定要帮忙!!

xfr_1982 2003-05-16 08:22:04
#include <math.h>
#define s(a,b,c) (a+b+c)/2
#define Area(a,b,c) sqrt(s(a,b,c)*(s(a,b,c)-a)*(s(a,b,c)-b)*(s(a,b,c)-c))
main()
{
float a,b,c;
char m;
printf("shu ru san jiao xing de san bian chang :\n");
scanf("%f,%f,%f",&a,&b,&c);
if((a+b<c||a+c<b||b+c<a)||(a-b>c||a-c>b||b-c>a||b-a>c||c-a>b||c-b>a))

{
printf("\n shu ru de san jiao xing bu zheng que :");
printf("shi jin xing ji xu shu ru (y)hai shi ting zhi (n)!");
scanf("%c",&m);
if(m=='y')
{
printf("\n qing chong xin shu ru :");
scanf("%f,%f,%f",&a,&b,&c);
printf("san jiao xing de mian ji wei :%f", Area(a,b,c));
}
else if(m=='n') exit(0);
}
else
printf("san jiao xing de mian ji wei :%f", Area(a,b,c));
}
该程序为一个简单的程序!!但在c的环境下不能达到预期的想法!!怎么回事!!
请高手一定要帮忙!!!谢谢!!
...全文
10 点赞 收藏 19
写回复
19 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
cdxiaogan 2003-08-19
/*我为程序加了注释,希望你读了能解除疑惑*/

#include <stdio.h> /* 要用getchar() 这个函数*/
#include <math.h>
#define s(a,b,c) ((a+b+c)/2) /*虽然在本题中不会出错,但养成这样的习惯保险一点 */
#define Area(a,b,c) sqrt(s(a,b,c)*(s(a,b,c)-a)*(s(a,b,c)-b)*(s(a,b,c)-c))
main()
{
float a,b,c;
char m;
printf("shu ru san jiao xing de san bian chang :\n");
scanf("%f,%f,%f",&a,&b,&c);
getchar(); /* 尽管 按 照 格 式 严 格 输 入,但缓冲区中仍遗留一回车,用getchar()可以吃掉它 */
if(a+b<c||a+c<b||b+c<a)
/*||(a-b>c||a-c>b||b-c>a||b-a>c||c-a>b||c-b>a)) 何必写这许多等价的赘余代码,又不会执行 */

{
printf("\n shu ru de san jiao xing bu zheng que :");
printf("shi jin xing ji xu shu ru (y)hai shi ting zhi (n)!\n");
scanf("%c",&m); getchar(); /*养成吃掉回车的习惯比较好*/
if(m=='y') /* 输入 y 或 n 还要敲回车哦,要想一按y或n就响应,用getch() 上面几楼有提到*/
{
printf("\n qing chong xin shu ru :");
scanf("%f,%f,%f",&a,&b,&c); getchar(); /*养成吃掉回车的习惯比较好*/
printf("san jiao xing de mian ji wei :%f", Area(a,b,c));
}
else if(m=='n') exit(0);
}
else
printf("san jiao xing de mian ji wei :%f", Area(a,b,c));
}
/*
getchar() 在头文件 stdio.h 中包含; getch() 在头文件 conio.h 中包含
当然还有其他算法不完善的地方我没考虑修改,你自己改吧
这个程序在TC中没问题
*/
回复
xfr_1982 2003-08-18
大侠一定要看呢!
谢谢!!
回复
蝎子i软件 2003-07-11
#include <stdio.h>
#include <math.h>

#define s(a,b,c) (a+b+c)/2
#define Area(a,b,c) sqrt(s(a,b,c)*(s(a,b,c)-a)*(s(a,b,c)-b)*(s(a,b,c)-c))

float a,b,c;
char tc;

void getInput( void ) {
printf("shu ru san jiao xing de san bian chang :\n");
scanf("%f,%f,%f",&a,&b,&c);
scanf("%c", &tc);
}

void main( void )
{
int inputRight;
char m;

inputRight=0;
while( inputRight==0 ) {
getInput();
if((a+b<c||a+c<b||b+c<a)||(a-b>c||a-c>b||b-c>a||b-a>c||c-a>b||c-b>a))
{
printf("\nshu ru de san jiao xing bu zheng que :");
printf("\nshi jin xing ji xu shu ru (y)hai shi ting zhi (other keys)!");
scanf("%c", &m);
scanf("%c", &tc);
if( m!='y' && m!='Y' )
inputRight=-1;
}
else {
printf("san jiao xing de mian ji wei :%f", Area(a,b,c));
inputRight=1;
}
}
}
回复
bigtea 2003-07-11

楼主的程序是在输入的三角形三边长组不成三角形时,然后选择Y或N时出错,
这是因为缓冲区中有一个scanf("%f,%f,%f",&a,&b,&c);语句执行时遗留的回车符,
这个回车符是因为c的输入和输出是'字节流',输入和输出的数据流的开始和结束受程序控制而不受物理符号(如回车符换行符)的控制。
所以,在 scanf("%c",&m);前面加一个语句,把回车符‘吃掉'即可。
有多种方法,在这里用getchar();即可。(加上头文件#include <stdio.h>)
回复
liuhui2003 2003-07-11
改后的代码:
#include <math.h>
#include <iostream.h>
#define s(a,b,c) (a+b+c)/2
#define Area(a,b,c) sqrt(s(a,b,c)*(s(a,b,c)-a)*(s(a,b,c)-b)*(s(a,b,c)-c))
main()
{
float a,b,c;
char m;
cout<<"shu ru san jiao xing de san bian chang :\n";
cin>>a;
cin>>b;
cin>>c;
if((a+b<c||a+c<b||b+c<a)||(a-b>c||a-c>b||b-c>a||b-a>c||c-a>b||c-b>a))

{
cout<<"\n shu ru de san jiao xing bu zheng que :";
cout<<"\nshi jin xing ji xu shu ru (y)hai shi ting zhi (n)!";
cin>>m;
if(m=='y')
{
cout<<"\n qing chong xin shu ru :";
cin>>a>>b>>c;
cout<<"san jiao xing de mian ji wei :"<<Area(a,b,c);
}
else if(m=='n') return 0;
}
else
cout<<"san jiao xing de mian ji wei "<< Area(a,b,c);
return 1;
}
已编译过没问题
在最后的return 1;可以不要或加入代码使程序做你想要的事。
小子提一些难一点的问题
这种问题太简单了,少听那些说用 goto语句的人
我是人渣我怕谁,哈哈!!!!!!!!!!!!!!
回复
gwgwgwgwgwf 2003-07-10
我很菜,我觉得应该注意输入数据的时候以‘,’为分隔符,
在当第一次输入不正确后第二次输入的时候一个scanf只是把第一次输入的回车符读入了
应该写两个scanf("%c",m);
不改变程序结构的话我觉得只能用 goto 来实现了
下面是我改的程序:
#include <math.h>
#include <stdio.h>
#include <stdlib.h>

#define s(a,b,c) (a+b+c)/2
#define Area(a,b,c) sqrt(s(a,b,c)*(s(a,b,c)-a)*(s(a,b,c)-b)*(s(a,b,c)-c))

void main()
{
float a,b,c;
char m;

label1:
printf("shu ru san jiao xing de san bian chang :\n");
scanf("%f%f%f",&a,&b,&c);

if( (a+b<c||a+c<b||b+c<a)
||(a-b>c||a-c>b||b-c>a||b-a>c||c-a>b||c-b>a) )

{
printf("\n shu ru de san jiao xing bu zheng que :\n");
printf("shi jin xing ji xu shu ru (y)hai shi ting zhi (n)!\n");
scanf("%c",&m);
scanf("%c",&m);
if ( m=='y' )
{
goto label1;
}
else
if(m=='n') exit(0);
}
else
printf("san jiao xing de mian ji wei :%f\n", Area(a,b,c));
}
希望高手指教!!!!!!!!
回复
lanhai96 2003-07-10
菜!没见几个说对的
回复
hackingtruth 2003-07-10
#define s(a,b,c) (a+b+c)/2
改为:
#define s(a,b,c) ((a+b+c)/2)
试试
回复
greening 2003-05-17
你在第一次输入不合适之后,而且你又打算再次输入时(即m=='y')时,如果输入的依然是不合理的数据,你就没有判断过了。
回复
icansaymyabc 2003-05-17
真是小得不能再小的问题
#define s(a,b,c) (a+b+c)/2
改为
#define s(a,b,c) ((a+b+c)/2)
即可。

对于宏定义搞不明白就不要用宏定义。
本来写成函数多方便的事,瞧你把它搞成什么样子了。
回复
hongyanzaiyun 2003-05-17
scanf("%f,%f,%f",&a,&b,&c);
在这个语句后加上语句:getchar();
用于接收 enter
防错!
回复
huigll 2003-05-17

写错了:
呵呵
该是:
while((m=getchar())!='\n');

程序是对的。
回复
huigll 2003-05-17
scanf("%c",&m);改成m=getch();
并包含头文件conio.h
因为scanf("%c",&m);
取出了缓冲区里的回车字符

因为可以在次语句前加上while((m=gerchar())!='n');循环语句来清空输入缓冲区。
另外:程序的流程也不合理,当第二次输入的不正确时就计算错误了。

#include <stdio.h>
#include <conio.h>
#include <process.h>
#include <math.h>
#define s(a,b,c) (a+b+c)/2
#define Area(a,b,c) sqrt(s(a,b,c)*(s(a,b,c)-a)*(s(a,b,c)-b)*(s(a,b,c)-c))
main()
{
float a,b,c;
char m='y';
while(m=='y')
{
printf("shu ru san jiao xing de san bian chang :\n");
scanf("%f%f%f",&a,&b,&c);
if((a+b<c||a+c<b||b+c<a)||(a-b>c||a-c>b||b-c>a||b-a>c||c-a>b||c-b>a))
{
printf("\n shu ru de san jiao xing bu zheng que :");
printf("\nshi jin xing ji xu shu ru (y)hai shi ting zhi (n)!");
while((m=getchar())!='\n');
scanf("%c",&m);
continue;
}
else
{
printf("san jiao xing de mian ji wei :%f", Area(a,b,c));
break;
}
}

return 0;
}

//运行结果
shu ru san jiao xing de san bian chang :
1
2
4

shu ru de san jiao xing bu zheng que :
shi jin xing ji xu shu ru (y)hai shi ting zhi (n)!y
shu ru san jiao xing de san bian chang :
3
4
5
san jiao xing de mian ji wei :6.000000

回复
xfr_1982 2003-05-17
当问“printf("shi jin xing ji xu shu ru (y)hai shi ting zhi (n)!");
scanf("%c",&m);
并要求输入‘y'或者’n'时,屏幕就跳了!!!怎么制止啊???高手快献技吧!!!!
回复
fangrk 2003-05-16
#include <math.h>
#include <stdio.h>
#define s(a,b,c) (a+b+c)/2
#define Area(a,b,c) sqrt(s(a,b,c)*(s(a,b,c)-a)*(s(a,b,c)-b)*(s(a,b,c)-c))

main()
{
float a,b,c;
char m;
printf("shu ru san jiao xing de san bian chang :\n");
scanf("%f,%f,%f",&a,&b,&c);
if((a+b<c||a+c<b||b+c<a)||(a-b>c||a-c>b||b-c>a||b-a>c||c-a>b||c-b>a))

{
printf("\n shu ru de san jiao xing bu zheng que :");
printf("shi jin xing ji xu shu ru (y)hai shi ting zhi (n)!");
scanf("%c",&m);
if(m=='y')
{
printf("\n qing chong xin shu ru :");
scanf("%f,%f,%f",&a,&b,&c);
printf("san jiao xing de mian ji wei :%f", Area(a,b,c));
}
else if(m=='n') exit(0);
}
else
printf("san jiao xing de mian ji wei :%f", Area(a,b,c));
}

DEV-C++:
C:\>abc
shu ru san jiao xing de san bian chang :
3,4,5
san jiao xing de mian ji wei :6.000000
C:\>abc
shu ru san jiao xing de san bian chang :
6,8,9
san jiao xing de mian ji wei :23.525252

BCC32:
C:\>abc
shu ru san jiao xing de san bian chang :
3,4,5
san jiao xing de mian ji wei :6.000000
C:\>abc
shu ru san jiao xing de san bian chang :
5,7,9
san jiao xing de mian ji wei :17.412280

没问题的
回复
xfr_1982 2003-05-16
谁能看出来了?并调试一下吗?谢谢!!!!急急急急急急急急!!!!
回复
xfr_1982 2003-05-16
不是那的问题??/
回复
zhoory 2003-05-16
解决了吗
回复
huigll 2003-05-16
scanf("%f,%f,%f",&a,&b,&c); 输入的格式为3,4,5 ENTER
~ ~
有两个逗号

或者该成scanf("%f%f%f",&a,&b,&c); 则输入3 4 5 ENTER
回复
相关推荐
发帖
工具平台和程序库
创建于2007-09-28

2.4w+

社区成员

C/C++ 工具平台和程序库
申请成为版主
帖子事件
创建了帖子
2003-05-16 08:22
社区公告
暂无公告