| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3547 人关注过本帖
标题:编写函数:分数的乘法
只看楼主 加入收藏
t南柯一梦
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2017-11-4
结帖率:88.89%
收藏
已结贴  问题点数:10 回复次数:11 
编写函数:分数的乘法
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
struct fraction
{

    int numerator; // 分子

    int denominator; // 分母

    int symbol; // 符号,分子为负时取值为-1,为正时取值为1,其它取值无意义

};
int scan_frac(struct fraction *f, struct fraction *g)//按题目格式输入两个分数,存入f和g所指的内存中。

{
    int a,b,x,y;
    scanf("%d/%d*%d/%d",&a,&b,&x,&y);
    f->numerator=a;
    f->denominator=b;
    g->numerator=x;
    g->denominator=y;
    if(a>0)
    {
        f->symbol=1;
    }
    else
    {
        f->symbol=-1;
    }
    if(x>0)
    {
        g->symbol=1;
    }
    else
    {
        g->symbol=-1;
    }
}
struct fraction multiply_frac(struct fraction f, struct fraction g)//返回分数f和g的乘积
{
    struct fraction result;
    int a,b,t,m,n;
    a=f.numerator*g.numerator;
    b=f.denominator*g.denominator;
    m=a;
    n=b;
    if(a<b)
    {
        t=a;
        a=b;
        b=t;
    }
    while(a%b!=0)
    {
        t=b;
        b=a%b;
        a=t;
    }
    a=m/b;
    b=n/b;
    result.numerator=a;
    result.denominator=b;
    result.symbol=f.symbol*g.symbol;
    return result;
}
int main()
{
    struct fraction f1, f2, product;
    while(scan_frac(&f1, &f2) != EOF)
    {
        product = multiply_frac(f1, f2);
        if(product.numerator == 0)
        {
            printf("0\n");
            continue;
        }
        if(product.symbol == -1)
            printf("-");
        printf("%d/%d\n", product.numerator, product.denominator);
    }
    return 0;
}
为什么我的程序一运行就要崩(主函数由题目给出,不能改动)
搜索更多相关主题的帖子: 分数 struct int symbol product 
2018-01-03 00:42
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:4 
图就不看了,就看看奔溃的事
我运行了一下,根本不是“一运行就要崩”,“一运行”时首先是等待输入,没有崩溃。
甚至输入后都不奔溃,而是只有 分子为0 时才崩溃。
所以,作为提问者的你,要明确告诉别人输入什么后奔溃,不要浪费大家的时间,比如说“我输入0/6*5/8后奔溃”

当b==0时,执行while(a%b!=0,运行时错误
2018-01-03 08:40
t南柯一梦
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2017-11-4
收藏
得分:0 
回复 2楼 rjsp
谢谢 我知道怎么改了 但是改了之后提交到oj上说输出超限 你知道是什么原因吗

[此贴子已经被作者于2018-1-3 11:22编辑过]

2018-01-03 11:00
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
不懂(我不看图),但看你这代码,明显symbol没用上。
于是我输入 -1/1*1/1 后,你输出 -1/-1
2018-01-03 12:20
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:4 
程序代码:
while(scan_frac(&f1, &f2) != EOF)
    {

        product = multiply_frac(f1, f2);
        if(product.numerator == 0)
        {
            printf("0\n");
            continue;
        }
        if(product.symbol == -1) printf("-");
        printf("%d/%d\n", product.numerator, product.denominator);
    }


你的输入部分不对,人家题目要求是输入一系列的数据 然后一起计算 一起输出  而你的事输一个算一个  明显不符  
而且你的最终结果的正负号还是有些问题

DO IT YOURSELF !
2018-01-03 15:01
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10537
专家分:42927
注 册:2014-5-20
收藏
得分:4 
按题目写了一下,不知对否。
#include <stdio.h>

struct fraction
{
    int numerator;      // 分子
    int denominator;    // 分母
    int symbol;         // 符号,分子为负时取值为-1,为正时取值为1,其它取值无意义

};

int scan_frac(struct fraction *f, struct fraction *g)//按题目格式输入两个分数,存入f和g所指的内存中。
{
    printf("Input format: a/b*c/d\n");
    if (scanf("%d/%d*%d/%d",&f->numerator,&f->denominator,&g->numerator,&g->denominator)!=4 ||
        f->numerator==0 || f->denominator==0 || g->numerator==0 || g->denominator==0)
        return 0;
        f->symbol = f->numerator<0 ? -1 : 1;
        g->symbol = g->numerator<0 ? -1 : 1;
        f->numerator *= f->symbol;
        g->numerator *= g->symbol;
        return 1;
    }

struct fraction multiply_frac(struct fraction *f, struct fraction *g)//返回分数f和g的乘积
{
    struct fraction result;
    result.numerator = f->numerator * g->numerator;
    result.denominator = f->denominator * g->denominator;
    result.symbol = f->symbol * g->symbol;
    int min = result.numerator<result.denominator ? result.numerator : result.denominator;
    for (; min>1; --min)
        if ((result.numerator%min)==0 && (result.denominator%min)==0)
            break;
    if (min > 1)
    {
        result.numerator /= min;
        result.denominator /= min;
    }
    return result;
}

int main()
{
    struct fraction f1, f2, product;
    while (scan_frac(&f1, &f2))
    {
        product = multiply_frac(&f1, &f2);
        if(product.symbol == -1)
            printf("-");
        printf("%d/%d\n", product.numerator, product.denominator);
    }
    return 0;
}
2018-01-03 15:51
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
回复 6楼 吹水佬
你这个不也是算一个输出一个吗  题目是输入N组 输出N组

DO IT YOURSELF !
2018-01-03 16:30
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10537
专家分:42927
注 册:2014-5-20
收藏
得分:0 
以下是引用wp231957在2018-1-3 16:30:50的发言:

你这个不也是算一个输出一个吗  题目是输入N组 输出N组

这个问题搞个结构数组输入输出就可以
2018-01-03 16:35
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
回复 8楼 吹水佬
题目只是说多行输入 遇EOF结束 那么你数组的容量设置多少呢 100 200 .。。。。

还是说设置动态数组

DO IT YOURSELF !
2018-01-03 16:40
t南柯一梦
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2017-11-4
收藏
得分:0 
回复 5楼 wp231957
主函数由题目给出 不能修改 不过我知道怎么做了 谢谢了
2018-01-03 18:07
快速回复:编写函数:分数的乘法
数据加载中...
 
   



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

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