C语言上机

必考:

这三道直接记下即可 另外三道需要学习掌握

几何计算

用户从键盘输入长方形的长和宽(小数),计算该长方形的面积和周长,要求结果均保留 2 位小数并输出

#include<stdio.h>
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 <stdio.h>
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 <stdio.h>

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<stdio.h>
    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<stdio.h>
    #include<math.h>
    
    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<stdio.h>
    
    #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<stdio.h>
    
    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<stdio.h>
    
    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<stdio.h>
    
    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 <stdio.h>
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
#include<stdio.h>
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 <stdio.h>
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 <stdio.h>
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<stdio.h>

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 <stdio.h>
#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<N; i++)
        for(j=0; j<N; j++)
            scanf("%d", &a[i][j]);

    // 转置逻辑
    for(i=0; i<N; i++)
        for(j=0; j<N; j++)
            b[j][i] = a[i][j]; // 行列交换

    // 输出(题目要求格式整齐,用 \t 或 %4d)
    printf("转置后矩阵:\n");
    for(i=0; i<N; i++) {
        for(j=0; j<N; j++) {
            printf("%4d", b[i][j]);
        }
        printf("\n");
    }
    return 0;
}

编写程序,求3×4的矩阵a的转置矩阵。

#include <stdio.h>

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 <stdio.h>

#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 <stdio.h>

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 <stdio.h>

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 <stdio.h>
#include <string.h>

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;
}