本篇提供了关于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语言经典案例——第三章 函数相关推荐

  1. C语言经典案例——第四章 数组

    本篇提供了关于C语言程序设计中数组部分的经典案例,可供C语言的初学者们进行一个学习和编译练习. /*Case 1 最大值和最小值 先输入数组的大小和各个数组元素,然后求出数组中的最大值和最小值,以及他 ...

  2. 给定一个函数做其最佳平方逼近c语言,第三章 函数逼近 — 最佳平方逼近.

    第三章 函数逼近 - 最佳平方逼近 内容提要 最佳平方逼近 最佳平方逼近函数.多项式 利用正交多项式计算最佳平方逼近多项式 Chebyshev 级数与最佳一致逼近 最佳平方逼近 什么是最佳平方逼近 设 ...

  3. c语言排列组合的函数,c语言排列组合算法 排列和组合算法的实现方法_C语言经典案例...

    想了解排列和组合算法的实现方法_C语言经典案例的相关内容吗,在本文为您仔细讲解c语言排列组合算法的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:c语言排列组合算法,下面大家一起来学习吧. ...

  4. c语言程序设计函数6,C语言程序设计》第6章函数-XiamenUniversity.PDF

    厦门大学非计算机专业本科生公共课 (2012-2013第2学期) <C语言程序设计> 第6章 函数 林子雨 厦门大学计算机科学系 E-mail: ziyulin@ 个人主页:/linziy ...

  5. c语言动态双端栈的原理,数据结构(C语言版)例题(第三章:栈和队列)

    数据结构(C语言版)例题(第三章:栈和队列) 数据结构(C语言版)例题(第三章:栈和队列) (2008-05-09 12:33:13) 转载▼ ◆3.15③ 假设以顺序存储结构实现一个双向栈,即在一维 ...

  6. acm水仙花数java,水仙花数之C语言经典案例分析

    水仙花数之C语言经典案例分析 一.[什么是水仙花数] 水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI) ...

  7. C语言进程(第三章,exec函数族,execl,execlp,execle,execv,execvp,execve)

    C语言进程(第三章,exec函数族,execl,execlp,execle,execv,execvp,execve) 简介 本文讲解C语言进程中的exec函数族相关知识,相关函数有excel,exec ...

  8. R语言基础题及答案(三)——R语言与统计分析第三章课后习题(汤银才)

    R语言与统计分析第三章课后习题(汤银才) 题-1 从1到100个自然数中随机不放回地抽取5个数, 并求它们的和. sum(sample(1:100,5)) 15~490任何一个数都有可能 [1] 29 ...

  9. 数据结构(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 依次进栈,则 ...

最新文章

  1. 使用Javap分析Java代码里的static final的工作原理
  2. python安全攻防---信息收集---whois查询
  3. 学3D建模,工作后薪资一般是多少
  4. 计算机设计大赛作品评语,第九届大学生短片大赛获奖作品评语
  5. 神经网络-Neural Network 简介
  6. 浅谈Tomcat的启动流程(源码级别)
  7. 前端实现视频录制功能
  8. Windows驱动的Checked (chk)和Free(fre)区别
  9. cheatsheet 使用_使用CheatSheet快速查看任何Mac App的所有键盘快捷键
  10. Boot与App程序设计
  11. PHP日历函数相关预定义常量
  12. 编写可读代码(二) 如何命名
  13. UE Gameplay实例49(高级蒙太奇动画连招)
  14. 庄股高手和你谈选股绝招(2)
  15. LoadRunner 2016首次更新,增强多项功能,支持更多平台|附下载
  16. linux测试ftp上传速度,Linux通过trickle对FTP Client限速
  17. js实现select功能
  18. WINDOWS PE制作 - 主引导记录(Master Boot Record)介绍
  19. oracle数据库进程pmon,【案例】Oracle进程异常 pmon和LISTENER进程负载均比较高的解决办法...
  20. 把知乎丁香医生的文章及回答转pdf

热门文章

  1. EESM和MI-ESM
  2. xp故障恢复控制台和它的命令 1
  3. Tomcat集成eclipse
  4. 10个企业网络安全建议,解决的网络安全问题
  5. SourceInsight4.0下载安装教程
  6. ftp上传文件与服务器的连接被重置怎么办,FTP上传文件与服务器的连接被重置
  7. PCIE控制器——数据链路层——DLLP报文
  8. Clean Code 读书笔记三——方法(函数)
  9. 国内外云服务器厂商分类(性价比分析)
  10. 【转】WebMatrix 从零建站如此简单!来自微软的免费网站服务器快速建站套件