c语言的函数实现
学习目的
今天学习c语言中的函数。在上期中,我们学习了C语言基础,认识了条件语句和循环语。但是在完成项目时,给人感觉过程复杂、主函数冗长、阅读困难。针对这一问题C语言引进了函数,通过函数可以进行封装代码,让我们的代码更简洁更易读。
知识点解析
- 为什么要函数:
- 代码结构太复杂,不利于阅读,不利于移植;
- 代码块:一个代码块解决一个问题(一个功能需要一个函数);
- 代码块就是 {}:封装代码,其中不能重复定义。
{
int a = 10;
int a = 20;
}
//是错误的
- 要怎么用:
- 结构:返回值 函数名(参数:形式参数){代码块:局部变量
}
int add(int a, int b)
{
int result = a + b;
return result;
}
函数也可以无参数无返回值
int add(int a, int b)
{
int result = a + b;
return result;
}
//break 跳出循环
//return 结束一个代码块
//无参数
void test() {
if () {
//无返回值
return;
}
else {
}
}
int main(int argc, const char * argv[]) {
//不要返回值
add(1, 2);
//要返回值
int sum=add(1,2)
return 0;
}
2.实现方式:先声明 后实现
//声明
void test(void);
int main(int argc, const char * argv[]) {
test();
//实现
void test()
{
...
}
return 0;}
注意事项
在实现函数时,main函数因注意:
1.代码逻辑结构
2.搭框架,不做具体事情,具体事情给每一个函数去实现
上期课后参考代码
#include <stdlib.h>
int main(int argc, const char * argv[]) {
//保存原始密码
int password = 123;
int inputPwd = 0;
int totalTime = 4;
int totalMoney = 1000;
printf("**************\n");
printf(" 欢迎使用\n");
printf("**************\n");
//一个模块完成一个功能 耦合性降低
printf("请输入密码:");
while (1) {
scanf("%d", &inputPwd);
if (inputPwd == password) {
//密码正确
break;
}else{
totalTime--;
if (totalTime == 0) {
printf("此卡已冻结 请联系客服!\n");
//退出
exit(EXIT_FAILURE);
}else{
printf("密码不正确 请重新输入:");
}
}
}
//密码正确
char choice;
while(1){
printf("**************\n");
printf("1.取款\n");
printf("2.存款\n");
printf("3.设置密码\n");
printf("4.退出\n");
printf("**************\n");
//判断输入是否合法
char ch[20] = {};
while (1) {
//去掉上一次输入的回车符 \n
printf("请选择操作:");
int count = scanf("%s", ch);
if (count != 1) {
printf("输入不合法 ");
} else{
//获取第一个字符
choice = ch[0];
if (choice == '1' || choice == '2' || choice == '3' || choice == '4') {
break;
} else{
printf("输入不合法 ");
}
}
}
//检测到底选择的是什么操作
char choice2;
int newPassword1 = 0;
int newPassword2 = 0;
switch (choice) {
case '1':
//取款
while(1){
int outMoney = 0;
printf("请输入取款金额:");
scanf("%d", &outMoney);
if (outMoney > totalMoney) {
//金额不足
printf("余额不足是否继续(y/n):");
getchar();
choice2 = getchar();
if (choice2 == 'n') {
break;
}
}else{
totalMoney -= outMoney;
printf("取款成功 余额为:%d\n", totalMoney);
break;
}
}
break;
case '2':
printf("请输入存款金额:");
int inputMoney = 0;
scanf("%d", &inputMoney);
totalMoney += inputMoney;
printf("存款成功 余额为:%d\n", totalMoney);
break;
case '3':
while (1) {
printf("请输入新密码:");
scanf("%d", &newPassword1);
printf("请确认密码:");
scanf("%d", &newPassword2);
if (newPassword1 == newPassword2){
password = newPassword1;
printf("更改密码成功\n");
break;
}else{
printf("两次密码不一致 ");
}
}
break;
default:
printf("感谢你的使用 再见!!!\n");
exit(EXIT_SUCCESS);
break;
}
}
return 0;
}
用函数实现上面代码
tps:此处应自己大量练习,反复摸索后,再进行参考。
//多写 多想 设计模式
/*
代码的逻辑结构
搭框架 不做具体的事情 具体的事情给每一个函数去实现
*/
/**
登录
login
params:void
return:bool true成功 false失败
*/
bool loginATM(void);
void welcome(void);
void exitATM(int status);
void showMenu(void);
char getChoice(void);
void withdraw(void);//取款
bool isContinue(void);
void deposit(void);//存款
void setPassword(void);
//定义一个全局变量
int orgPassword = 123;
int totalMoney = 1000;
/*
自己创建一个 头文件.h
.h文件用于函数的声明
实现文件.c 封装操作
.c文件用于实现某个头文件里面的函数
*/
int main(int argc, const char * argv[]) {
//欢迎界面
welcome();
//登录
bool result = loginATM();
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;
}
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("密码错误,");
}
}
}
}
void welcome(void){
printf("***************\n");
printf(" 欢迎使用ATM\n");
printf("***************\n");
}
void exitATM(int status){
printf("*************************\n");
printf(" 感谢你的使用 再见!!!\n");
printf("*************************\n");
exit(status);
}
void showMenu(void){
printf("**************\n");
printf("1.取款\n");
printf("2.存款\n");
printf("3.设置密码\n");
printf("4.退出\n");
printf("**************\n");
}
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("两次密码不一致,");
}
}
}
}
}
自我感悟
今天学习了一天的函数,短短的定义和结构却死的难住了我。在使用函数时不知道什么时候切入函数,不知道怎么定义函数,理解不够深。函数的使用是至关重要的,需要大量的练习,努力奋斗。

0774012413a7acf25541bfeaa2ed866d.jpeg