一、目的
利用函數(shù)將程序分為多個模塊,使主函數(shù)看上去更簡潔明了,而每個模塊行使自己的功能,方便以后寫類似程序直接拿來調(diào)用。減少了只有一個(主)函數(shù)時代碼又較多的臃腫性,方便檢查和修改。
二、技術(shù)
將主函數(shù)中的一些代碼打包成函數(shù)(最好能凸顯每個函數(shù)的目的和盡量一個函數(shù)實現(xiàn)一個重要功能),通過調(diào)用函數(shù)來優(yōu)化代碼。C語言中函數(shù)分為主函數(shù)、被調(diào)用函數(shù)、庫函數(shù)等等(不同分類的標準不同)。主函數(shù)(main函數(shù))程序運行的主體,一般一個C語言程序只有一個主函數(shù)。被調(diào)用函數(shù)是在主函數(shù)中調(diào)用的、又在主函數(shù)外聲明編寫的函數(shù)。庫函數(shù)是預先編好的一些函數(shù),使得在主函數(shù)中可以直接使用某些關(guān)鍵字而不用再另外編輯被調(diào)用函數(shù)。
三、每個技術(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;}完成對兩個整型a,b數(shù)值的交換
void helloWorld(){printf("Hello World!");}輸出Hello World!
庫函數(shù):例如#include“stdio.h”(""表示編譯器會首先從自己的工程里面去查找這個頭文件 如果沒有,那么會從系統(tǒng)庫里面去查找)
#include<stdlib.h>(<> 表示編譯器會首先從系統(tǒng)庫里面去查找這個頭文件 如果沒有,那么會從當前工程里面去查找)
#include<iostream>
上面三個使系統(tǒng)默認的三個庫函數(shù),也可以自己編寫一個庫函數(shù)來使用。
四、實際使用
用函數(shù)實現(xiàn)ATM程序
——————————————————————————————————————————————————————————
要實現(xiàn)的功能:
* * *****
?歡迎光臨
?* * *****
?請輸入密碼:123
錯誤-> 密碼錯誤請重新輸入: 最多輸入4 -> 此卡已凍結(jié) 請聯(lián)系客服 -> 退出
正確-> 1.取款 請輸入取款金額:200-> 取款成功 當前余額為20
->余額不足 是否繼續(xù)Y/N
2.存款 請輸入金額:2000 -> 存款成功 當前余額:3000!
3.更改密碼 請輸入原始密碼->請設(shè)置密碼->請確認密碼
4.退出 請選擇操作: 用函數(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);//對ATM菜單做出選擇選擇
void withdraw(void);//取款
bool isContinue(void);//余額不足時的兩個選擇
void deposit(void);//存款
void setPassword(void);//修改密碼
—————————————————————————————————————————————————————————
—— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? ——
定義的兩個全局變量
int orgPassword = 123;//密碼
int totalMoney = 1000;//初始余額
—— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? ——
——————————————————————————————————————————————————————————
主函數(shù)
int main(int argc, const char * argv[]) {
? ? welcome();//歡迎界面
? ? bool result = loginATM();//bool類型判定密碼輸入的對錯
? ? if (result == false)?
? ? ? ? exitATM(EXIT_FAILURE);//輸入錯誤過多直接結(jié)束程序
? ? }
? ? 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;
}
—————————————————————————————————————————————————————————
被調(diào)用函數(shù)
—— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? ——
密碼登錄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.設(shè)置密碼\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();?//提示是否繼續(xù)
? ? ? ? ? ? if (ch == false) {
? ? ? ? ? ? ? ? return; //break;
? ? ? ? ? ? }
? ? ? ? }else{
? ? ? ? ? ? printf("余額不足,");
? ? ? ? }
? ? }
}
—— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? —— ? ? ——
余額不足時的兩個選擇
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("請輸入存款金額:");
? ? ? ? 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("設(shè)置密碼成功!\n");
? ? ? ? ? ? ? ? ? ? return;
? ? ? ? ? ? ? ? } else{
? ? ? ? ? ? ? ? ? ? printf("兩次密碼不一致,");
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
—————————————————————————————————————————————————————————
五、感想
? 在之前只用一個函數(shù)(主函數(shù))時,程序之間的大括號{}很容易弄混亂。有時候一段程序中連著包著4、5個{},寫得時候思路和代碼是對的,但是{}位置的改動有時會時程序運行很混亂,導致無法完成調(diào)試。所以養(yǎng)成一個良好的敲代碼的習慣是很重要的。
在學習了調(diào)用函數(shù)完成程序后,應(yīng)盡量用函數(shù)編寫代碼,避免只有一個函數(shù)的混亂。要熟練掌握函數(shù),就要多用函數(shù)編一些代程序。