一昌犹、目的
利用函數(shù)將程序分為多個(gè)模塊,使主函數(shù)看上去更簡(jiǎn)潔明了屉佳,而每個(gè)模塊行使自己的功能来破,方便以后寫(xiě)類似程序直接拿來(lái)調(diào)用。減少了只有一個(gè)(主)函數(shù)時(shí)代碼又較多的臃腫性忘古,方便檢查和修改。
二诅诱、技術(shù)
將主函數(shù)中的一些代碼打包成函數(shù)(最好能凸顯每個(gè)函數(shù)的目的和盡量一個(gè)函數(shù)實(shí)現(xiàn)一個(gè)重要功能)髓堪,通過(guò)調(diào)用函數(shù)來(lái)優(yōu)化代碼。C語(yǔ)言中函數(shù)分為主函數(shù)、被調(diào)用函數(shù)干旁、庫(kù)函數(shù)等等(不同分類的標(biāo)準(zhǔn)不同)驶沼。主函數(shù)(main函數(shù))程序運(yùn)行的主體,一般一個(gè)C語(yǔ)言程序只有一個(gè)主函數(shù)争群。被調(diào)用函數(shù)是在主函數(shù)中調(diào)用的回怜、又在主函數(shù)外聲明編寫(xiě)的函數(shù)。庫(kù)函數(shù)是預(yù)先編好的一些函數(shù)换薄,使得在主函數(shù)中可以直接使用某些關(guān)鍵字而不用再另外編輯被調(diào)用函數(shù)玉雾。
三、每個(gè)技術(shù)如何使用
主函數(shù):例如int main(){} ?
?? ? ? ? ? ? ?void main(){} ? ? ? ? ? ??
?int main(int argc, const char * argv[]) {} ? ? ? ? ? ? ?
int main(int argc, const char ** argv[]) {}
被調(diào)用函數(shù):例如int swap(int a,int b){int a,b,c;c=a;a=b;b=c;}完成對(duì)兩個(gè)整型a,b數(shù)值的交換
void helloWorld(){printf("Hello World!");}輸出Hello World!
庫(kù)函數(shù):例如#include“stdio.h”(""表示編譯器會(huì)首先從自己的工程里面去查找這個(gè)頭文件 如果沒(méi)有轻要,那么會(huì)從系統(tǒng)庫(kù)里面去查找)
#include<stdlib.h>(<> 表示編譯器會(huì)首先從系統(tǒng)庫(kù)里面去查找這個(gè)頭文件 如果沒(méi)有复旬,那么會(huì)從當(dāng)前工程里面去查找)
#include<iostream>
上面三個(gè)使系統(tǒng)默認(rèn)的三個(gè)庫(kù)函數(shù),也可以自己編寫(xiě)一個(gè)庫(kù)函數(shù)來(lái)使用冲泥。
四驹碍、實(shí)際使用
用函數(shù)實(shí)現(xiàn)ATM程序
——————————————————————————————————————————————————————————
要實(shí)現(xiàn)的功能:
* * *****
?歡迎光臨
?* * *****
?請(qǐng)輸入密碼:123
錯(cuò)誤-> 密碼錯(cuò)誤請(qǐng)重新輸入: 最多輸入4 -> 此卡已凍結(jié) 請(qǐng)聯(lián)系客服 -> 退出
正確-> 1.取款 請(qǐng)輸入取款金額:200-> 取款成功 當(dāng)前余額為20
->余額不足 是否繼續(xù)Y/N
2.存款 請(qǐng)輸入金額:2000 -> 存款成功 當(dāng)前余額:3000!
3.更改密碼 請(qǐng)輸入原始密碼->請(qǐng)?jiān)O(shè)置密碼->請(qǐng)確認(rèn)密碼
4.退出 請(qǐng)選擇操作: 用函數(shù)實(shí)現(xiàn)
—————————————————————————————————————————————————————————
聲明的被調(diào)用函數(shù)
bool loginATM(void);//密碼登錄ATM
void welcome(void);//ATM歡迎界面
void exitATM(int status);//退出界面
void showMenu(void);//ATM菜單界面
char getChoice(void);//對(duì)ATM菜單做出選擇選擇
void withdraw(void);//取款
bool isContinue(void);//余額不足時(shí)的兩個(gè)選擇
void deposit(void);//存款
void setPassword(void);//修改密碼
—————————————————————————————————————————————————————————
—— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? ——
定義的兩個(gè)全局變量
int orgPassword = 123;//密碼
int totalMoney = 1000;//初始余額
—— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? ——
——————————————————————————————————————————————————————————
主函數(shù)
int main(int argc, const char * argv[]) {
? ? welcome();//歡迎界面
? ? bool result = loginATM();//bool類型判定密碼輸入的對(duì)錯(cuò)
? ? if (result == false)?
? ? ? ? exitATM(EXIT_FAILURE);//輸入錯(cuò)誤過(guò)多直接結(jié)束程序
? ? }
? ? while (1) {
? ? ? ? showMenu()凡恍;//密碼正確時(shí)顯示菜單
? char choice = getChoice();//用戶的選擇
? ? ? ? switch(choice){
? ? ? ? ? ? case '1':
? ? ? ? ? ? ? ? withdraw();//存款
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case‘2’:
? ? ? ? ? ? ? ? deposit();//取款
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case '3':
? ? ? ? ? ? ? ? setPassword();//修改密碼
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? default:
? ? ? ? ? ? ? ? exitATM(EXIT_SUCCESS);//退出程序
? ? ? ? ? ? ? ? break;
? ? ? ? }
? ? }
? ? return 0;
}
—————————————————————————————————————————————————————————
被調(diào)用函數(shù)
—— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? ——
密碼登錄ATM
bool loginATM(void){
? ? int password = 0;
? ? int wrongTime = 0;
? ? while(1){
? ? ? ? printf("請(qǐng)輸入密碼:");
? ? ? ? scanf("%d", &password);
? ? ? ? if (password == orgPassword) {
? ? ? ? ? ? return true;
? ? ? ? }else{
? ? ? ? ? ? wrongTime++;
? ? ? ? ? ? if (wrongTime == 4) {
? ? ? ? ? ? ? ? return false;
? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? printf("密碼錯(cuò)誤,");
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
—— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? ——
ATM歡迎界面
void welcome(void){
? ? printf("***************\n");
? ? printf("? 歡迎使用ATM\n");
? ? printf("***************\n");
}
—— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? ——
退出界面
void exitATM(int status){
? ? printf("*************************\n");
? ? printf("? 感謝你的使用 再見(jiàn)V就骸!嚼酝!\n");
? ? printf("*************************\n");
? ? exit(status);
}
—— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? ——
ATM菜單界面
void showMenu(void){
? ? printf("**************\n");
? ? printf("1.取款\n");
? ? printf("2.存款\n");
? ? printf("3.設(shè)置密碼\n");
? ? printf("4.退出\n");
? ? printf("**************\n");
}
—— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? ——
對(duì)ATM菜單做出選擇選擇
char getChoice(void){?//將輸入的所有字符串全部從緩存里面讀取出來(lái)
? ? char temp[20] = {};
? ? while (1) {
? ? ? ? printf("請(qǐng)選擇操作:");
? ? ? ? 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("請(qǐng)輸入取款金額:");
? ? ? ? scanf("%d", &outMoney);
? ? ? ? if(outMoney > 0 && outMoney <= totalMoney){
? ? ? ? ? ? totalMoney = totalMoney - outMoney;
? ? ? ? ? ? printf("取款成功 余額為:%d\n", totalMoney)浮还;
? ? ? ? ? ? bool ch = isContinue();?//提示是否繼續(xù)
? ? ? ? ? ? if (ch == false) {
? ? ? ? ? ? ? ? return; //break;
? ? ? ? ? ? }
? ? ? ? }else{
? ? ? ? ? ? printf("余額不足,");
? ? ? ? }
? ? }
}
—— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? ——
余額不足時(shí)的兩個(gè)選擇
bool isContinue(void){
? ? printf("是否繼續(xù)?(y/n):");
? ? getchar();
? ? char ch = getchar();
? ? if (ch == 'n') {
? ? ? ? return false;
? ? }else{
? ? ? ? return true;
? ? }
}
—— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? ——
存款
void deposit(void){
? ? int intputMoney = 0;
? ? while (1) {
? ? ? ? printf("請(qǐng)輸入存款金額:");
? ? ? ? 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();//檢驗(yàn)密碼
? ? ? ? if (result == true) {
? ? ? ? ? ? while (1) {
? ? ? ? ? ? ? ? printf("請(qǐng)輸入新密碼:");
? ? ? ? ? ? ? ? scanf("%d", &newPwd1);
? ? ? ? ? ? ? ? printf("請(qǐng)確認(rèn)密碼:");
? ? ? ? ? ? ? ? scanf("%d", &newPwd2);
? ? ? ? ? ? ? ? if (newPwd1 == newPwd2) {
? ? ? ? ? ? ? ? ? ? printf("設(shè)置密碼成功!\n");
? ? ? ? ? ? ? ? ? ? return;
? ? ? ? ? ? ? ? } else{
? ? ? ? ? ? ? ? ? ? printf("兩次密碼不一致,");
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
—————————————————————————————————————————————————————————
五、感想
? 在之前只用一個(gè)函數(shù)(主函數(shù))時(shí)革半,程序之間的大括號(hào){}很容易弄混亂碑定。有時(shí)候一段程序中連著包著4、5個(gè){}又官,寫(xiě)得時(shí)候思路和代碼是對(duì)的延刘,但是{}位置的改動(dòng)有時(shí)會(huì)時(shí)程序運(yùn)行很混亂,導(dǎo)致無(wú)法完成調(diào)試六敬。所以養(yǎng)成一個(gè)良好的敲代碼的習(xí)慣是很重要的碘赖。
在學(xué)習(xí)了調(diào)用函數(shù)完成程序后,應(yīng)盡量用函數(shù)編寫(xiě)代碼外构,避免只有一個(gè)函數(shù)的混亂普泡。要熟練掌握函數(shù),就要多用函數(shù)編一些代程序审编。