C语言经典案例——第三章 函数
本篇提供了关于C语言程序设计中函数部分的经典案例,可供C语言的初学者们进行一个学习和编译练习。
/*Case 1
求n个数的平均值*/
int avg(int n) { //定义avg()函数int sum = 0; //变量初始化int data;int i = n;printf("请输入%d个数据:\n", n);while (i>0) //求出所有数字的和{scanf("%d",&data);sum += data;i--;}int avg = sum / n; //求出平均值return avg; //返回平均值
}
int main() {int n ; //n表示数字的数量printf("请输入数据的个数:");scanf("%d", &n);int a = 0;a = avg(n); //调用avg()函数printf("这%d个数据的平均值是:%d\n",n,a);return 0;
}
/*Case 2
远水不救近火
实现代码中不同位置变量的定义与使用*/
(1)局部变量
定义在函数内部的叫局部变量,作用域仅限于函数内部,函数执行完即失效。
int fun() {int a = 10; //局部变量return a;
}
int main() {int a = 5; //局部变量int b = fun();printf("a=%d,b=%d\n", a, b); return 0;
}
(2)全局变量
在所有函数外部定义的变量成为全局变量,不属于任何函数,而是属于源程序,可以为程序中所有函数使用,有效范围为从定义开始到源程序执行结束。
int a = 10;
int main() {{int a = 5;printf("a=%d", a);}printf(",a=%d\n", a);return 0;
}
案例实现
int water = 1; //全局的“水”
void Ffire(int fire) { //扑火 int water = 1; //局部的“水”fire -= water;
}
void msg(int fire) { //“火”是否被扑灭if (fire==0){printf("火被扑灭了!\n");}else{printf("警报尚未解除!\n");}
}
int main() {int fire = 1; //主函数中的“火”Ffire(fire); //①扑火printf("“远水”救“近火”?"); //局部的“水”将“火”扑灭后,并为将值返回到主函数msg(fire); //“火”变量记录的数值不变{ //代码段int water = 1;int fire = 1;fire -= water; //②扑火printf("“远水”救“近火”?"); //代码段中的“水”扑灭了代码段中的“火”,而非主程序的“火”msg(fire);}msg(fire);fire -= water; //③扑火msg(fire); //局部变量已失效,此时是全局变量的“水”扑灭了主程序的“火”return 0;
}
/*Case 3
计算器
实现针对两个整数的四则运算*/
float sum; //全局变量,记录计算结果
//加法运算
void Add(float num1, float num2) {sum = num1 + num2;printf("%.2f\n",sum);
}
//减法运算
void Sub(float num1, float num2) {sum = num1 - num2;printf("%.2f\n", sum);
}
//乘法运算
void Mult(float num1, float num2) {sum = num1 * num2;printf("%.2f\n", sum);
}
//除法运算
void Div(float num1, float num2) {if (num2==0){printf("被除数不能为0!");}else{sum = num1 / num2;printf("%.2f\n", sum);}
}
int main() {float num1, num2; //定义两个操作数char ch; //定义一个运算符while (1){scanf("%f%c%f", &num1, &ch, &num2);switch (ch){case '+':Add(num1, num2);break;case '-':Sub(num1, num2);break;case '*':Mult(num1, num2);break;case '/':Div(num1, num2);break;default:break;}}return 0;
}
/*Case 4
兔子数列(斐波那契数列、黄金分割数列)
一对兔子在出生两个月后,每个月能生出一对小兔子。先有一对刚出生的兔子,如果所有兔子都不死,那么一年后有多少只兔子
递归:程序对自身的调用*/
n=1或2时,只有1对兔子
n=3时,有一对兔子出生,此时有2对兔子
n=4时,n=3时出生的兔子尚不能生育,此时有三对兔子
n=5时,4月之前的两对兔子各生一对兔子,加上4月的3对兔子,共有5对兔子
n=6时,5月之前的三对兔子各生一对兔子,加上5月的5对兔子,共有8对兔子
以此类推
第n个月等于第n-1个月的兔子加上第n-2个月的兔子
即满足f(n)=f(n-1)+f(n-2)(n>1)
int getNum(int n) { //f(n)if (n==1||n==2) { return 1;}return getNum(n - 2) + getNum(n - 1); //f(n-1)+f(n-2)
}
int main() {printf("f(1)=%d\n", getNum(1)); //将函数作为实参调用printf("f(2)=%d\n", getNum(2));printf("f(3)=%d\n", getNum(3));printf("f(4)=%d\n", getNum(4));printf("f(5)=%d\n", getNum(5));printf("f(12)=%d\n", getNum(12));return 0;
}
/*Case 5
汉诺塔
实现n层汉诺塔的求解
规律f(n+1)=f(2n)+1*/
int getNum(int n) {//如果只有一个圆盘,只需移动一次if (n==1){return 1;}else{return 2 * getNum(n - 1) + 1; //当n>=2时,f(n)=2*f(n-1)+1}return 0;
}
int main() {int n = 10, num;num = getNum(n);printf("汉诺塔中%d片圆盘共需移动%d次\n", n, num);return 0;
}
/*Case 6
RSA算法
有关RSA算法的相关问题在另一篇文章里,此处不懂的小伙伴可以先单机链接了解一下*/
http://t.csdn.cn/fKV6O
int RSA(int baseNum, int key, int msg) { //自定义的RSA函数int RSAmsg = 1;key = key + 1;while (key!=1){RSAmsg = RSAmsg * msg;RSAmsg = RSAmsg % baseNum;key--;}return RSAmsg;
}
int main() {int p, q, baseNum, Euler, r;int keyE, keyD, m_msg, c_msg;printf("请输入p、q:");scanf("%d%d", &p, &q); //随机输入两个不相等的数p和qbaseNum = p * q; //计算p和q的乘积Euler = (p - 1) * (q - 1); //求出此值,用来计算keyDprintf("请输入公钥(与%d互质):", Euler);scanf("%d",&keyE); //输入公钥keyEwhile (keyE<1||keyE>Euler) //keyE有大小范围限制{printf("输入错误!\n请重新输入:");scanf("%d", &keyE);}keyD = 1;while (((keyE*keyD)%Euler)!=1) //求私钥keyD{keyD++;}printf("私钥:%d\n",keyD);printf("1.加密\n"); //打印菜单printf("2.解密\n");printf("3.退出\n");while (1){printf("请选择要执行的操作:");scanf("%d", &r); //输入选项1或2或3来执行不同的操作switch (r){case 1: //输入1进行加密printf("请输入要加密的数据:");scanf("%d", &m_msg);c_msg = RSA(baseNum, keyE, m_msg); //调用RSA函数printf("加密后的数据为:%d\n",c_msg);break;case 2: //输入2进行解密printf("请输入要解密的数据:");scanf("%d", &c_msg); m_msg = RSA(baseNum, keyD, c_msg); //调用RSA函数printf("加密后的数据为:%d\n", m_msg);break;case 3: //输入3退出程序exit(0);break;default:printf("选择有误!\n");break;}}return 0;
}
/*Case 7
综合案例——体测成绩判定*/
int sex = 0; //性别由外部传入,当计算总成绩是可以避免多次性别的出现
//体重指数
int countBMI(int sex) {float weight, height;printf("请依次输入体重(kg)、身高(m):");scanf("%f%f", &weight, &height);float BMI = weight / (height * height);int sco = 0;switch (sex){case 0: //男生if (BMI>17.9&&BMI<23.9){sco = 100;}else if (BMI<=17.8||(BMI>24.0&&BMI<27.9)){sco = 80;}else{sco = 60;}break;case 1:if (BMI > 17.2 && BMI < 23.9){sco = 100;}else if (BMI <= 17.1 || (BMI > 24.0 && BMI < 27.9)){sco = 80;}else{sco = 60;}break;default:sco = 0;}printf("体重指数为:%.2f,成绩为:%d\n", BMI, sco);return sco;
}
//肺活量
int countFVC(int sex) {int FVC, sco;printf("请输入肺活量(ml):");scanf("%d", &FVC);switch (sex){case 0: //男生if (FVC > 4800){sco = 100;}else if (FVC > 4180 && FVC <= 4800 ){sco = 80;}else if (FVC > 3100 && FVC <= 4180 ){sco = 60;}else{sco = 30;}break;case 1:if (FVC > 3400){sco = 100;}else if (FVC > 3000 && FVC <= 3400){sco = 80;}else if (FVC > 2050 && FVC <= 3000){sco = 60;}else{sco = 30;}break;default:break;}return sco;
}
//引体向上
int countChinups() {if (sex==1){printf("引体向上为男生特有项目!\n");Sleep(2000);exit(0);}int UPs = 0, sco = 0;printf("引体向上计数为:");scanf("%d", &UPs);if (UPs>19){sco = 100;}else if (UPs>15&&UPs<=19){sco = 80;}else if (UPs>10&&UPs<=15){sco = 60;}else{sco = 30;}return sco;
}
//仰卧起坐
int countSitup() {if (sex==0){printf("仰卧起坐为女生特有项目!\n");Sleep(2000);exit(0);}int UPs = 0, sco = 0;printf("仰卧起坐计数为:");scanf("%d", &UPs);if (UPs > 56){sco = 100;}else if (UPs > 52 && UPs <= 56){sco = 80;}else if (UPs > 26 && UPs <= 52){sco = 60;}else{sco = 30;}return sco;
}
//总成绩
void getNum() {int BMI, FVC, Sups;int Cups = 0;double num;//获取每一项成绩BMI = countBMI(sex);FVC = countFVC(sex);//计算成绩if (sex == 0) {Cups = countChinups(); //若是男生获取引体向上个数num = BMI * 0.25 + FVC * 0.35 + Cups * 0.4;}else{ Sups = countSitup(); //若是女生获取仰卧起坐个数num = BMI * 0.25 + FVC * 0.35 + Sups * 0.4;}//判断成绩优劣if (num > 95) {printf("综合成绩为%.2f,优秀\n", num);}else if (num>80&&num<=95){printf("综合成绩为%.2f,良好\n", num);}else if (num > 60 && num <= 80){printf("综合成绩为%.2f,及格\n", num);}else{printf("综合成绩为%.2f,不及格\n", num);}
}
//菜单
int menu() {int sec;printf("功能菜单\n");printf("===============\n");printf("1.体重指数BMI\n");printf("2.肺活量FVC\n");printf("3.引体向上\n");printf("4.仰卧起坐\n");printf("5.总成绩\n");printf("0.退出\n");printf("===============\n");printf("请输入性别(男:0/女:1):\n");scanf("%d", &sex);while (sex!=0&&sex!=1){printf("选择有误!\n请重新输入:");scanf("%d", &sex);}printf("请输入要选择的功能:");scanf("%d", &sec);while (sec>5||sec<0){printf("选择有误!\n请重新输入:");scanf("%d", &sec);}return sec;
}
int main() {int sec = menu(); //调用菜单函数,获取选择的编号switch (sec) //功能调用 {case 0:exit(0); break;case 1:countBMI(sex); break;case 2:countFVC(sex); break;case 3:countChinups(); break;case 4:countSitup(); break;case 5:getNum(); break;default:break;}return 0;
}
本篇的所有代码是在VS编译环境下操作的,如有错误,望大家指正!!!
C语言经典案例——第三章 函数相关推荐
- C语言经典案例——第四章 数组
本篇提供了关于C语言程序设计中数组部分的经典案例,可供C语言的初学者们进行一个学习和编译练习. /*Case 1 最大值和最小值 先输入数组的大小和各个数组元素,然后求出数组中的最大值和最小值,以及他 ...
- 给定一个函数做其最佳平方逼近c语言,第三章 函数逼近 — 最佳平方逼近.
第三章 函数逼近 - 最佳平方逼近 内容提要 最佳平方逼近 最佳平方逼近函数.多项式 利用正交多项式计算最佳平方逼近多项式 Chebyshev 级数与最佳一致逼近 最佳平方逼近 什么是最佳平方逼近 设 ...
- c语言排列组合的函数,c语言排列组合算法 排列和组合算法的实现方法_C语言经典案例...
想了解排列和组合算法的实现方法_C语言经典案例的相关内容吗,在本文为您仔细讲解c语言排列组合算法的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:c语言排列组合算法,下面大家一起来学习吧. ...
- c语言程序设计函数6,C语言程序设计》第6章函数-XiamenUniversity.PDF
厦门大学非计算机专业本科生公共课 (2012-2013第2学期) <C语言程序设计> 第6章 函数 林子雨 厦门大学计算机科学系 E-mail: ziyulin@ 个人主页:/linziy ...
- c语言动态双端栈的原理,数据结构(C语言版)例题(第三章:栈和队列)
数据结构(C语言版)例题(第三章:栈和队列) 数据结构(C语言版)例题(第三章:栈和队列) (2008-05-09 12:33:13) 转载▼ ◆3.15③ 假设以顺序存储结构实现一个双向栈,即在一维 ...
- acm水仙花数java,水仙花数之C语言经典案例分析
水仙花数之C语言经典案例分析 一.[什么是水仙花数] 水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI) ...
- C语言进程(第三章,exec函数族,execl,execlp,execle,execv,execvp,execve)
C语言进程(第三章,exec函数族,execl,execlp,execle,execv,execvp,execve) 简介 本文讲解C语言进程中的exec函数族相关知识,相关函数有excel,exec ...
- R语言基础题及答案(三)——R语言与统计分析第三章课后习题(汤银才)
R语言与统计分析第三章课后习题(汤银才) 题-1 从1到100个自然数中随机不放回地抽取5个数, 并求它们的和. sum(sample(1:100,5)) 15~490任何一个数都有可能 [1] 29 ...
- 数据结构(C语言)第二版 第三章课后答案
数据结构(C语言)第二版 第三章课后答案 1~5 C C D A A 6~10 D A B C D 11~15 D D B C B 1.选择题 (1)若让元素1, 2, 3 , 4, 5 依次进栈,则 ...
最新文章
- 使用Javap分析Java代码里的static final的工作原理
- python安全攻防---信息收集---whois查询
- 学3D建模,工作后薪资一般是多少
- 计算机设计大赛作品评语,第九届大学生短片大赛获奖作品评语
- 神经网络-Neural Network 简介
- 浅谈Tomcat的启动流程(源码级别)
- 前端实现视频录制功能
- Windows驱动的Checked (chk)和Free(fre)区别
- cheatsheet 使用_使用CheatSheet快速查看任何Mac App的所有键盘快捷键
- Boot与App程序设计
- PHP日历函数相关预定义常量
- 编写可读代码(二) 如何命名
- UE Gameplay实例49(高级蒙太奇动画连招)
- 庄股高手和你谈选股绝招(2)
- LoadRunner 2016首次更新,增强多项功能,支持更多平台|附下载
- linux测试ftp上传速度,Linux通过trickle对FTP Client限速
- js实现select功能
- WINDOWS PE制作 - 主引导记录(Master Boot Record)介绍
- oracle数据库进程pmon,【案例】Oracle进程异常 pmon和LISTENER进程负载均比较高的解决办法...
- 把知乎丁香医生的文章及回答转pdf