C语言程序设计之交换两个数的值
根据提供的文件信息,我们可以从中提炼出以下几个主要的知识点: ### 1. C语言中的函数指针与函数调用 在给定的代码片段中,可以看到一个函数指针`pFunc`被用来调用不同的函数(`sum`和`swap`)。这种通过函数指针来动态选择调用哪个函数的方法,在C语言编程中非常实用。 #### 函数指针定义 - `int (*pFunc)(int, int);` 这行代码定义了一个指向接受两个整数参数并返回整数类型的函数的指针。 - 在实际使用中,可以将该指针指向具体的函数,如: ```c pFunc = sum; ``` 或者: ```c pFunc = swap; ``` #### 函数调用 - 使用函数指针调用函数可以通过以下几种方式: ```c pFunc(a, b); // 或 (*pFunc)(a, b); // 或 (pFunc->)(a, b); // 注意这种方式在标准C中是非法的,但在某些编译器下可能被支持。 ``` ### 2. 数值交换的实现方法 给定的代码中还包含了一个用于交换两个整数值的函数`swap`。 #### 函数实现 ```c int swap(int a, int b) { cout << "before swap()" << endl; cout << "a=" << a << '\t' << "b=" << b << endl; a = a + b; b = a - b; a = a - b; cout << "after swap()" << endl; cout << "a=" << a << '\t' << "b=" << b << endl; return 0; } ``` 在这个实现中,通过简单的数学运算完成了数值的交换,而没有使用额外的变量。这种方法避免了使用临时变量的空间开销。 ### 3. 字符串比较 虽然这部分代码使用了C++语法,但是核心逻辑仍然可以适用于C语言环境。这里涉及到了字符串的输入、比较以及输出。 #### 字符串的输入 ```c char s1[100], s2[100]; int i = 0, j = 0; printf("s1:"); do { scanf("%c", &s1[i]); } while (s1[i++] != '\n'); s1[i] = '\0'; printf("s2:"); do { scanf("%c", &s2[j]); } while (s2[j++] != '\n'); s2[j] = '\0'; ``` 这段代码使用了`do-while`循环来逐字符读取用户输入,并将每个字符存入相应的字符数组中,直到遇到换行符`\n`才结束。 #### 字符串的比较 ```c i = -1; j = -1; do { i++; j++; if (s1[i] > s2[j] || (s1[i] != '\0' && s2[j] == '\0')) { printf("-1"); break; } else if (s1[i] < s2[j] || (s1[j] != '\0' && s1[i] == '\0')) { printf("1"); break; } else if (s1[i] == '\0' && s2[j] == '\0') printf("0"); } while (s1[i] != '\0' && s2[j] != '\0'); ``` 这里的比较逻辑基于逐字符比较的方式,如果第一个字符串比第二个字符串长或大,则输出-1;如果第一个字符串比第二个字符串短或小,则输出1;若两个字符串相等则输出0。 ### 4. 数组排序示例 此部分代码展示了如何对一个整型数组进行简单排序。 #### 数组排序 ```c int f[10], max, min, a; for (i = 0; i < 10; i++) scanf("%d", &f[i]); a = 0; max = f[0]; for (j = 1; j < 10; j++) if (f[j] > max) { max = f[j]; a = j; } k = f[9]; f[9] = f[a]; f[a] = k; printf("顺序:\n"); for (k = 0; k < 10; k++) printf("%d", f[k]); if (k == 9) printf("\n最大值=%d", f[k]); ``` 该段代码首先通过用户输入填充数组,然后找到数组中的最大值及其索引位置,接着将最大值与最后一个元素进行交换,从而实现了简单排序。 ### 5. 数字月份转换 这个示例展示了如何根据数字计算其对应的月份名称。 #### 数字到月份的转换 ```c int n; cout << "请输入一个3位数:" << endl; cin >> n; if (f(n) >= 1 && f(n) <= 12) { switch (f(n)) { case 1: cout << "January" << endl; break; case 2: cout << "February" << endl; break; case 3: cout << "March" << endl; break; case 4: cout << "April" << endl; break; case 5: cout << "May" << endl; break; case 6: cout << "June" << endl; break; case 7: cout << "July" << endl; break; case 8: cout << "August" << endl; break; case 9: cout << "September" << endl; break; case 10: cout << "October" << endl; break; case 11: cout << "November" << endl; break; case 12: cout << "December" << endl; break; } } else cout << "***" << endl; ``` 这里先定义了一个函数`f`用于计算给定数字各位上的数字之和,然后根据计算结果通过`switch`语句判断对应的月份名称。如果输入数字不在1至12之间,则输出错误信息。 以上是根据给定文件信息整理出的关键知识点。希望这些内容能够帮助您更好地理解相关概念和技术细节。