有理数类型 - 1. 创建项目

有理数类型 - 2. 有理数标准化

有理数类型 - 3. 有理数的设置

有理数类型 - 4. 有理数的读取

有理数类型 - 5. 有理数的输入

有理数类型 - 6. 有理数的输出

有理数类型 - 7. 有理数的加法

有理数类型 - 8. 有理数的减法

有理数类型 - 9. 有理数的乘法

有理数类型 - 10. 有理数的除法

有理数类型 - 11. 有理数的比较

有理数类型 - 12. 交换有理数

有理数类型 - 13. 综合应用(主菜单)

Fraction.c 文件源码如下

#include <stdio.h>
#include <stdlib.h>
#include "Fraction.h"// 有理数标准化
void Reduct(FRACTION *fraction)
{int i,k=0;if(fraction->num == 0){fraction->den = 1;}else{if((fraction->den < 0 && fraction->num > 0) || (fraction->num < 0 && fraction->den > 0)){k = 1;}fraction->num = abs(fraction->num);fraction->den = abs(fraction->den);i = Gcd(fraction->num, fraction->den);fraction->num /= i;fraction->den /= i;if(k){fraction->num = -fraction->num;}}
}  // 设置有理数
void FractionSet(FRACTION *fraction, int num, int den)
{if(den == 0){printf("Divided by zero!\n");}else{fraction->num = num;fraction->den = den;Reduct(fraction);}
}// 读取有理数
void FractionGet(const FRACTION *fraction, int *num, int *den)
{*num = fraction->num;*den = fraction->den;
}// 输入有理数(基础版)
void FractionInput(FRACTION *fraction)
{int num,den;scanf("%d/%d",&num,&den);if(den == 0){printf("Divided by zero!\n");fraction->num = 0;fraction->den = 1; }else{fraction->num = num;fraction->den = den;Reduct(fraction);}
}// 输出有理数
void FractionOutput(const FRACTION *fraction)
{printf("%d/%d",fraction->num,fraction->den);
}// 有理数加法
FRACTION FractionAdd(const FRACTION *x, const FRACTION *y)
{FRACTION r;int a;a = Lcm(x->den,y->den);r.den = a;r.num = (a/x->den)*x->num + (a/y->den)*y->num;Reduct(&r);return r;
}// 有理数减法
FRACTION FractionSub(const FRACTION *x, const FRACTION *y)
{FRACTION r;int a;a = Lcm(x->den,y->den);r.den = a;r.num = (a/x->den)*x->num - (a/y->den)*y->num;Reduct(&r);return r;
}// 有理数乘法
FRACTION FractionMul(const FRACTION *x, const FRACTION *y)
{FRACTION z;int a,b;a=Gcd(x->num,y->den);b=Gcd(x->den,y->num);z.num = (x->num/a) * (y->num/b);z.den = (x->den/b) * (y->den/a);Reduct(&z);return z;
}// 有理数除法
FRACTION FractionDiv(const FRACTION *x, const FRACTION *y)
{FRACTION r;int a,b;if(y->num==0){printf("Divided by zero!\n");r.num = 0;r.den = 1;return r;}else{a = Gcd(x->num,y->num);b = Gcd(x->den,y->den);r.num = (x->num/a)*(y->den/b);r.den = (x->den/b)*(y->num/a);Reduct(&r);return r;}
}// 判断大于
int FractionGt(const FRACTION *x, const FRACTION *y)
{FRACTION r;r = FractionSub(x,y);return r.num > 0;
}
// 判断大于等于
int FractionGe(const FRACTION *x, const FRACTION *y)
{FRACTION r;r = FractionSub(x,y);return r.num >= 0;
}
// 判断小于
int FractionLt(const FRACTION *x, const FRACTION *y)
{FRACTION r;r = FractionSub(x,y);return r.num < 0;
}
// 判断小于等于
int FractionLe(const FRACTION *x, const FRACTION *y)
{FRACTION r;r = FractionSub(x,y);return r.num <= 0;
}
// 判断等于
int FractionEq(const FRACTION *x, const FRACTION *y)
{FRACTION r;r = FractionSub(x,y);return r.num == 0;
}
// 判断不等于
int FractionNe(const FRACTION *x, const FRACTION *y)
{FRACTION r;r = FractionSub(x,y);return r.num != 0;
}// 交换有理数
void FractionSwap(FRACTION *x, FRACTION *y)
{IntSwap(&x->num , &y->num);IntSwap(&x->den , &y->den);
}

Fraction.h 文件源码如下

#ifndef _Fraction_h_
#define _Fraction_h_#include "Integer.h"// 定义有理数类型
typedef struct
{// 分子, 分母int num, den;
} FRACTION;// 有理数标准化
void Reduct(FRACTION *fraction);// 设置有理数
void FractionSet(FRACTION *fraction, int num, int den);// 读取有理数
void FractionGet(const FRACTION *fraction, int *num, int *den);// 输入有理数(基础版)
void FractionInput(FRACTION *fraction);// 输出有理数
void FractionOutput(const FRACTION *fraction);// 有理数加法
FRACTION FractionAdd(const FRACTION *x, const FRACTION *y);// 有理数减法
FRACTION FractionSub(const FRACTION *x, const FRACTION *y);// 有理数乘法
FRACTION FractionMul(const FRACTION *x, const FRACTION *y);// 有理数除法
FRACTION FractionDiv(const FRACTION *x, const FRACTION *y);// 判断大于
int FractionGt(const FRACTION *x, const FRACTION *y);
// 判断大于等于
int FractionGe(const FRACTION *x, const FRACTION *y);
// 判断小于
int FractionLt(const FRACTION *x, const FRACTION *y);
// 判断小于等于
int FractionLe(const FRACTION *x, const FRACTION *y);
// 判断等于
int FractionEq(const FRACTION *x, const FRACTION *y);
// 判断不等于
int FractionNe(const FRACTION *x, const FRACTION *y);// 交换有理数
void FractionSwap(FRACTION *x, FRACTION *y);
#endif

涉及到部分函数参见整数类型!

综合应用(主菜单)

运行效果如下:

Add Sub Mul Div Quit > T
Incorrect choice!
Add Sub Mul Div Quit > a
2669/654 -3361/822
-116/14933
Add Sub Mul Div Quit > S
2371/1788 1963/2220
12179/27565
Add Sub Mul Div Quit > m
20397/24899 -21991/22956
-149516809/190527148
Add Sub Mul Div Quit > d
-9019/86784 -18497/2063
18606197/1605243648
Add Sub Mul Div Quit > D
3828099/28150511 0/1812157781
Divided by zero!
Add Sub Mul Div Quit > Q

功能要求:

  • 若用户输入A或a,则输入两个有理数,然后计算并输出两个有理数的和;
  • 若用户输入S或s,则输入两个有理数,然后计算并输出两个有理数的差;
  • 若用户输入M或m,则输入两个有理数,然后计算并输出两个有理数的积;
  • 若用户输入D或d,则输入两个有理数,然后判断第二个有理数是否为零。若第二个有理数不为零,则计算并输出两个有理数的商,否则报告错误;
  • 若用户输入Q或q,则退出主菜单,程序结束;
  • 若用户输入其它字符,则报告错误;
  • 程序反复显示主菜单,供用户反复使用,直到用户选择Q或q为止。
#include <stdio.h>
#include "Fraction.h"int main()
{int ok = 1;char c;FRACTION a, b, z;while (ok){printf("Add Sub Mul Div Quit > ");scanf("%c", &c);switch (c){case 'A':case 'a':FractionInput(&a);FractionInput(&b);z = FractionAdd(&a, &b);FractionOutput(&z);putchar('\n');break;case 'S':case 's':FractionInput(&a);FractionInput(&b);z = FractionSub(&a, &b);FractionOutput(&z);putchar('\n');break;case 'M':case 'm':FractionInput(&a);FractionInput(&b);z = FractionMul(&a, &b);FractionOutput(&z);putchar('\n');break; case 'D':case 'd':FractionInput(&a);FractionInput(&b);if (b.num){z = FractionDiv(&a, &b);FractionOutput(&z);  }else{printf("Divided by zero!");}putchar('\n');break;case 'Q':case 'q':ok = 0;break;default :puts("Incorrect choice!");break;} scanf("%*c");}return 0;}

欢迎指教!

C语言项目 - 有理数类型相关推荐

  1. [开源] C语言项目实战 - 虚拟鼠标 - VirtualMouse

    C语言项目实战 - 虚拟鼠标 - VirtualMouse 目录 关于软件 软件介绍 使用帮助 项目介绍 源码及软件下载 知识点扫描 热键的使用 鼠标事件的模拟 字体的选用 开机自启动的设置 为软件添 ...

  2. python程序设计语言是什么类型的语言-Python 是弱类型的语言 强类型和弱类型的语言区别...

    Python 是弱类型的语言 在强类型的编程语言中,定义变量时要指明变量的类型,而且赋值的数据也必须是相同类型的,C语言.C++.Java 是强类型语言的代表. 下面我们以 C++ 为例来演示强类型语 ...

  3. 如何使用visual studio 2017创建C语言项目

    使用visual studio 2017创建一个C语言项目,步骤如下: (1)打开Visual Studio 2017环境后出现欢迎界面,如图1所示. 图1  Visual Studio 2017欢迎 ...

  4. 项目的数据存储c语言,C语言项目实战项目8__项目中学生数据的存储与重用.ppt

    C语言项目实战项目8__项目中学生数据的存储与重用 项目8 技能目标 能用fopen函数和fclose函数打开和关闭文件 能正确地读写文件 能用文件定位函数对文件进行正确的定位操作 能用格式化读写函数 ...

  5. C语言数据类型 / 变量类型 - C语言零基础入门教程

    目录 一.C 语言数据类型分类 二.C 语言整形 1.无符号整形(16 位系统) 2.有符号整形(16 位系统) 3.int 和 long 区别 4.超出取值范围的整形 三.C 语言浮点型 float ...

  6. 编译型与解释型、动态语言与静态语言、强类型语言与弱类型语言概念辨析

    编译型与解释型.动态语言与静态语言.强类型语言与弱类型语言概念辨析 转自:https://blog.csdn.net/u010533843/article/details/76215487 编译型和解 ...

  7. SQL 之后,GQL 成为 ISO/IEC 国际标准数据库语言项目

    Graph Query Language(GQL,图形查询语言) 是由同时维护 SQL 标准的国际工作组开发和维护的一种新语言. GQL 很大程度上借鉴了现有的语言,主要的灵感来自 Cypher(现在 ...

  8. C语言之复合类型下卷(十九)(自然法则)(2023)

    上一篇: C语言之复合类型上卷(十八)(阴阳两极) 逐梦编程,让中华屹立世界之巅. 简单的事情重复做,重复的事情用心做,用心的事情坚持做: 文章目录 前言 一.结构体指针 二.结构体嵌套指针 三.co ...

  9. C语言不完全类型是什么?有什么用途?

    目录 1.不完全类型的概念 2.不完全类型的用途 3.不完全类型实践应用 1.不完全类型的概念 ISO(国际标准化组织(International Standard Organization))将C语 ...

最新文章

  1. 个人-GIT使用方法
  2. html 文件上传与移除,js jquery分别实现动态的文件上传操作按钮的添加和删除
  3. 【嵌入式】嵌入式天地博客汇总
  4. 教你增加网站反向链接的7大法门和12奇招
  5. 神秘的数组初始化_图像识别神秘化
  6. mysql操作窗口如何设置粘贴,Access6.5在表中复制和粘贴数据
  7. 通过反射获得私有构造器,创建对象
  8. android事务队列处理的实现
  9. 分享非常有用的Java程序(关键代码)(七)---抓屏程序
  10. JavaScript 之 DOM中的三大对象
  11. android.os.FileUriExposedException: file:///storage/emulated/0/market/cache/com.moji.mjweather.apk
  12. 注册一个域名需要多少钱_注册一个域名要多少钱?
  13. 如何像伟大的企业家一样写作
  14. opencv(python)使用ann神经网络识别手写数字
  15. C#圆形卡尺测量程序基于halcon
  16. 计算机中软键盘有哪些用途,电脑键盘的每个字母都有什么用途呢?
  17. angularJS中localstorage,利用localstorage来实现其他页面获取本地缓存
  18. 诛仙哪里炼器服务器最稳定,诛仙炼器轻松+11最强攻略
  19. 梅科尔工作室-赵凌志-鸿蒙笔记4
  20. 2023最新萤火商城源码 V2.0版+全开源的

热门文章

  1. 论如何拯救程序员的发际线?程序员的事情当然要用编程解决啦
  2. windows下更改中文用户名为英文
  3. 用 Python 实现手机自动答题,这下百万答题游戏谁也玩不过我!
  4. 数独解题思路——求解数独
  5. step7-- simatic -- PLC - MPI --
  6. 微软office即点即用服务能关闭吗?_技术贴:关于OFFICE各版本的下载安装卸载以及激活方法大全...
  7. 九度oj 题目1080:进制转换
  8. favicon.ico文件简介
  9. 【100%通过率】华为OD机试真题 Python 实现【核酸最快检测效率】【2022.11 Q4 新题】
  10. coresite美国数据中心你了解多少?