C 语言编程 — 编程实践
目录
前文列表
《程序编译流程与 GCC 编译器》
《C 语言编程 — 基本语法》
《C 语言编程 — 基本数据类型》
《C 语言编程 — 变量与常量》
《C 语言编程 — 运算符》
《C 语言编程 — 逻辑控制语句》
《C 语言编程 — 函数》
《C 语言编程 — 高级数据类型 — 指针》
《C 语言编程 — 高级数据类型 — 数组》
《C 语言编程 — 高级数据类型 — 字符串》
《C 语言编程 — 高级数据类型 — 枚举》
《C 语言编程 — 高级数据类型 — 结构体与位域》
《C 语言编程 — 高级数据类型 — 共用体》
《C 语言编程 — 高级数据类型 — void 类型》
《C 语言编程 — 数据类型的别名》
《C 语言编程 — 数据类型转换》
《C 语言编程 — 宏定义与预处理器指令》
《C 语言编程 — 异常处理》
《C 语言编程 — 头文件》
《C 语言编程 — 输入/输出与文件操作》
《C 语言编程 — 堆栈内存管理》
《C 语言编程 — 指令行参数》
《C 语言编程 — GDB 调试工具》
《C 语言编程 — 代码规范》
程序示例
键入5个学生的名称、语文成绩、数学成绩和英语成绩,输出各个学生的成绩等级和各科成绩的排名。
#include <stdio.h>
/* 宏定义要在后面注释说明含义 */
#define STUDENT_NUM 5 // 统计总人数
#define SCORE_NUM 3 // 科目总数
/* score 为各科成绩分数.
* score[0] 为语文成绩,
* score[1] 为数学成绩,
* score[2] 为英文成绩.
* grade 为各科成绩的分数等级
* grade[0] 为语文成绩等级,
* grade[1] 为数学成绩等级,
* grade[2] 为英文成绩等级.
* name 为 student name
*/
struct student {
int score[SCORE_NUM];
char grade[SCORE_NUM];
char name[20];
};
/* 定义 student 结构体数组全局变量,数组元素就是结构体本身,作用域是整个程序 */
struct student s_array[STUDENT_NUM];
/* 在文件首部编写函数声明是为了便于阅读 */
void input_message(void);
void printf_grade(struct student *stu_pc);
void bubble_method(int *score_buf, char **stuname_buf);
/*
* Function: 键入每个学生的信息,包括:姓名、语文成绩、数学成绩和英语成绩
* Note:
* 先键入学生名称,再键入语文成绩,再键入数学成绩,最后键入英语成绩
* 信息键入需要注意空格!
*/
void input_message(void) {
int i = 0;
/* 为了可读性,条件表达式中也要重新为 i 进行赋值 */
for (i = 0; i < STUDENT_NUM; i++) {
printf("Enter the num %d student's message:\r\n", i);
/* s_array[i].name 是一个字符串数据类型变量,变量名本身就是一个指针,所以不需要额外使用取地址运算符 & */
scanf("%s %d %d %d", s_array[i].name, &(s_array[i].score[0]), &(s_array[i].score[1]), &(s_array[i].score[2]));
printf_grade(&s_array[i]);
}
}
/* Function: 将单个学生的各科的成绩结果划分等级, 输出各科的成绩等级
* Note:
* [0 , 60) 为 D
* [60, 75) 为 C
* [75, 85) 为 B
* [85, 100] 为 A
* 其余输入值会被认为是错误值,显示 E
*/
void printf_grade(struct student *stu_pc) {
int i = 0;
for (i = 0; i < SCORE_NUM; i++) {
/* 形参 stu_pc 是 student 结构体指针变量,所以使用指针成员访问符 -> */
if ((0 <= stu_pc->score[i]) && (60 > stu_pc->score[i])) {
stu_pc->grade[i] = 'D';
}
else if ((60 <= stu_pc->score[i]) && (75 > stu_pc->score[i])) {
stu_pc->grade[i] = 'C';
}
else if ((75 <= stu_pc->score[i]) && (85 > stu_pc->score[i])) {
stu_pc->grade[i] = 'B';
}
else if ((85 <= stu_pc->score[i]) && (100 >= stu_pc->score[i])) {
stu_pc->grade[i] = 'A';
}
else {
stu_pc->grade[i] = 'E'; // ERROR
}
printf("%c ", stu_pc->grade[i]);
}
printf("\n");
}
/*
* Function: 使用冒泡法,对单科成绩进行排名
* Note:
* 因为字符串指针数组变量的变量名是一个指向指针的指针所以形参使用 char **stuname_buf 类型
*/
void bubble_method(int *score_buf, char **stuname_buf) {
int i = 0;
int j = 0;
int score_temp = 0;
char *stuname_temp = NULL;
for (i = 0; i < STUDENT_NUM; i++) {
for (j = 0; j < STUDENT_NUM - i - 1; j++) {
score_temp = score_buf[j];
stuname_temp = stuname_buf[j];
/* 前后比较学习分数,以此进行排序,同时也对学生名字进行排序 */
if (score_buf[j] > score_buf[j + 1]) {
score_buf[j] = score_buf[j + 1];
stuname_buf[j] = stuname_buf[j + 1];
score_buf[j + 1] = score_temp;
stuname_buf[j + 1] = stuname_temp;
}
}
}
}
int main(void) {
int k = 0;
int i = 0;
int score_temp[STUDENT_NUM]; // 定义整型数组变量,存储学生成绩,用于成绩排序
char *stuname_temp[STUDENT_NUM]; // 定义字符串指针数组变量,存储学生姓名,用于跟踪成绩排序结果
input_message();
for (k = 0; k < SCORE_NUM; k++) {
for (i = 0; i < STUDENT_NUM; i++) {
score_temp[i] = s_array[i].score[k];
/* 字符串指针数组存放字符串的指针(字符串变量名就是一个字符串类型指针) */
stuname_temp[i] = s_array[i].name;
}
bubble_method(score_temp, stuname_temp);
switch (k) {
case 0:
printf("Chinese Ranking:\r\n");
break;
case 1:
printf("ath Ranking:\r\n");
break;
case 2:
printf("English Ranking:\r\n");
break;
default:
printf("Error\r\n");
}
for (i = STUDENT_NUM - 1; i >= 0; i--) {
printf("Num %d is %s, score = %d\r\n", STUDENT_NUM - i, stuname_temp[i], score_temp[i]);
}
}
return 0;
}
运行:
$ ./main
Enter the num 0 student's message:
Astu 90 90 90
A A A
Enter the num 1 student's message:
Bstu 80 80 80
B B B
Enter the num 2 student's message:
Cstu 70 70 70
C C C
Enter the num 3 student's message:
Dstu 60 60 60
C C C
Enter the num 4 student's message:
Estu 50 50 50
D D D
Chinese Ranking:
Num 1 is Astu, score = 90
Num 2 is Bstu, score = 80
Num 3 is Cstu, score = 70
Num 4 is Dstu, score = 60
Num 5 is Estu, score = 50
ath Ranking:
Num 1 is Astu, score = 90
Num 2 is Bstu, score = 80
Num 3 is Cstu, score = 70
Num 4 is Dstu, score = 60
Num 5 is Estu, score = 50
English Ranking:
Num 1 is Astu, score = 90
Num 2 is Bstu, score = 80
Num 3 is Cstu, score = 70
Num 4 is Dstu, score = 60
Num 5 is Estu, score = 50

- 为追求更快的执行速度和效率,示例中的 printf_grade 和 bubble_method 函数都使用指针作为传参。相对于将整个数组变量拷贝到函数,采用指针作为传参的执行速度更快、效率更高。
- 示例中的 input_message、printf_grade 和 bubble_method 函数的类型均是空类型,这意味着这 3 个函数均是没有返回值。其中,input_message 的传参为 void,也就是说 input_message 是不需要传入参数。
C 语言编程 — 编程实践的更多相关文章
- Java 网络编程最佳实践(转载)
http://yihongwei.com/2015/09/remoting-practice/ Java 网络编程最佳实践 Sep 10, 2015 | [Java, Network] 1. 通信层 ...
- 实验5 Spark SQL编程初级实践
今天做实验[Spark SQL 编程初级实践],虽然网上有答案,但都是用scala语言写的,于是我用java语言重写实现一下. 1 .Spark SQL 基本操作将下列 JSON 格式数据复制到 Li ...
- 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
2007年诞生的Go语言,凭借其近C的执行性能和近解析型语言的开发效率,以及近乎完美的编译速度,席卷全球.Go语言相关书籍也如雨后春笋般涌现,前不久,一本名为<Go语言并发之道>的书籍被翻 ...
- 11. Go 语言网络编程
Go 语言网络编程 Go语言在编写 web 应用方面非常得力.因为目前它还没有 GUI(Graphic User Interface 图形化用户界面)的框架,通过文本或者模板展现的 html 界面是目 ...
- [04] C# Alloc Free编程之实践
C# Alloc Free编程之实践 上一篇说了Alloc Free编程的基本理论. 这篇文章就说怎么具体做实践. 常识 之所以说是常识, 那是因为我们在学任何一门语言的时候, 都能在各种书上看到各种 ...
- 【C语言C++编程入门】——编译机制和语言标准!
编程机制 编写程序时必须遵循确切步骤主要是取决于你的计算机环境.因为 C语言是可以移植的,所以它在许多环境中可用,其中包括 UNIX,Linux,Windows等等 . 不过,让我们首先来看一看许多环 ...
- 实验 2 Scala 编程初级实践
实验 2 Scala 编程初级实践 一.实验目的 1.掌握 Scala 语言的基本语法.数据结构和控制结构: 2.掌握面向对象编程的基础知识,能够编写自定义类和特质: 3.掌握函数式编程的基础知识,能 ...
- 【转载】ANSYS的APDL与C语言混合编程(实例)
原文地址:http://www.cnblogs.com/lyq105/archive/2010/05/04/1727557.html 本文讨论的不是利用C语言为ANSYS写扩展(或者说是用户子程序), ...
- [收藏转贴]struct探索·extern "C"含义探索 ·C++与C的混合编程·C 语言高效编程的几招
一.C/C++语言 struct深层探索 1.自然对界 struct是一种复合数据类型,其构成元素既可以是基本数据类型(如 int.long.float等)的变量,也可以是一些复合数据类型(如 arr ...
- JS编程最佳实践
最近花了一周时间把<编写可维护的js> 阅读了一遍, 现将全书提到的JS编程最佳实践总结如下, 已追来者! 1.return 之后不可直接换行, 否则会导致ASI(自动分号插入机制)会在r ...
随机推荐
- [UAC]C++判断某进程是否有管理员权限
BOOL IsAdminProcess(UINT PID) { if (PID <= 0) PID = GetCurrentProcessId(); HANDLE hProcess = Open ...
- Docker 14 Docker Compose
概述 使用 Docker 的时候,定义 Dockerfile 文件,然后使用 docker build.docker run 等命令操作容器. 然而微服务架构的应用系统一般包含若干个微服务,每个微服务 ...
- Taurus.MVC 性能压力测试(ap 压测 和 linux 下wrk 压测):.NET Core 版本
前言: 最近的 Taurus.MVC 版本,对性能这一块有了不少优化,因此准备进行一下压测,来测试并记录一下 Taurus.MVC 框架的性能,以便后续持续优化改进. 今天先压测 .NET Core ...
- MogDB/openGauss访问控制简介
MogDB/openGauss 访问控制简介 SQL 可以针对不同的数据库对象赋予不同的权限,这样就可以限制用户对数据的不必要访问,提高数据访问的安全性.常见的 SQL 权限如下: SELECT/UP ...
- 美团一面,面试官让介绍AQS原理并手写一个同步器,直接凉了
写在开头 今天在牛客上看到了一个帖子,一个网友吐槽美团一面上来就让手撕同步器,没整出来,结果面试直接凉凉. 就此联想到一周前写的一篇关于AQS知识点解析的博文,当时也曾埋下伏笔说后面会根据AQS的原理 ...
- Native Rawfile开发指导
场景介绍 开发者可以通过本指导了解在HarmonyOS应用中,如何使用Native Rawfile接口操作Rawfile目录和文件.功能包括遍历.打开.搜索.读取和关闭Rawfile. 接口说明 ...
- ArkUI,更高效的框架设计
原文:https://mp.weixin.qq.com/s/uSIzuBby7Z92drNDmejKXw,点击链接查看更多技术内容. 上期文章我们讲到了ArkUI的三大特性,同时提到了Ark ...
- sql 语句系列(字符串之父与子之间)[八百章之第十二章]
前言 介绍字符串和其子字符串直接的使用. 判断含有子字母的字符串 select * from emp 在mysql中: select emp.ename from emp where emp.enam ...
- linux ssh连接
前言 整理以前的随笔. 正文 首先更新源 sudo apt-get update 安装ssh服务 sudo apt-get install openssh-server 检测是否已启动 ps -e | ...
- 浏览器端实现类似input限制输入两位小数,输入时光标从输入位置移动到最后
1.问题描述展示 示例代码所做限制为不允许输入字母d,其他限制规则可以根据需求自己调整,使用React编写,其他框架或原生均可根据该代码理解原理进行转变,特意使用了中文键盘可以看到输入框下面白色框闪出 ...