| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3015 人关注过本帖
标题:求三角形面积的问题
只看楼主 加入收藏
s36519882009
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2009-3-2
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:5 
求三角形面积的问题
题目是这样的。
写程序由标准输入得到一系列三个一组的数,把每组数作为三角形的三条边,计算三角形的面积。注意
在程序里检查输入数据,对不能构成三角形的情况给出错误信息。(问题来自《从问题到程序》第四章
练习18题)
这是我编写的程序,但是不输出结果,语法没问题,应该是算法的问题。
#include<stdio.h>
#include<math.h>
  int mianji(double x,double y,double z){
      double a=(x+y+z)/2.0,sum;
      sum=sqrt(a*(a-x)*(a-y)*(a-z));
      return sum;
 }/*求三角形面积的函数*/
  void main(){
     double d=0,sum=0,x,a,b,c;
     int count;
     while(d!=EOF)
       {
       while((d=getchar())!=EOF&&(d==' '));/*如果输入的是空格的话,直接用掉。然后读后面的字符*/
       if(d==EOF) break;
     scanf("%lf",&x);/*没空格了,开始读数字了,我假设除了空格就是数字。*/
     a=x;count++; /*第一个数字赋值给a*/
       while((d=getchar())!=EOF&&(d==' '));
       if(c==EOF) break;
     scanf("%lf",&x);
     b=x;count++;/*第二个数字赋给b*/
       while((d=getchar())!=EOF&&(d==' '));
       if(c==EOF) break;
     scanf("%lf",&x);
     c=x;count++;/*第三个数字赋给c*/
     printf("%f",mianji(a,b,c));
     while((d=getchar())!=EOF&&(d==' '));
       }/*直到出现EOF的是时候,程序结束*/
}
我输入9个数 再输入^z  ^z就是EOF 结束字符。
但是不输出结果。百思不得其解啊。请各位大虾们指点指点~~~小弟新手

QQ截图未命名.png (4.64 KB)
图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: 输入一串数字 求三角形面积 
2009-07-26 23:00
prankmoon
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:161
专家分:921
注 册:2009-7-21
收藏
得分:20 
你的代码风格我都不忍心再看了

1. 看一直没人回贴,我来回一个。代码实现的比较垃圾,凑活着看吧:

程序代码:
/**
*      file_name:      calculate area of triangle
*    description:
*
*        version:      1.0
*        created:      2:33 2009-7-27
*       revision:      none 
*       compiler:      VC6.0
*
*         author:      prankmoon@*        company:
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <assert.h>

#define     MAXLEN      100

struct triangle_str
{
    double x;
    double y;
    double z;
    double area;
};

/* check relationship of three lines */
int check_lines(struct triangle_str tri)
{
    /* basic check */
    assert((tri.x > 0) && (tri.y > 0) && (tri.z > 0));
    
    if ((tri.x+tri.y > tri.z) && (tri.x+tri.z > tri.y) && (tri.y+tri.z > tri.x))
    {
        return 1;   // right
    }
    
    printf("wrong lines relationship\n");   // wrong
    
    return 0;
}

/* get three lines from a string seperated with spaces */
struct triangle_str parse_lines(const char *in)
{
    struct triangle_str tri = {0};
    
    /* basic check */
    assert(in != NULL);
    
    /* format output */
    if (sscanf(in, "%lf %lf %lf", &(tri.x), &(tri.y), &(tri.z)) != 3)
    {
        printf("something wrong\n");
    }
    
    return tri;
}

/* calculate triangle's area */
double get_area(struct triangle_str *tri)
{
    double a = (tri->x + tri->y + tri->z) / 2.0;
    
    tri->area = sqrt(a * (a-tri->x) * (a-tri->y) * (a-tri->z));

    return tri->area;
}

int main(void)
{
    int length, count = 0, offset = 0;
    char input[MAXLEN] = {0};
    char line[MAXLEN] = {0};
    char two_chars[2] = {0};
    char space[2] = " ";    // space
    
    struct triangle_str tri;
    
    gets(input);
    length = strlen(input);
    
    while (offset < length)
    {
        
        memset(line, 0, MAXLEN);
        
        /* get three lines seperated with space */
        while (((count+1) % 4 != 0) && (offset < length))
        {
            while (input[offset++] == ' ')
                NULL;
            offset--;
            while ((input[offset] != ' ') && (offset < length))
            {
                two_chars[0] = input[offset];
                strcat(line, two_chars);
                offset++;
            }
            count++;
            strcat(line, space);
        }
        
        /* parse lines, check lines, calculate the area and output it */
        if (count % 3 == 0)
        {
            tri = parse_lines(line);
            // printf("line is %s\n", line);
        
            if (check_lines(tri) != 0)
            {
                printf("area is %lf\n", get_area((struct triangle_str *)&tri));
            }
            count = 0;
        }
    }
    
    printf("\ndone\n");
    return 0;
}

输入:
1.0 2.0 1.5 3.0 4 5   7.0 8  9
输出:
area is 0.726184
area is 6.000000
area is 26.832816

2. 还有就是你的这个函数会丢失精度:
int mianji(double x,double y,double z){
      double a=(x+y+z)/2.0,sum;
      sum=sqrt(a*(a-x)*(a-y)*(a-z));
      return sum;
}/*求三角形面积的函数*/
因为你的函数定义返回为整型,虽然你里面的 sum 是 double 类型,但函数返回时会强制转换为 int 类型,这样就造成了精度的损失。

3. 你用了多次 scanf 函数,每次都要手动输入三角形的每条边,而你贴图所示的那样只能得到一条边长就是 1.0,其后的全部被忽略,所以它在等待你输入第二条边的长度。

刚才重新看了一下,tnnd,我把问题复杂化了。

[[it] 本帖最后由 prankmoon 于 2009-7-27 03:26 编辑 [/it]]
2009-07-27 02:52
s36519882009
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2009-3-2
收藏
得分:0 
原谅一个初学者的无知吧。
2009-07-27 10:55
s36519882009
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2009-3-2
收藏
得分:0 
这好难懂哦,弄了好几小时才基本弄通,好多没学过的东西,受益匪浅啊。我有个疑问。
struct triangle_str parse_lines(const char *in)
{
    struct triangle_str tri = {0};
   
    /* basic check */
    assert(in != NULL);
   
    /* format output */
    if (sscanf(in, "%lf %lf %lf", &(tri.x), &(tri.y), &(tri.z)) != 3)
    {
        printf("something wrong\n");
    }
   
    return tri;
}

这一段是把 line字符串输入到struct triangle_str tri的x,y,z里面去。
if (sscanf(in, "%lf %lf %lf", &(tri.x), &(tri.y), &(tri.z)) != 3)
    {
        printf("something wrong\n");
    }
输入进去不就结了吗?sscanf(in, "%lf %lf %lf", &(tri.x), &(tri.y), &(tri.z)) != 3 为什么要不等于3呢。而且无论你输入7个还是8个数,都不会输出printf("something wrong\n");。



还有这句get_area((struct triangle_str *)&tri))  有点不懂。。为什么不是get_area(struct triangle_str *tri)呢?
总之非常感谢啦。
2009-07-27 15:04
prankmoon
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:161
专家分:921
注 册:2009-7-21
收藏
得分:0 
1. sscanf(in, "%lf %lf %lf", &(tri.x), &(tri.y), &(tri.z)) != 3 的原因是参数个数不够3,将无法构成三角形。多了不怕,sscanf会忽略多余的。其实triangle_str parse_lines函数的这个地方不会出现什么问题,因为我写的外层调用程序已经保证了输入参数的个数,只是还是检查一下,作为函数的独立性;如果外部没有保证的话,这里就会printf("something wrong\n");。

2. 因为get_area函数规定其参数必须为指向triangle_str结构的指针,而 &tri是tri结构的地址,我们需要把这个地址强制转换为triangle_str结构类型的指针,所以需要(struct triangle_str *)&tri     

[[it] 本帖最后由 prankmoon 于 2009-8-1 14:23 编辑 [/it]]
2009-08-01 13:34
s36519882009
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2009-3-2
收藏
得分:0 
OK 啦 3q
2009-08-02 14:27
快速回复:求三角形面积的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.080065 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved