c语言 连续数据后不退出程序_C语言程序设计学习

13938057bfb850c65b35fd5b834244b1.png

C语言程序设计现代方法

第一章,C语言概述

什么是C语言?他是20世界70年代初期在贝尔实验室开发出来的一种广为使用的编程语言。

1983年美国国家标准(ANSI)制定了本国C语言标准,1989标准化C语言,俗称C89,1999年ISO标准化了增加新特性,C99正式出现。

C语言的优点:

  • 高效,与生俱来的特性
  • 可移植性(代码层面)
  • 功能强大,拥有一个庞大的数据类型和运算符集合
  • 灵活

缺点

  • 更容易隐藏错误,只有运行时才能检查到大多数错误

第二章,C语言的基本概念

第一个C程序

 #include <stdio.h>
 ​
 int main() {
 ​
     int amount;
 ​
     int price;
 ​
     printf("请输入2个数---");
 ​
     scanf_s("%d %d", &amount, &price);
 ​
     printf("%d + %d = %d", amount, price, amount + price);
     return 0; //表示程序正常终止,向系统返回0
 }
 ​

对于上面代码,要转化为机器可以执行的形式,通常包含以下3个步骤:

  1. 预处理,首先程序会被送交给预处理器(preprocessor)。预处理器执行以#开头的命令(通常称为指令)。预处理器有点类似于编辑器,它可以给程序添加内容,也可以对程序进修改。
  2. 编译,修改后的程序现在可以进入编译器(compiler) 了。编译器会把程序翻译成机器指令。
  3. 链接,在最后一个步骤中,链接器( linker)把由编译器产生的目标代码和所需的其他附加代码整合在一起,这样才最终产生了完全可执行的程序。这些附加代码包括程序中用用到的库函数(如:printf)。

即使最简单的C语言程序也包含3个关建的语言特性

  1. 指令,所有指令都是以字符#开始的。这个字符可以把C程序中的指令和其他代码区分开来。指令默认只占一行,每条指令的结尾没有分号或其他特殊标记。
  2. 语句
  3. 函数

小案例

第一步:

 #include<stdio.h>
 #include<string.h>
 ​
 int main() {
     // 1.显示菜单
     // 使用do while循环显示菜单,如果用户输入4,表示退出程序
     // 用户输入4退出时,给出提示"你确定要退出吗? y/n",必须输入正确的y/n ,
     //  否则循环输入指令,直到输入y 或者 n
     char key = 'a'; //表示用户输入了那个菜单
     int flag = 1;
     char details[3000] = "************当前收支明细记录***********************nn收支:t金额tt余额tt备注n";
     char note[100] = "";
     char temp[300] = "";
     double money = 0.0;
     double balance = 1000.0;
     const char YES = 'y';
     char choice = 'a'; //随便放的初始值
     int count = 0;
     do {
         printf("------欢迎使用家庭记账软件------nn");
         printf("t1.收支明细n");
         printf("t2.登记收入n");
         printf("t3.登记支出n");
         printf("t4.退   出n");
 ​
         printf("请选择1-4:");
         scanf("%c", &key);
         getchar();//过滤回车
         switch (key) {
             case '1':
                 if (count) {
                     printf("%s", details);
                 } else {
                     printf("你还没有添加收支明细哦,去添加一笔吧n");
                 }
                 break;
 ​
             case '2':
                 printf("本次收入金额:");
                 scanf("%lf", &money);
                 getchar();
                 balance += money;//更新余额
                 printf("本次收入说明:");
                 scanf("%s", &note);
                 getchar();
                 sprintf(temp, "n收入t%.2ftt%.2ftt%snn", money, balance, note);
                 //将信息拼接到details
                 strcat(details, temp);
                 count = 1;
                 break;
 ​
             case '3':
                 printf("本次支出金额:");
                 scanf("%lf", &money);
                 getchar();
                 // 当用户消费的金额大于余额时,提醒用户余额不足
                 if (balance - money < 0) {
                     printf("余额不足~~n");
                     break;
                 }
                 balance -= money;//更新余额
                 printf("本次支出说明:");
                 scanf("%s", &note);
                 getchar();
                 sprintf(temp, "n支出t%.2ftt%.2ftt%snn", money, balance, note);
                 //将信息拼接到details
                 strcat(details, temp);
                 count = 1;
                 break;
 ​
             case '4':
                 //此处不直接退出,而是让用户再次确认
                 printf("你确定要退出吗?y/nn");
                 do {
                     scanf("%c", &choice);
                     getchar();
                     if (choice == YES) {
                         break;
                     } else {
                         printf("你的输入不正确,请输入y/nn");
                     }
                 } while (1);
                 if (choice == YES) {
                     flag = 0;
                 }
         }
     } while (flag);
     printf("你已经成功退出了家庭财务软件n");
     return 0;
 }
 ​

使用结构化后

 #include<stdio.h>
 #include<string.h>
 ​
 // Created by poplar on 2020/5/4 模块化编程
 // 1.显示菜单
 // 使用do while循环显示菜单,如果用户输入4,表示退出程序
 // 用户输入4退出时,给出提示"你确定要退出吗? y/n",必须输入正确的y/n ,
 //  否则循环输入指令,直到输入y 或者 n
 char key = 'a'; //表示用户输入了那个菜单
 char temp[300] = "";
 char note[300] = "";
 double money = 0.0;
 const char YES = 'y';
 const char NO = 'n';
 char choice = 'a'; //随便放的初始值
 int loop = 1;
 ​
 //结构体AccountApplication,使用typedef定义结构体
 typedef struct AccountApplication {
     char details[3000]; //存放账目信息
     double balance; //余额
     int flag;
 } Account;
 ​
 //支出
 void pay(Account *account) {
     printf("本次支出金额:");
     scanf("%lf", &money);
     getchar();
     // 当用户消费的金额大于余额时,提醒用户余额不足
     if (account->balance - money < 0) {
         printf("余额不足~~n");
         return;
     }
     account->balance -= money;//更新余额
     printf("本次支出说明:");
     scanf("%s", &note);
     getchar();
     sprintf(temp, "n支出t%.2ftt%.2ftt%snn", money, account->balance, note);
     //将信息拼接到details
     strcat(account->details, temp);
     account->flag = 1;
 }
 ​
 //收入
 void income(Account *account) {
     printf("本次收入金额:");
     scanf("%lf", &money);
     getchar();
     account->balance += money;//更新余额
     printf("本次收入说明:");
     scanf("%s", &note);
     getchar();
     sprintf(temp, "n收入t%.2ftt%.2ftt%snn", money, account->balance, note);
     //将信息拼接到details
     strcat(account->details, temp);
     account->flag = 1;
 }
 ​
 //退出
 void appExit() {
     //此处不直接退出,而是让用户再次确认
     printf("你确定要退出吗?y/nn");
     do {
         scanf("%c", &choice);
         getchar();
         if (choice == YES || choice == NO) {
             break;
         }
         printf("你的输入不正确,请输入y/nn");
     } while (1);
     if (choice == YES) {
         loop = 0;
     }
 }
 ​
 void show(Account *account) {
     if (account->flag) {
         //第一种方式
         //printf("%s", (*account).details);
         printf("%s", account->details);
     } else {
         printf("你还没有添加收支明细哦,去添加一笔吧n");
     }
 }
 ​
 void menu_show(Account *account) {
     do {
         printf("------欢迎使用家庭记账软件------nn");
         printf("t1.收支明细n");
         printf("t2.登记收入n");
         printf("t3.登记支出n");
         printf("t4.退   出n");
 ​
         printf("请选择1-4:");
         scanf("%c", &key);
         getchar();//过滤回车
         switch (key) {
             case '1':
                 show(account);
                 break;
 ​
             case '2':
                 income(account);
                 break;
 ​
             case '3':
                 pay(account);
                 break;
 ​
             case '4':
                 appExit();
                 break;
         }
     } while (loop);
     printf("你已经成功退出了家庭财务软件n");
 }
 ​
 ​
 int main() {
     Account account;
     //初始化结构体数据
     account.balance = 1000.0;
     account.flag = 0;
     //使用拷贝的方式赋值
     memset(account.details, 3000, 0);
     strcpy(account.details, "----*----*---*----当前收支明细记录--*----*----*---n收支t收支金额t账户金额 t说  明");
     //结构体和数组不一样,只能传值,传指针需要加&
     menu_show(&account);
     getchar();
     return 0;
 }
 ​

CRM系统

 #include<stdio.h>
 #include<string.h>
 ​
 // Created by poplar on 2020/5/4.
 // CRM系统
 //客户信息的增删改查
 char key; //表示用户输入了那个菜单
 int loop = 1;
 int customersLength = 1;
 char choice;
 ​
 //定义结构体Customer
 typedef struct Customer {
     int id; //编号
     int age; //年龄
     char name[10]; //名字
     char gender; // 'f' 女  'm' 男
     char phone[16]; //电话号码
     char email[20]; //邮箱
 } Customer;
 ​
 //定义一个专门用来显示某个客户信息的函数,使用指针操作,提高效率
 void showCustomerDetail(Customer *customer) {
     printf("%dt%st%ct%dt%st%sn", customer->id, customer->name, customer->gender, customer->age, customer->phone,
            customer->email);
 }
 ​
 //定义一个Customer结构体数组
 struct Customer customers[100];
 ​
 //显示客户列表
 void showCustomerList() {
     printf("---------------------------客户列表---------------------------");
     printf("n编号t姓名t性别t年龄tt电话tt邮箱n");
     for (int i = 0; i < customersLength; i++) { //表示客户的编号
         showCustomerDetail(&customers[i]);
     }
 }
 ​
 //添加用户
 void addCustomer() {
     customers[customersLength].id = customersLength + 1;//编号按照自增规则
     printf("n---------------------添加客户---------------------");
     printf("n姓名:");
     scanf("%s", customers[customersLength].name);
     getchar();
     printf("n性别:");
     scanf("%c", &(customers[customersLength].gender));
     getchar();
     printf("n年龄:");
     scanf("%d", &(customers[customersLength].age));
     getchar();
     printf("n电话:");
     scanf("%s", customers[customersLength].phone);
     getchar();
     printf("n邮箱:");
     scanf("%s", customers[customersLength].email);
     getchar();
     printf("n---------------------添加完成---------------------");
     customersLength++; // 自增,必须
 }
 ​
 //根据id查找在数组中对应的下标
 int findIndex(int id) {
     int index = -1;
     for (int i = 0; i < customersLength; i++) {
         if (id == customers[i].id) {
             index = i;
         }
     }
     return index;
 }
 ​
 //删除id客服
 int deleteCustomer(int id) {
     int index = findIndex(id);
     if (index == -1) {
         return 0;
     } else {
         for (int i = index + 1; i < customersLength; i++) {
             customers[i - 1] = customers[i];
         }
         customersLength--;
         return 1;
     }
 }
 ​
 //显示删除客户界面
 void deleteView() {
     int id = 0;
     char choice = ' ';
     printf("n---------------------删除客户---------------------");
     printf("n请选择待删除客户编号(-1退出):");
     scanf("%d", &id);
     getchar();
     if (id == -1) {
         printf("n---------------------你放弃删除了---------------------");
         return;
     }
 ​
     printf("n确认是否删除(Y/N):");
     scanf("%c", &choice);
     getchar();
 ​
     if (choice == 'Y') {
         if (!deleteCustomer(id)) {
             printf("n---------------------删除失败,id不存在---------------------");
         } else {
             printf("n---------------------删除成功!!---------------------");
         }
     }
 }
 ​
 //退出
 void appExit() {
     do {
         //此处不直接退出,而是让用户再次确认
         printf("你确定要退出吗?Y/N:");
         scanf("%c", &choice);
         getchar();
     } while (choice != 'Y' && choice != 'N');
     if (choice == 'Y') {
         loop = 0;
     }
 }
 ​
 //首页,主界面
 void indexShow(Customer *customer) {
     do {
 ​
         printf("nnn---------------客户信息管理软件-----------------");
         printf("n               1 添 加 客 户");
         printf("n               2 修 改 客 户");
         printf("n               3 删 除 客 户");
         printf("n               4 客 户 列 表");
         printf("n               5 退      出n");
         printf("n请选择(1-5):");
         scanf("%c", &key);
         getchar(); //过滤回车
 ​
         switch (key) {
             case '1':
                 addCustomer();
                 break;
             case '2':
                 printf("修 改 客 户");
                 break;
             case '3':
                 deleteView();
                 showCustomerList();
                 break;
             case '4':
                 showCustomerList();
                 break;
             case '5':
                 appExit();
                 break;
             default :
                 printf("n 你输入有误, 请重新输入...");
                 break;
         }
     } while (loop);
 ​
     printf("n 你成功退出了猫咪管理系统");
     getchar();
 }
 ​
 //主方法
 int main() {
     Customer customer;
     //初始化customers
     customers[0].id = 1;
     customers[0].age = 12;
     strcpy(customers[0].name, "猫花");
     strcpy(customers[0].phone, "18900908989");
     strcpy(customers[0].email, "18900908989@qq.com");
     customers[0].gender = 'f';
     indexShow(&customer);
     getchar();
     return 0;
 }
 ​
 ​
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值