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;
}
#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;
}
💬 评论