zoukankan      html  css  js  c++  java
  • C语言--- 字符串数组 、 预处理器和预处理指令 、 多文件编程 、 结构体

    1 输入一个姓名,判断是否是五虎上将。

    1.1 问题

    本案例需要使用交互的方式判断:用户从控制台输入一个名字,由程序判断该名字是否在五虎上将的名单中。五虎上将的名单是:GuanYu、ZhangFei、ZhaoYun、MaChao、HuangZhong。

    如果名字在名单中,程序交互过程如图-1所示:

    图-1

    如果名字不在名单中,程序交互过程如图-2所示:

    图-2

    1.2 方案

    首先,在程序中定义一个字符指针数组,作为五虎上将的名单使用。然后,从控制台输入一个名字,接着,遍历名单,逐个对比输入的名字与名单中的名字是否一致,如果一致,则输出“XX是五虎上将之一”;否则则输出“XX不是五虎上将之一”。

    1.3 步骤

    实现此案例需要按照如下步骤进行。

    步骤一:定义五虎上将名单

    使用字符指针数组作为名单。

    代码如下:

    1. #include <stdio.h>
    2. int main(int argc, const char * argv[])
    3. {
    4. char *tiger[5] = {"GuanYu", "ZhangFei", "ZhaoYun", "MaChao", "HuangZhong"};
    5. return 0;
    6. }

    步骤二:输入一个名字

    定义一个字符数组,用于存储从控制台输入的名字。

    代码如下:

    1. #include <stdio.h>
    2. int main(int argc, const char * argv[])
    3. {
    4. char *tiger[5] = {"GuanYu", "ZhangFei", "ZhaoYun", "MaChao", "HuangZhong"};
    5. char name[20];
    6. printf("请输入一个名字:");
    7. scanf("%s", name);
    8. return 0;
    9. }

    步骤三:遍历数组

    遍历数组,逐个将数组元素与输入的名字对比,查找是否为五虎上将之一。

    1. #include <stdio.h>
    2. #include <string.h>
    3. int main(int argc, const char * argv[])
    4. {
    5. char *tiger[5] = {"GuanYu", "ZhangFei", "ZhaoYun", "MaChao", "HuangZhong"};
    6. char name[20];
    7. printf("请输入一个名字:");
    8. scanf("%s", name);
    9. int i;
    10. for (i = 0; i < 5; i++)
    11. if (strcmp(name, tiger[i]) == 0)
    12. {
    13. printf("%s是五虎上将之一。 ", name);
    14. break;
    15. }
    16. if (i == 5)
    17. printf("%s不是五虎上将之一。 ", name);
    18. return 0;
    19. }

    注意:strcmp函数需要包含string.h这个头函数。

    1.4 完整代码

    本案例的完整代码如下所示:

    1. #include <stdio.h>
    2. #include <string.h>
    3. int main(int argc, const char * argv[])
    4. {
    5. char *tiger[5] = {"GuanYu", "ZhangFei", "ZhaoYun", "MaChao", "HuangZhong"};
    6. char name[20];
    7. printf("请输入一个名字:");
    8. scanf("%s", name);
    9. int i;
    10. for (i = 0; i < 5; i++)
    11. if (strcmp(name, tiger[i]) == 0)
    12. {
    13. printf("%s是五虎上将之一。 ", name);
    14. break;
    15. }
    16. if (i == 5)
    17. printf("%s不是五虎上将之一。 ", name);
    18. return 0;
    19. }

    2 定义宏并在程序中使用

    2.1 问题

    对于如下在一个有10个数组元素的数组中找出最大值的程序:

    1. #include <stdio.h>
    2. #include <time.h>
    3. #include <stdlib.h>
    4. int main()
    5. {
    6. int max;
    7. int arr[10];
    8. srand((unsigned)time(0));
    9. for (int i = 0; i< 10; i++)
    10. arr[i] = (int)rand() % 100;
    11. printf("数组中的数据为:");
    12. for (int i = 0; i < 10; i++)
    13. printf(" %d", arr[i]);
    14. printf(" ");
    15. max = arr[0];
    16. for (int i = 1; i < 10; i++)
    17. if (max < arr[i])
    18. max = arr[i];
    19. printf("最大值是:%d ", max);
    20. return 0;
    21. }

    如果程序的需求改变,要求在20个数组元素中找到最大值,上述程序的编写方式就会带来很大的麻烦。因为我们要修改程序中所有与数组长度相关的数字10为20。为了避免这些麻烦,可以的使用宏替换。

    2.2 方案

    宏定义有如下格式:

    1. #define 标识符 替换列表

    宏的替换列表可以包括标识符、关键字、数值常量、字符常量、字符串字面量、操作符等。在文件后面的内容中,不管标识符在哪里出现,预处理器都会用替换列表代替它。

    在本案例中,首先定义一个宏,让它来代表数组的长度。然后,在主函数中,所有与数组长度有关的地方全部改为宏名。这样如果要修改数组的长度,只需要修改宏定义即可。

    2.3 步骤

    实现此案例需要按照如下步骤进行。

    步骤一:定义宏

    代码如下:

    1. #include <stdio.h>
    2. #include <time.h>
    3. #include <stdlib.h>
    4. #define SIZE 10
    5. int main()
    6. {
    7. int max;
    8. int arr[10];
    9. srand((unsigned)time(0));
    10. for (int i = 0; i< 10; i++)
    11. arr[i] = (int)rand() % 100;
    12. printf("数组中的数据为:");
    13. for (int i = 0; i < 10; i++)
    14. printf(" %d", arr[i]);
    15. printf(" ");
    16. max = arr[0];
    17. for (int i = 1; i < 10; i++)
    18. if (max < arr[i])
    19. max = arr[i];
    20. printf("最大值是:%d ", max);
    21. return 0;
    22. }

    步骤二:将程序中所有与数组长度相关的数字10,均改为宏名

    代码如下:

    1. #include <stdio.h>
    2. #include <time.h>
    3. #include <stdlib.h>
    4. #define SIZE 10
    5. int main()
    6. {
    7. int max;
    8. int arr[SIZE];
    9. srand((unsigned)time(0));
    10. for (int i = 0; i< SIZE; i++)
    11. arr[i] = (int)rand() % 100;
    12. printf("数组中的数据为:");
    13. for (int i = 0; i < SIZE; i++)
    14. printf(" %d", arr[i]);
    15. printf(" ");
    16. max = arr[0];
    17. for (int i = 1; i < SIZE; i++)
    18. if (max < arr[i])
    19. max = arr[i];
    20. printf("最大值是:%d ", max);
    21. return 0;
    22. }

    这样,当数组长度需要修改时,只需要修改如下宏定义即可。

    1. #define SIZE 10

    在编译之前的与处理时,将自动替换程序中的所有宏名,避免了人工查找的麻烦。

    2.4 完整代码

    本案例的完整代码如下所示:

    1. #include <stdio.h>
    2. #include <time.h>
    3. #include <stdlib.h>
    4. #define SIZE 10
    5. int main()
    6. {
    7. int max;
    8. int arr[SIZE];
    9. srand((unsigned)time(0));
    10. for (int i = 0; i< SIZE; i++)
    11. arr[i] = (int)rand() % 100;
    12. printf("数组中的数据为:");
    13. for (int i = 0; i < SIZE; i++)
    14. printf(" %d", arr[i]);
    15. printf(" ");
    16. max = arr[0];
    17. for (int i = 1; i < SIZE; i++)
    18. if (max < arr[i])
    19. max = arr[i];
    20. printf("最大值是:%d ", max);
    21. return 0;
    22. }

    3 定义宏函数并在程序中使用

    3.1 问题

    定义宏函数,完成以下操作:

    1) 求最大值。

    2) 判断奇偶。

    3) 小写字母转大写。

    4) 变量值交换。

    3.2 方案

    宏函数,又被称为带参数的宏,其定义有如下格式:

    1. #define 标识符(x1,x2,…,xn) 替换列表

    它的使用方法例如:

    1. #define FUN(x) ((x)*(x))
    2. int main()
    3. {
    4. int a;
    5. a = FUN(5);
    6. ……
    7. }

    在编译前的预处理阶段,预处理器首先将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))。

    在上述宏函数中,在替换列表中会发现存在许多括号,这些括号是必不可少的。例见下面程序:

    1. #define FUN(x) ((x)*(x))
    2. int main()
    3. {
    4. int a;
    5. a = FUN(5+3);
    6. ……
    7. }

    在编译前的预处理阶段,预处理器首先将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))。这是符合题意的。

    如果上例中宏函数的替换列表没有括号,如下例所示:

    1. #define FUN(x) x*x
    2. int main()
    3. {
    4. int a;
    5. a = FUN(5+3);
    6. ……
    7. }

    那么,替换的过程将是首先将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 步骤

    实现此案例需要按照如下步骤进行。

    步骤一:求最大值

    代码如下:

    1. #include <stdio.h>
    2. #define MAX(a, b) ((a) > (b) ? (a) : (b))
    3. int main()
    4. {
    5. printf("3和5的最大值为:%d ", MAX(3, 5));
    6. return 0;
    7. }

    步骤二:判断奇偶

    代码如下:

    1. #include <stdio.h>
    2. #define MAX(a, b) ((a) > (b) ? (a) : (b))
    3. #define IS_EVEN(a) ((a) % 2 == 1)
    4. int main()
    5. {
    6. printf("3和5的最大值为:%d ", MAX(3, 5));
    7. printf("3是否为奇数:%s ", IS_EVEN(3) ? "是" : "否");
    8. return 0;
    9. }

    步骤三:小写字母转大写

    代码如下:

    1. #include <stdio.h>
    2. #define MAX(a, b) ((a) > (b) ? (a) : (b))
    3. #define IS_EVEN(a) ((a) % 2 == 1)
    4. #define UPPER(c) c - 32
    5. int main()
    6. {
    7. printf("3和5的最大值为:%d ", MAX(3, 5));
    8. printf("3是否为奇数:%s ", IS_EVEN(3) ? "是" : "否");
    9. printf("a转为大写字母是:%c ", UPPER('a'));
    10. return 0;
    11. }

    步骤四:变量值交换

    代码如下:

    1. #include <stdio.h>
    2. #define MAX(a, b) ((a) > (b) ? (a) : (b))
    3. #define IS_EVEN(a) ((a) % 2 == 1)
    4. #define UPPER(c) c - 32
    5. #define SWAP(a, b) {int t = a; a = b; b = t;}
    6. int main()
    7. {
    8. printf("3和5的最大值为:%d ", MAX(3, 5));
    9. printf("3是否为奇数:%s ", IS_EVEN(3) ? "是" : "否");
    10. printf("a转为大写字母是:%c ", UPPER('a'));
    11. int a = 3;
    12. int b = 5;
    13. SWAP(a, b);
    14. printf("交换后a=%d,b=%d ", a, b);
    15. return 0;
    16. }

    3.4 完整代码

    本案例的完整代码如下所示:

    1. #include <stdio.h>
    2. #define MAX(a, b) ((a) > (b) ? (a) : (b))
    3. #define IS_EVEN(a) ((a) % 2 == 1)
    4. #define UPPER(c) c - 32
    5. #define SWAP(a, b) {int t = a; a = b; b = t;}
    6. int main()
    7. {
    8. printf("3和5的最大值为:%d ", MAX(3, 5));
    9. printf("3是否为奇数:%s ", IS_EVEN(3) ? "是" : "否");
    10. printf("a转为大写字母是:%c ", UPPER('a'));
    11. int a = 3;
    12. int b = 5;
    13. SWAP(a, b);
    14. printf("交换后a=%d,b=%d ", a, b);
    15. return 0;
    16. }
  • 相关阅读:
    [vijos P1531] 食物链
    [USACO精选] 第二章 动态规划(一)
    python 二分法查找
    python 小试牛刀之信息管理
    C语言链表实现冒泡法排序
    [笔记]libgdx在一张pixmap上按照笔刷画图
    [libgdx]项目通过RoboVm编译到ios平台并运行的环境配置
    android中sqlite distinct中使用多个字段的方法
    libgdx游戏中的中文字体工具类
    C语言实现字符串拷贝 拷贝指定长度字符串 字符串连接
  • 原文地址:https://www.cnblogs.com/52190112cn/p/5049164.html
Copyright © 2011-2022 走看看