C语言程序设计学习

C语言程序设计现代方法

第一章,C语言概述

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

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

C语言的优点:

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

缺点

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

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

第一个C程序

#include 

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
#include

int main() {
    // 1.显示菜单
    // 使用do while循环显示菜单,如果用户输入4,表示退出程序
    // 用户输入4退出时,给出提示"你确定要退出吗? y/n",必须输入正确的y/n ,
    //	否则循环输入指令,直到输入y 或者 n
    char key = 'a'; //表示用户输入了那个菜单
    int flag = 1;
    char details[3000] = "************当前收支明细记录***********************\n\n收支:\t金额\t\t余额\t\t备注\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("------欢迎使用家庭记账软件------\n\n");
        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%.2f\t\t%.2f\t\t%s\n\n", 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%.2f\t\t%.2f\t\t%s\n\n", money, balance, note);
                //将信息拼接到details
                strcat(details, temp);
                count = 1;
                break;

            case '4':
                //此处不直接退出,而是让用户再次确认
                printf("你确定要退出吗?y/n\n");
                do {
                    scanf("%c", &choice);
                    getchar();
                    if (choice == YES) {
                        break;
                    } else {
                        printf("你的输入不正确,请输入y/n\n");
                    }
                } while (1);
                if (choice == YES) {
                    flag = 0;
                }
        }
    } while (flag);
    printf("你已经成功退出了家庭财务软件\n");
    return 0;
}

使用结构化后
#include
#include

// 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%.2f\t\t%.2f\t\t%s\n\n", 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%.2f\t\t%.2f\t\t%s\n\n", money, account->balance, note);
    //将信息拼接到details
    strcat(account->details, temp);
    account->flag = 1;
}

//退出
void appExit() {
    //此处不直接退出,而是让用户再次确认
    printf("你确定要退出吗?y/n\n");
    do {
        scanf("%c", &choice);
        getchar();
        if (choice == YES || choice == NO) {
            break;
        }
        printf("你的输入不正确,请输入y/n\n");
    } 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("------欢迎使用家庭记账软件------\n\n");
        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
#include

// 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("%d\t%s\t%c\t%d\t%s\t%s\n", 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年龄\t\t电话\t\t邮箱\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("\n\n\n---------------客户信息管理软件-----------------");
        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, "[email protected]");
    customers[0].gender = 'f';
    indexShow(&customer);
    getchar();
    return 0;
}


你可能感兴趣的:(C)