C语言--- 字符串数组 、 预处理器和预处理指令 、 多文件编程 、 结构体
1 输入一个姓名,判断是否是五虎上将。
1.1 问题
本案例需要使用交互的方式判断:用户从控制台输入一个名字,由程序判断该名字是否在五虎上将的名单中。五虎上将的名单是:GuanYu、ZhangFei、ZhaoYun、MaChao、HuangZhong。
如果名字在名单中,程序交互过程如图-1所示:
图-1
如果名字不在名单中,程序交互过程如图-2所示:
图-2
1.2 方案
首先,在程序中定义一个字符指针数组,作为五虎上将的名单使用。然后,从控制台输入一个名字,接着,遍历名单,逐个对比输入的名字与名单中的名字是否一致,如果一致,则输出“XX是五虎上将之一”;否则则输出“XX不是五虎上将之一”。
1.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:定义五虎上将名单
使用字符指针数组作为名单。
代码如下:
- #include <stdio.h>
- int main(int argc, const char * argv[])
- {
- char *tiger[5] = {"GuanYu", "ZhangFei", "ZhaoYun", "MaChao", "HuangZhong"};
- return 0;
- }
步骤二:输入一个名字
定义一个字符数组,用于存储从控制台输入的名字。
代码如下:
- #include <stdio.h>
- int main(int argc, const char * argv[])
- {
- char *tiger[5] = {"GuanYu", "ZhangFei", "ZhaoYun", "MaChao", "HuangZhong"};
- char name[20];
- printf("请输入一个名字:");
- scanf("%s", name);
- return 0;
- }
步骤三:遍历数组
遍历数组,逐个将数组元素与输入的名字对比,查找是否为五虎上将之一。
- #include <stdio.h>
- #include <string.h>
- int main(int argc, const char * argv[])
- {
- char *tiger[5] = {"GuanYu", "ZhangFei", "ZhaoYun", "MaChao", "HuangZhong"};
- char name[20];
- printf("请输入一个名字:");
- scanf("%s", name);
- int i;
- for (i = 0; i < 5; i++)
- if (strcmp(name, tiger[i]) == 0)
- {
- printf("%s是五虎上将之一。\n", name);
- break;
- }
- if (i == 5)
- printf("%s不是五虎上将之一。\n", name);
- return 0;
- }
注意:strcmp函数需要包含string.h这个头函数。
1.4 完整代码
本案例的完整代码如下所示:
- #include <stdio.h>
- #include <string.h>
- int main(int argc, const char * argv[])
- {
- char *tiger[5] = {"GuanYu", "ZhangFei", "ZhaoYun", "MaChao", "HuangZhong"};
- char name[20];
- printf("请输入一个名字:");
- scanf("%s", name);
- int i;
- for (i = 0; i < 5; i++)
- if (strcmp(name, tiger[i]) == 0)
- {
- printf("%s是五虎上将之一。\n", name);
- break;
- }
- if (i == 5)
- printf("%s不是五虎上将之一。\n", name);
- return 0;
- }
2 定义宏并在程序中使用
2.1 问题
对于如下在一个有10个数组元素的数组中找出最大值的程序:
- #include <stdio.h>
- #include <time.h>
- #include <stdlib.h>
- int main()
- {
- int max;
- int arr[10];
- srand((unsigned)time(0));
- for (int i = 0; i< 10; i++)
- arr[i] = (int)rand() % 100;
- printf("数组中的数据为:");
- for (int i = 0; i < 10; i++)
- printf(" %d", arr[i]);
- printf("\n");
- max = arr[0];
- for (int i = 1; i < 10; i++)
- if (max < arr[i])
- max = arr[i];
- printf("最大值是:%d\n", max);
- return 0;
- }
如果程序的需求改变,要求在20个数组元素中找到最大值,上述程序的编写方式就会带来很大的麻烦。因为我们要修改程序中所有与数组长度相关的数字10为20。为了避免这些麻烦,可以的使用宏替换。
2.2 方案
宏定义有如下格式:
- #define 标识符 替换列表
宏的替换列表可以包括标识符、关键字、数值常量、字符常量、字符串字面量、操作符等。在文件后面的内容中,不管标识符在哪里出现,预处理器都会用替换列表代替它。
在本案例中,首先定义一个宏,让它来代表数组的长度。然后,在主函数中,所有与数组长度有关的地方全部改为宏名。这样如果要修改数组的长度,只需要修改宏定义即可。
2.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:定义宏
代码如下:
- #include <stdio.h>
- #include <time.h>
- #include <stdlib.h>
- #define SIZE 10
- int main()
- {
- int max;
- int arr[10];
- srand((unsigned)time(0));
- for (int i = 0; i< 10; i++)
- arr[i] = (int)rand() % 100;
- printf("数组中的数据为:");
- for (int i = 0; i < 10; i++)
- printf(" %d", arr[i]);
- printf("\n");
- max = arr[0];
- for (int i = 1; i < 10; i++)
- if (max < arr[i])
- max = arr[i];
- printf("最大值是:%d\n", max);
- return 0;
- }
步骤二:将程序中所有与数组长度相关的数字10,均改为宏名
代码如下:
- #include <stdio.h>
- #include <time.h>
- #include <stdlib.h>
- #define SIZE 10
- int main()
- {
- int max;
- int arr[SIZE];
- srand((unsigned)time(0));
- for (int i = 0; i< SIZE; i++)
- arr[i] = (int)rand() % 100;
- printf("数组中的数据为:");
- for (int i = 0; i < SIZE; i++)
- printf(" %d", arr[i]);
- printf("\n");
- max = arr[0];
- for (int i = 1; i < SIZE; i++)
- if (max < arr[i])
- max = arr[i];
- printf("最大值是:%d\n", max);
- return 0;
- }
这样,当数组长度需要修改时,只需要修改如下宏定义即可。
- #define SIZE 10
在编译之前的与处理时,将自动替换程序中的所有宏名,避免了人工查找的麻烦。
2.4 完整代码
本案例的完整代码如下所示:
- #include <stdio.h>
- #include <time.h>
- #include <stdlib.h>
- #define SIZE 10
- int main()
- {
- int max;
- int arr[SIZE];
- srand((unsigned)time(0));
- for (int i = 0; i< SIZE; i++)
- arr[i] = (int)rand() % 100;
- printf("数组中的数据为:");
- for (int i = 0; i < SIZE; i++)
- printf(" %d", arr[i]);
- printf("\n");
- max = arr[0];
- for (int i = 1; i < SIZE; i++)
- if (max < arr[i])
- max = arr[i];
- printf("最大值是:%d\n", max);
- return 0;
- }
3 定义宏函数并在程序中使用
3.1 问题
定义宏函数,完成以下操作:
1) 求最大值。
2) 判断奇偶。
3) 小写字母转大写。
4) 变量值交换。
3.2 方案
宏函数,又被称为带参数的宏,其定义有如下格式:
- #define 标识符(x1,x2,…,xn) 替换列表
它的使用方法例如:
- #define FUN(x) ((x)*(x))
- int main()
- {
- int a;
- a = FUN(5);
- ……
- }
在编译前的预处理阶段,预处理器首先将a=FUN(5)中的5替换#define FUN(x) ((x)*(x))中的x,使其成为#define FUN(5) ((5)*(5)),然后,用替换列表((5)*(5))替换a=FUN(5)中的FUN(5),使其成为a=((5)*(5))。
在上述宏函数中,在替换列表中会发现存在许多括号,这些括号是必不可少的。例见下面程序:
- #define FUN(x) ((x)*(x))
- int main()
- {
- int a;
- a = FUN(5+3);
- ……
- }
在编译前的预处理阶段,预处理器首先将a=FUN(5+3)中的5+3替换#define FUN(x) ((x)*(x))中的x,使其成为#define FUN(5+3) ((5+3)*(5+3)),然后,用替换列表((5+3)*(5+3))替换a=FUN(5+3)中的FUN(5+3),使其成为a=((5+3)*(5+3))。这是符合题意的。
如果上例中宏函数的替换列表没有括号,如下例所示:
- #define FUN(x) x*x
- int main()
- {
- int a;
- a = FUN(5+3);
- ……
- }
那么,替换的过程将是首先将a=FUN(5+3)中的5+3替换#define FUN(x) x*x中的x,使其成为#define FUN(5+3) 5+3*5+3,然后,用替换列表5+3*5+3替换a=FUN(5+3)中的FUN(5+3),使其成为a=5+3*5+3。这是不符合题意的。
3.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:求最大值
代码如下:
- #include <stdio.h>
- #define MAX(a, b) ((a) > (b) ? (a) : (b))
- int main()
- {
- printf("3和5的最大值为:%d\n", MAX(3, 5));
- return 0;
- }
步骤二:判断奇偶
代码如下:
- #include <stdio.h>
- #define MAX(a, b) ((a) > (b) ? (a) : (b))
- #define IS_EVEN(a) ((a) % 2 == 1)
- int main()
- {
- printf("3和5的最大值为:%d\n", MAX(3, 5));
- printf("3是否为奇数:%s\n", IS_EVEN(3) ? "是" : "否");
- return 0;
- }
步骤三:小写字母转大写
代码如下:
- #include <stdio.h>
- #define MAX(a, b) ((a) > (b) ? (a) : (b))
- #define IS_EVEN(a) ((a) % 2 == 1)
- #define UPPER(c) c - 32
- int main()
- {
- printf("3和5的最大值为:%d\n", MAX(3, 5));
- printf("3是否为奇数:%s\n", IS_EVEN(3) ? "是" : "否");
- printf("a转为大写字母是:%c\n", UPPER('a'));
- return 0;
- }
步骤四:变量值交换
代码如下:
- #include <stdio.h>
- #define MAX(a, b) ((a) > (b) ? (a) : (b))
- #define IS_EVEN(a) ((a) % 2 == 1)
- #define UPPER(c) c - 32
- #define SWAP(a, b) {int t = a; a = b; b = t;}
- int main()
- {
- printf("3和5的最大值为:%d\n", MAX(3, 5));
- printf("3是否为奇数:%s\n", IS_EVEN(3) ? "是" : "否");
- printf("a转为大写字母是:%c\n", UPPER('a'));
- int a = 3;
- int b = 5;
- SWAP(a, b);
- printf("交换后a=%d,b=%d\n", a, b);
- return 0;
- }
3.4 完整代码
本案例的完整代码如下所示:
- #include <stdio.h>
- #define MAX(a, b) ((a) > (b) ? (a) : (b))
- #define IS_EVEN(a) ((a) % 2 == 1)
- #define UPPER(c) c - 32
- #define SWAP(a, b) {int t = a; a = b; b = t;}
- int main()
- {
- printf("3和5的最大值为:%d\n", MAX(3, 5));
- printf("3是否为奇数:%s\n", IS_EVEN(3) ? "是" : "否");
- printf("a转为大写字母是:%c\n", UPPER('a'));
- int a = 3;
- int b = 5;
- SWAP(a, b);
- printf("交换后a=%d,b=%d\n", a, b);
- return 0;
- }
C语言--- 字符串数组 、 预处理器和预处理指令 、 多文件编程 、 结构体的更多相关文章
- C语言基本语法——预处理器和预处理指令
1.什么是预处理器 2.什么是预处理器指令 3.预处理器指令 4.宏指令 5.宏函数 6.宏函数的优缺点 7.条件编译指令 1.什么是预处理器 • 预处理器是一个程序,用来处理源程序中的预处理指令. ...
- C语言文件读写(结构体文件)
有时候,我们需要将输入的数据存储起来,这时候就需要用到文件,对于C语言而言,文件的读写有多种方式,下面主要是结构体文件的读写,例如student.dat(第一列是学号,第二列是姓名) xiaoming ...
- Go语言【第十一篇】:Go数据结构之:结构体
Go语言结构体 Go语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型,结构体是由一系列具有相同类型或不同类型数据构成的集合.结构体表示一项记录,比如:保存图书馆的书籍记 ...
- C语言开发函数库时利用不透明指针对外隐藏结构体细节
1 模块化设计要求库接口隐藏实现细节 作为一个函数库来说,尽力降低和其调用方的耦合.是最主要的设计标准. C语言,作为经典"程序=数据结构+算法"的践行者,在实现函数库的时候,必定 ...
- C语言字符串/数组去重
输入: hello 输出: helo 第一种实现: 不新开数组, 也就是原地去重. #include <stdio.h> #include <string.h> void re ...
- c语言学习之基础知识点介绍(十二):结构体的介绍
一.结构体的介绍 /* 语法: struct 结构体名{ 成员列表; }; 切记切记有分号! 说明:成员列表就是指你要保存哪些类型的数据. 注意:上面的语法只是定义一个新的类型,而这个类型叫做结构体类 ...
- C Primer Plus之C预处理器和C库
编译程序前,先由预处理器检查程序(因此称为预处理器).根据程序中使用的预处理器指令,预处理器用符号缩略语所代表的内容替换程序中的缩略语. 预处理器不能理解C,它一般是接受一些文件并将其转换成其他文本. ...
- 吴裕雄--天生自然C++语言学习笔记:C++ 预处理器
预处理器是一些指令,指示编译器在实际编译之前所需完成的预处理. 所有的预处理器指令都是以井号(#)开头,只有空格字符可以出现在预处理指令之前.预处理指令不是 C++ 语句,所以它们不会以分号(;)结尾 ...
- Microsoft Visual C++ 6.0预处理器参考手册
返回总目录 Microsoft Visual C++ 6.0 预处理器参考手册 目录引言........................................................ ...
随机推荐
- Spring学习(二)——Spring中的AOP的初步理解[转]
[前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring. ...
- web开发常用的js验证,利用正则表达式验证邮箱、手机、身份证等输入
正则表达式验证 //邮箱 \-])+\.)+([a-zA-Z0-]{,})+$/; email = document.getElementById("email").value; ...
- MyEclipse10.X 的破解过程详细图解
http://wenku.baidu.com/view/423e95056c85ec3a87c2c512.html
- Js练习题之字符串转驼峰
如border-bottom-color =>borderBottomColor 传传统方法 分析: 1.转大写,需要用到字符串的toUpperCase()方法 2.去掉-,需要用到字符串方法s ...
- HDU 3567 Eight II 打表,康托展开,bfs,g++提交可过c++不可过 难度:3
http://acm.hdu.edu.cn/showproblem.php?pid=3567 相比Eight,似乎只是把目标状态由确定的改成不确定的,但是康托展开+曼哈顿为h值的A*和IDA*都不过, ...
- FOJ 2105 Digits Count
题意:对一串数字进行抑或某数,和某数,或某数,统计某区间和的操作. 思路:因为化成二进制就4位可以建4颗线段树,每颗代表一位二进制. and 如果该为是1 直接无视,是0则成段赋值为0: or 如 ...
- C++之函数fgetc和fputc、fgets和fputs、fread和fwrite、fscanf和fprintf用法小结
#include <iostream> #include <cstdio> #include <cstdlib> using namespace std; int ...
- MSMQ消息队列
MSMQ全称MicroSoft Message Queue,微软消息队列,是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任一 ...
- 【STL】-list的用法
初始化: #include <list> list<char> clist; 算法: clist.push_back(c); clist.remove('d'); 代码: #i ...
- Session初识
web服务器没有短期记忆,所以需要使用session来跟踪用户的整个会话活动.会话管理有3种解决方案: 1)使用隐藏域(很少使用) 在显示页面中使用隐藏域来保存会话ID.例如,在JSP中将input标 ...