--- title: "04-C语言上机" created: 2026-01-03 tags: - 博客 --- # C语言上机 ## 必考: 这三道直接记下即可 另外三道需要学习掌握 **几何计算** 用户从键盘输入长方形的长和宽(小数),计算该长方形的面积和周长,要求结果均保留 2 位小数并输出 ``` #include int main(){ double chang,kuan,mianji,zhouchang; printf("请输入长方形的长和宽:"); scanf("%lf %lf",&chang,&kuan); mianji = chang*kuan; zhouchang = (chang+kuan)*2; printf("面积为:%.2lf,周长为:%.2lf",mianji,zhouchang); return 0; } ``` **数组统计 (指针操作)** 初始化一维数组int arr[10] = {15, 7, 23, 0, 42, 11, 3, 56, 28, 9},编写程序统计数组中偶数的个数,并计算所有偶数的总和,最终输出统计结果。(要求必须使用指针进行数组元素的调用) ``` #include int main() { int arr[10] = {15, 7, 23, 0, 42, 11, 3, 56, 28, 9}; int count = 0, sum = 0; int *p; for(p = arr; p < arr + 10; p++) { if(*p % 2 == 0) { // 判断偶数 count++; sum += *p; } } printf("偶数个数: %d, 总和: %d\n", count, sum); return 0; } ``` **自定义函数 (累加/阶乘)** 编写自定义函数long long factSum(int n),计算 1! + 2! + 3! + ... + n! 的总和(n 由用户从键盘输入,范围 1≤n≤10),主函数负责输入 n、调用自定义函数并输出结果。 ``` #include long long factSum(int n) { long long sum = 0; long long tempFact = 1; for(int i = 1; i <= n; i++) { tempFact *= i; // 计算 i! (基于 (i-1)! * i) sum += tempFact; } return sum; } int main() { int n; printf("请输入n (1<=n<=10): "); scanf("%d", &n); printf("阶乘和: %lld\n", factSum(n)); return 0; } ``` ## **第一题:几何计算 (基础 I/O)** ①`float/double` 的输入输出 ②`printf` 格式化输出(保留2位小数 `%.2f`) **③数学库**:`math.h` 的使用(如三角形面积的海伦公式 `sqrt`)。 考点:输入 `scanf`,数学计算,输出控制。 - **A卷**:长方形面积与周长。 用户从键盘输入长方形的长和宽(小数),计算该长方形的面积和周长,要求结果均保留 2 位小数并输出 ``` #include int main(){ double chang,kuan,mianji,zhouchang; printf("请输入长方形的长和宽:"); scanf("%lf %lf",&chang,&kuan); mianji = chang*kuan; zhouchang = (chang+kuan)*2; printf("面积为:%.2lf,周长为:%.2lf",mianji,zhouchang); return 0; } ``` - **B卷**:三角形面积与周长(需用海伦公式) ``` #include #include int main(){ double a,b,c,mianji,zhouchang; printf("请输入三条边:"); scanf("%lf %lf %lf",&a,&b,&c); if(a+b>c && a+c>b && b+c>a){ zhouchang = a+b+c; double s = zhouchang/2.0; mianji = sqrt(s*(s-a)*(s-b)*(s-c)); printf("面积:%.2lf,周长:%.2f",mianji,zhouchang); } else{ printf("不构成三角形"); } return 0; } ``` - 输入一个球的半径,根据公式 \(\frac{4 \pi}{3} r^3\) 计算并输出球的体积 ``` #include #define PI 3.14 int main(){ double r,v; printf("请输入球的半径:"); scanf("%lf",&r); v = 4.0 / 3 * PI * r * r * r; printf("体积为%.2lf",v); return 0; } ``` ## 第二题:超市打折 (if-else 分支) **分支结构**:`if-else`语句处理分段函数(打折逻辑)。 **考点**:逻辑判断顺序,区间判断。 - **A卷**:满100减10,满200减30。 ``` #include int main(){ double yuanjia,zhifu; printf("请输入购物总金额:"); scanf("%lf",&yuanjia); if(yuanjia<100){ zhifu = yuanjia; } else if(yuanjia<200){ zhifu = yuanjia - 10; }else{ zhifu = yuanjia -30; } printf("实际支付:%.2f\n",zhifu); return 0; } ``` - **B卷**:满50减5,满100减15,满200减40。 ``` #include int main(){ double yuanjia,zhifu; printf("请输入购物总金额:"); scanf("%lf",&yuanjia); if(yuanjia<50){ zhifu = yuanjia; }else if(yuanjia<100){ zhifu = yuanjia - 5; }else if(yuanjia<200){ zhifu = yuanjia - 15; }else{ zhifu = yuanjia - 40; } printf("实际支付:%.2lf",zhifu); return 0; } ``` - 编写程序,计算购货款。请输入购货金额,输出实际付款金额。 购货折扣率如下: 购货金额<=500元 不打折 500<购货金额<=1000元 9折 1000元<购货金额 8折 ``` /* 2.3 编写程序,计算购货款。请输入购货金额,输出实际付款金额。 购货折扣率如下: 购货金额<=500元 不打折 500<购货金额<=1000元 9折 1000元<购货金额 8折 */ #include int main(){ double yuanjia,zhifu; printf("请输入购物总金额:"); scanf("%lf",&yuanjia); if(yuanjia<=500){ zhifu=yuanjia; }else if(yuanjia<=1000){ zhifu=yuanjia*0.9; }else{ zhifu=yuanjia*0.8; } printf("实际支付%.2lf",zhifu); return 0; } ``` ## 第三题:数字金字塔 (嵌套循环) **循环结构**:`for` 循环的嵌套,用于打印金字塔图形。 - **A卷**:5行。 - **B卷**:6行。 - **规律分析**: - 第 `i` 行(从0开始) - 空格数:`总行数 - 1 - i` - 数字规律:先从 `i` 递增到 `2*i`,再递减回 `i`。 - 例如第2行(i=1):先打印空格,然后打印 `1, 2, 1`。 **通用代码 (修改 N 即可):** ``` #include int main() { int n = 5; // A卷是5,B卷是6 int i, j, k; for(i = 0; i < n; i++) { // 1. 打印空格 for(j = 0; j < n - 1 - i; j++) { printf(" "); } // 2. 打印递增部分 (i 到 2*i) for(k = i; k <= 2 * i; k++) { printf("%d", k); } // 3. 打印递减部分 (2*i-1 到 i) for(k = 2 * i - 1; k >= i; k--) { printf("%d", k); } printf("\n"); } return 0; } ``` ![[image-a590f84f.png]] ``` #include int main() { int n = 6; int i,j; for(i=1;i<=n;i++){ for(j=1;j<=n-i;j++) printf(" "); for(j=1;j<=2*i-1;j++) printf("*"); printf("\n"); } return 0; } ``` ## 第四题:数组统计 (指针操作) **数组与指针**: - 一维数组的初始化与遍历。 - **重点**:使用 **指针** (`int *p`) 访问数组元素,而不是下标 (`arr[i]`)。 - 二维数组的定义与转置(行列互换)。 **考点**:**必须使用指针**。指针遍历数组的标准写法是 `for(p = arr; p < arr + N; p++)`,取值用 `*p`。 **A卷**:长度10,统计**偶数**个数及和**:** **初始化一维数组int arr[10] = {15, 7, 23, 0, 42, 11, 3, 56, 28, 9},编写程序统计数组中偶数的个数,并计算所有偶数的总和,最终输出统计结果。(要求必须使用指针进行数组元素的调用)** ``` #include int main() { int arr[10] = {15, 7, 23, 0, 42, 11, 3, 56, 28, 9}; int count = 0, sum = 0; int *p; for(p = arr; p < arr + 10; p++) { if(*p % 2 == 0) { // 判断偶数 count++; sum += *p; } } printf("偶 数个数: %d, 总和: %d\n", count, sum); return 0; } ``` **B卷**:长度12,统计**奇数**个数及和**:** ``` #include int main() { int arr[12] = {2, 7, 14, 21, 0, 13, 5, 18, 27, 3, 33, 8}; int count = 0, sum = 0; int *p; for(p = arr; p < arr + 12; p++) { if(*p % 2 != 0) { // 判断奇数 count++; sum += *p; } } printf("奇数个数: %d, 总和: %d\n", count, sum); return 0; } ``` 已知数组a[5]中存放了5个整数,要求输出其中的最大值,采用指针法。 ``` #include int main() { int i, max=0, a[5]={0,10,20,30,40}; int *pmax, *pa; pa = pmax = a; for(i=0; i<5; i++) { if(*pmax < *pa) { pmax = pa; } pa++; } printf("\nmax is %d", *pmax); return 0; } ``` ## 第五题:矩阵转置 (二维数组) - **A卷**:3x3 矩阵。 - **B卷**:5x5 矩阵。 **考点**:行列互换。`b[j][i] = a[i][j]`。 **通用代码 (修改 N 即可):** ``` #include #define N 3 // A卷是3,B卷是5 int main() { int a[N][N], b[N][N]; int i, j; // 输入 printf("请输入%dx%d矩阵:\n", N, N); for(i=0; i int main() { int a[3][4] = { {2, 5, 7, 9}, {6, 14, 20, 8}, {15, 0, 12, 3} }; int b[4][3]; int i, j; printf("数组a:\n"); for(i = 0; i < 3; i++) { for(j = 0; j < 4; j++) printf("%3d", a[i][j]); printf("\n"); } // 行列互换 // 外层循环 i 控制 b 的行(0-3),内层循环 j 控制 b 的列(0-2) for(i = 0; i < 4; i++) for(j = 0; j < 3; j++) b[i][j] = a[j][i]; // a 的行变成 b 的列 printf("数组b:\n"); for(i = 0; i < 4; i++) { for(j = 0; j < 3; j++) printf("%3d", b[i][j]); printf("\n"); } return 0; } ``` ``` #include #define ROWS 3 // 行数 #define COLS 3 // 列数 int i, j; int main() { // --- 已知数据初始化 --- // int a[ROWS][COLS] = { // {2, 5, 7}, // {6, 14, 20}, // {15, 0, 12}, // }; // --- 读入据初始化 --- int a[ROWS][COLS]; printf("请输入 %d x %d 矩阵的元素:\n", ROWS, COLS); for(i = 0; i < ROWS; i++) { for(j = 0; j < COLS; j++) { scanf("%d", &a[i][j]); } } int b[COLS][ROWS]; printf("\n原矩阵 a (%dx%d):\n", ROWS, COLS); for(i = 0; i < ROWS; i++) { for(j = 0; j < COLS; j++) { printf("%4d", a[i][j]); } printf("\n"); } for(i = 0; i < ROWS; i++) { for(j = 0; j < COLS; j++) { b[j][i] = a[i][j]; } } printf("\n转置后矩阵 b (%dx%d):\n", COLS, ROWS); for(i = 0; i < COLS; i++) { for(j = 0; j < ROWS; j++) { printf("%4d", b[i][j]); } printf("\n"); } return 0; } ``` ## 第六题:自定义函数 (累加/阶乘) **函数**:自定义函数的声明、定义与调用,递归或循环累加求和。 - **A卷**:计算阶乘和 \(1! + 2! + \dots + n!\)。 - **B卷**:计算立方和 \(1^3 + 2^3 + \dots + n^3\) (函数名为 `cubeSum`,尽管公式看起来像平方,但 cube 意为立方,建议按立方写)。 **考点**:`long long` 防止溢出,循环累加。 **A卷 (阶乘和):** **编写自定义函数long long factSum(int n),计算 1! + 2! + 3! + ... + n! 的总和(n 由用户从键盘输入,范围 1≤n≤10),主函数负责输入 n、调用自定义函数并输出结果。** ``` #include long long factSum(int n) { long long sum = 0; long long tempFact = 1; for(int i = 1; i <= n; i++) { tempFact *= i; // 计算 i! (基于 (i-1)! * i) sum += tempFact; } return sum; } int main() { int n; printf("请输入n (1<=n<=10): "); scanf("%d", &n); printf("阶乘和: %lld\n", factSum(n)); return 0; } ``` **B卷 (立方和):** ``` #include long long cubeSum(int n) { long long sum = 0; for(int i = 1; i <= n; i++) { sum += (long long)i * i * i; } return sum; } int main() { int n; printf("请输入n (1<=n<=10): "); scanf("%d", &n); printf("立方和: %lld\n", cubeSum(n)); return 0; } ``` ## B卷 第七题:字符串移位 (额外题) **字符串**(仅B卷):字符数组的操作。 - **题目**:输入一个字符串,把前3个字符移到最后。 - **例子**:输入 `ABCDE` -> 输出 `DEABC`。 **代码:** ``` #include #include int main() { char str[100], temp[4]; printf("请输入字符串: "); scanf("%s", str); int len = strlen(str); if(len > 3) { // 1. 保存前3个字符 strncpy(temp, str, 3); temp[3] = '\0'; // 封口 // 2. 将后面的字符往前移 for(int i = 0; i < len - 3; i++) { str[i] = str[i+3]; } // 3. 将temp拼接到后面 str[len-3] = '\0'; // 先截断 strcat(str, temp); } printf("变换后: %s\n", str); return 0; } ```