一、目的
利用函数将程序分为多个模块,使主函数看上去更简洁明了,而每个模块行使自己的功能,方便以后写类似程序直接拿来调用。减少了只有一个(主)函数时代码又较多的臃肿性,方便检查和修改。
二、技术
将主函数中的一些代码打包成函数(最好能凸显每个函数的目的和尽量一个函数实现一个重要功能),通过调用函数来优化代码。C语言中函数分为主函数、被调用函数、库函数等等(不同分类的标准不同)。主函数(main函数)程序运行的主体,一般一个C语言程序只有一个主函数。被调用函数是在主函数中调用的、又在主函数外声明编写的函数。库函数是预先编好的一些函数,使得在主函数中可以直接使用某些关键字而不用再另外编辑被调用函数。
三、每个技术如何使用
主函数:例如int main(){}
void main(){}
int main(int argc, const char * argv[]) {}
int main(int argc, const char ** argv[]) {}
被调用函数:例如int swap(int a,int b){int a,b,c;c=a;a=b;b=c;}完成对两个整型a,b数值的交换
void helloWorld(){printf("Hello World!");}输出Hello World!
库函数:例如#include“stdio.h”(""表示编译器会首先从自己的工程里面去查找这个头文件 如果没有,那么会从系统库里面去查找)
#include
#include
上面三个使系统默认的三个库函数,也可以自己编写一个库函数来使用。
四、实际使用
用函数实现ATM程序
——————————————————————————————————————————————————————————
要实现的功能:
* * *****
欢迎光临
* * *****
请输入密码:123
错误-> 密码错误请重新输入: 最多输入4 -> 此卡已冻结 请联系客服 -> 退出
正确-> 1.取款 请输入取款金额:200-> 取款成功 当前余额为20
->余额不足 是否继续Y/N
2.存款 请输入金额:2000 -> 存款成功 当前余额:3000!
3.更改密码 请输入原始密码->请设置密码->请确认密码
4.退出 请选择操作: 用函数实现
—————————————————————————————————————————————————————————
声明的被调用函数
bool loginATM(void);//密码登录ATM
void welcome(void);//ATM欢迎界面
void exitATM(int status);//退出界面
void showMenu(void);//ATM菜单界面
char getChoice(void);//对ATM菜单做出选择选择
void withdraw(void);//取款
bool isContinue(void);//余额不足时的两个选择
void deposit(void);//存款
void setPassword(void);//修改密码
—————————————————————————————————————————————————————————
—— —— —— —— —— —— —— —— —— ——
定义的两个全局变量
int orgPassword = 123;//密码
int totalMoney = 1000;//初始余额
—— —— —— —— —— —— —— —— —— ——
——————————————————————————————————————————————————————————
主函数
int main(int argc, const char * argv[]) {
welcome();//欢迎界面
bool result = loginATM();//bool类型判定密码输入的对错
if (result == false)
exitATM(EXIT_FAILURE);//输入错误过多直接结束程序
}
while (1) {
showMenu();//密码正确时显示菜单
char choice = getChoice();//用户的选择
switch(choice){
case '1':
withdraw();//存款
break;
case‘2’:
deposit();//取款
break;
case '3':
setPassword();//修改密码
break;
default:
exitATM(EXIT_SUCCESS);//退出程序
break;
}
}
return 0;
}
—————————————————————————————————————————————————————————
被调用函数
—— —— —— —— —— —— —— —— —— ——
密码登录ATM
bool loginATM(void){
int password = 0;
int wrongTime = 0;
while(1){
printf("请输入密码:");
scanf("%d", &password);
if (password == orgPassword) {
return true;
}else{
wrongTime++;
if (wrongTime == 4) {
return false;
}else{
printf("密码错误,");
}
}
}
}
—— —— —— —— —— —— —— —— —— ——
ATM欢迎界面
void welcome(void){
printf("***************\n");
printf(" 欢迎使用ATM\n");
printf("***************\n");
}
—— —— —— —— —— —— —— —— —— ——
退出界面
void exitATM(int status){
printf("*************************\n");
printf(" 感谢你的使用 再见!!!\n");
printf("*************************\n");
exit(status);
}
—— —— —— —— —— —— —— —— —— ——
ATM菜单界面
void showMenu(void){
printf("**************\n");
printf("1.取款\n");
printf("2.存款\n");
printf("3.设置密码\n");
printf("4.退出\n");
printf("**************\n");
}
—— —— —— —— —— —— —— —— —— ——
对ATM菜单做出选择选择
char getChoice(void){ //将输入的所有字符串全部从缓存里面读取出来
char temp[20] = {};
while (1) {
printf("请选择操作:");
int count = scanf("%s", temp);
if (count != 1) {
printf("输入不合法,");
} else{
char ch = temp[0];
if (ch == '1' || ch == '2' || ch == '3' || ch == '4') {
return ch;
}else{
printf("输入不合法,");
}
}
}
}
—— —— —— —— —— —— —— —— —— ——
取款
void withdraw(void){
int outMoney = 0;
while (1) {
printf("请输入取款金额:");
scanf("%d", &outMoney);
if(outMoney > 0 && outMoney <= totalMoney){
totalMoney = totalMoney - outMoney;
printf("取款成功 余额为:%d\n", totalMoney);
bool ch = isContinue(); //提示是否继续
if (ch == false) {
return; //break;
}
}else{
printf("余额不足,");
}
}
}
—— —— —— —— —— —— —— —— —— ——
余额不足时的两个选择
bool isContinue(void){
printf("是否继续?(y/n):");
getchar();
char ch = getchar();
if (ch == 'n') {
return false;
}else{
return true;
}
}
—— —— —— —— —— —— —— —— —— ——
存款
void deposit(void){
int intputMoney = 0;
while (1) {
printf("请输入存款金额:");
scanf("%d", &intputMoney);
totalMoney = totalMoney + intputMoney;
printf("存款成功,余额为:%d\n", totalMoney);
bool ch = isContinue();
if (ch == false) {
return; //break;
}
}
}
—— —— —— —— —— —— —— —— —— ——
修改密码
void setPassword(void){
int newPwd1 = 0;
int newPwd2 = 0;
while (1) {
bool result = loginATM();//检验密码
if (result == true) {
while (1) {
printf("请输入新密码:");
scanf("%d", &newPwd1);
printf("请确认密码:");
scanf("%d", &newPwd2);
if (newPwd1 == newPwd2) {
printf("设置密码成功!\n");
return;
} else{
printf("两次密码不一致,");
}
}
}
}
}
—————————————————————————————————————————————————————————
五、感想
在之前只用一个函数(主函数)时,程序之间的大括号{}很容易弄混乱。有时候一段程序中连着包着4、5个{},写得时候思路和代码是对的,但是{}位置的改动有时会时程序运行很混乱,导致无法完成调试。所以养成一个良好的敲代码的习惯是很重要的。
在学习了调用函数完成程序后,应尽量用函数编写代码,避免只有一个函数的混乱。要熟练掌握函数,就要多用函数编一些代程序。