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 ...
随机推荐
- #矩阵乘法#洛谷 5343 【XR-1】分块
题目 分析 考虑dp,\(dp[i]=\sum dp[i-j]\) 既然\(j\)很小,那么这显然可以用矩阵乘法优化 代码 #include <cstdio> #include <c ...
- OpenHarmony创新赛|赋能直播第四期
开放原子开源大赛OpenHarmony创新赛进入了中期评审环节,为了解决开发者痛点,本期以三方库移植.MQTT移植案例.开发工具介绍的3节系列技术课程,帮助开发者提升开发效率,为作品的创新能力奠定坚 ...
- OpenHarmony Liteos_A内核之iperf3移植心得
一.iperf3工作原理 iperf3主要的功能是测试基于特定路径的带宽,在客户端和服务器端建立连接(三次握手)后,客户端发送一定大小的数据报并记下发送的时间,或者客户端在一定的时间内发送数据并记下发 ...
- 【FAQ】用户访问次数不变,访问时长却突增2倍,分析服务发生数据异常该如何解决?
在产品运营的工作过程中,需要每日关注产品的核心指标变化情况,监控其整体运营状况.华为分析服务提供查看吸引新用户卡片,该卡片展示了新增用户数.人均会话次数.人均访问时长.人均页面访问数.借助该页面运营可 ...
- Qt 实现涂鸦板一:简易涂鸦板
新建一个Qt项目,在 .h 文件中写入 #pragma once #include <QtWidgets/QWidget> #include "ui_xuexi.h" ...
- 收藏 | 超详细的Oracle19c安装步骤-CentOS Linux
ORACLE学习-DBA数据库工程师 收藏 | 超详细的Oracle19c安装步骤 挨踢-IT人加油 [微思网络]IT培训-思科/华为/红帽/ORACLE... 2 人赞同了该文章 DBA数据库管理必 ...
- 重新整理.net core 计1400篇[八] (.net core 中的依赖注入的深入理解)
生命周期策略 在实例Transient 和 Scoped 中,所以实现Idisposable 接口的服务实例会被当前IServiceProvider 对象保存起来,当IService 对象的Dispo ...
- eclipse 卡顿的优化办法
1. 关闭校验 2. 关闭插件自动升级 3.关闭界面设置的一些选项
- kubernetes集群最新版安装
原文地址:https://haiyux.cc/2022/09/21/k8s-install/ 虚拟机准备 我这里准备了三台虚拟机,分别部署一个master和两个node,操作系统位ubuntu 20. ...
- 力扣626(MySQL)-换座位(中等)
题目: 表: Seat 编写SQL查询来交换每两个连续的学生的座位号.如果学生的数量是奇数,则最后一个学生的id不交换. 按 id 升序 返回结果表. 查询结果格式如下所示. 示例1: 解释: 请注意 ...