大一必知必会:十个 C 语言项目助你期末无忧

在大一的 C 语言学习旅程中,掌握一些经典项目能极大提升你的编程能力,还能为期末考试打下坚实基础。接下来,让我们一起深入探索十个重要的 C 语言项目,每个项目都配备完整且可运行的代码。
项目一:简易计算器
功能描述
实现一个简单的计算器,能进行加、减、乘、除四则运算。用户输入两个操作数和一个运算符,程序输出运算结果。
完整代码

include <stdio.h>

int main() {

double num1, num2;
char operator;

printf("请输入第一个数字: ");
scanf("%lf", &num1);

printf("请输入运算符 (+, -, *, /): ");
scanf(" %c", &operator);

printf("请输入第二个数字: ");
scanf("%lf", &num2);

switch (operator) {
    case '+':
        printf("结果是: %.2lf\n", num1 + num2);
        break;
    case '-':
        printf("结果是: %.2lf\n", num1 - num2);
        break;
    case '*':
        printf("结果是: %.2lf\n", num1 * num2);
        break;
    case '/':
        if (num2 != 0) {
            printf("结果是: %.2lf\n", num1 / num2);
        } else {
            printf("错误: 除数不能为零\n");
        }
        break;
    default:
        printf("错误: 无效的运算符\n");
}

return 0;

}
mdv4pm9j.png

代码说明
定义了两个双精度浮点数num1和num2用于存储操作数,一个字符operator用于存储运算符。
使用scanf函数获取用户输入的操作数和运算符。
通过switch语句根据不同的运算符进行相应的运算,并输出结果。注意在除法运算中对除数为零的情况进行了错误处理。
项目二:猜数字游戏
功能描述
程序随机生成一个 1 到 100 之间的整数,用户通过输入猜测的数字,程序提示猜测结果是大了、小了还是猜对了,直到用户猜对为止。
完整代码

include <stdio.h>

include <stdlib.h>

include <time.h>

int main() {

int number, guess, tries = 0;
srand(time(0));
number = rand() % 100 + 1;

printf("猜数字游戏!我想了一个1到100之间的数。\n");

do {
    printf("请输入你的猜测: ");
    scanf("%d", &guess);
    tries++;

    if (guess > number) {
        printf("太大了!再试一次。\n");
    } else if (guess < number) {
        printf("太小了!再试一次。\n");
    } else {
        printf("恭喜你,猜对了!你用了 %d 次尝试。\n", tries);
    }
} while (guess != number);

return 0;

}

代码说明
引入stdlib.h和time.h头文件,用于生成随机数。
使用srand(time(0))初始化随机数种子,确保每次运行程序生成的随机数不同。
rand() % 100 + 1生成 1 到 100 之间的随机整数。
通过do - while循环不断获取用户猜测并给出相应提示,直到用户猜对为止,同时记录猜测次数。
项目三:打印乘法口诀表
功能描述
在控制台打印出九九乘法口诀表。
完整代码

include <stdio.h>

int main() {

int i, j;

for (i = 1; i <= 9; i++) {
    for (j = 1; j <= i; j++) {
        printf("%d × %d = %d\t", j, i, i * j);
    }
    printf("\n");
}

return 0;

}

代码说明
使用两层嵌套的for循环,外层循环控制行数,从 1 到 9。
内层循环控制每行的列数,列数随着行数增加,从 1 到当前行数i。
在循环内部使用printf函数按照乘法口诀表的格式输出乘法表达式及结果。
项目四:判断素数
功能描述
用户输入一个整数,程序判断该数是否为素数,并输出判断结果。
完整代码

include <stdio.h>

include <math.h>

int main() {

int num, i, flag = 1;

printf("请输入一个整数: ");
scanf("%d", &num);

if (num <= 1) {
    flag = 0;
} else {
    for (i = 2; i <= sqrt(num); i++) {
        if (num % i == 0) {
            flag = 0;
            break;
        }
    }
}

if (flag) {
    printf("%d 是素数\n", num);
} else {
    printf("%d 不是素数\n", num);
}

return 0;

}

代码说明
定义一个变量flag用于标记是否为素数,初始值设为 1(假设是素数)。
首先判断输入的数是否小于等于 1,若小于等于 1 则直接判定不是素数,将flag设为 0。
对于大于 1 的数,使用for循环从 2 到该数的平方根遍历,若能被整除则判定不是素数,将flag设为 0 并跳出循环。
根据flag的值输出判断结果。
项目五:字符串反转
功能描述
用户输入一个字符串,程序将该字符串反转后输出。
完整代码

include <stdio.h>

include <string.h>

void reverseString(char *str) {

int length = strlen(str);
int start = 0;
int end = length - 1;
char temp;

while (start < end) {
    temp = str[start];
    str[start] = str[end];
    str[end] = temp;
    start++;
    end--;
}

}

int main() {

char str[100];

printf("请输入一个字符串: ");
scanf("%s", str);

reverseString(str);
printf("反转后的字符串是: %s\n", str);

return 0;

}

代码说明
定义一个函数reverseString用于反转字符串。
在函数内部,使用双指针法,一个指针指向字符串开头start,一个指针指向字符串末尾end。
通过交换两个指针指向的字符,逐步将字符串反转,直到两个指针相遇。
在main函数中获取用户输入的字符串,调用reverseString函数进行反转并输出结果。
项目六:冒泡排序
功能描述
用户输入一组整数,程序使用冒泡排序算法对这组整数进行升序排序,并输出排序后的结果。
完整代码

include <stdio.h>

void bubbleSort(int arr[], int n) {

int i, j, temp;
for (i = 0; i < n - 1; i++) {
    for (j = 0; j < n - i - 1; j++) {
        if (arr[j] > arr[j + 1]) {
            temp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = temp;
        }
    }
}

}

int main() {

int n, i;
printf("请输入数组元素个数: ");
scanf("%d", &n);

int arr[n];
printf("请输入 %d 个整数:\n", n);
for (i = 0; i < n; i++) {
    scanf("%d", &arr[i]);
}

bubbleSort(arr, n);
printf("排序后的数组是:\n");
for (i = 0; i < n; i++) {
    printf("%d ", arr[i]);
}
printf("\n");

return 0;

}

代码说明
定义一个函数bubbleSort实现冒泡排序算法。
在函数内部,使用两层嵌套的for循环,外层循环控制排序轮数,内层循环控制每一轮比较的次数。
每一轮中,相邻元素进行比较,如果顺序不对则交换,通过不断交换将最大(或最小)的元素 “冒泡” 到数组末尾(或开头)。
在main函数中获取用户输入的数组元素个数和具体元素,调用bubbleSort函数进行排序并输出排序后的数组。
项目七:求数组最大值和最小值
功能描述
用户输入一组整数,程序找出这组整数中的最大值和最小值,并输出结果。
完整代码

include <stdio.h>

void findMaxMin(int arr[], int n, int max, int min) {

int i;
*max = *min = arr[0];

for (i = 1; i < n; i++) {
    if (arr[i] > *max) {
        *max = arr[i];
    }
    if (arr[i] < *min) {
        *min = arr[i];
    }
}

}

int main() {

int n, i, max, min;
printf("请输入数组元素个数: ");
scanf("%d", &n);

int arr[n];
printf("请输入 %d 个整数:\n", n);
for (i = 0; i < n; i++) {
    scanf("%d", &arr[i]);
}

findMaxMin(arr, n, &max, &min);
printf("最大值是: %d\n", max);
printf("最小值是: %d\n", min);

return 0;

}

代码说明
定义一个函数findMaxMin用于查找数组中的最大值和最小值,通过指针返回结果。
在函数内部,先将数组的第一个元素初始化为最大值和最小值,然后遍历数组,与当前的最大值和最小值比较,更新最大值和最小值。
在main函数中获取用户输入的数组元素个数和具体元素,调用findMaxMin函数并输出找到的最大值和最小值。
项目八:计算阶乘
功能描述
用户输入一个正整数,程序计算该数的阶乘并输出结果。
完整代码

include <stdio.h>

int factorial(int num) {

int result = 1, i;
for (i = 1; i <= num; i++) {
    result *= i;
}
return result;

}

int main() {

int num;
printf("请输入一个正整数: ");
scanf("%d", &num);

if (num < 0) {
    printf("错误: 请输入一个正整数\n");
} else {
    int result = factorial(num);
    printf("%d 的阶乘是: %d\n", num, result);
}

return 0;

}

代码说明
定义一个函数factorial用于计算阶乘,使用for循环从 1 累乘到输入的数。
在main函数中获取用户输入的数,先判断是否为正整数,若为正整数则调用factorial函数计算阶乘并输出结果,否则提示错误。
项目九:打印菱形图案
功能描述
用户输入一个奇数,程序根据该数打印出一个菱形图案。
完整代码

include <stdio.h>

int main() {

int n, i, j, space;
printf("请输入一个奇数: ");
scanf("%d", &n);

for (i = 1; i <= n; i += 2) {
    for (space = 1; space <= (n - i) / 2; space++) {
        printf(" ");
    }
    for (j = 1; j <= i; j++) {
        printf("*");
    }
    printf("\n");
}

for (i = n - 2; i >= 1; i -= 2) {
    for (space = 1; space <= (n - i) / 2; space++) {
        printf(" ");
    }
    for (j = 1; j <= i; j++) {
        printf("*");
    }
    printf("\n");
}

return 0;

}

代码说明
首先获取用户输入的奇数n。
使用两个for循环结构打印菱形的上半部分和下半部分。
在上半部分的循环中,内层循环先打印空格,空格数量随着行数增加而减少;然后打印星号,星号数量随着行数增加而增加。
下半部分循环类似,只是行数递减,实现菱形的对称效果。
项目十:简易学生成绩管理系统
功能描述
实现一个简单的学生成绩管理系统,能录入学生的姓名和成绩,计算平均成绩,找出最高成绩和对应的学生姓名,并输出结果。
完整代码

include <stdio.h>

include <string.h>

define MAX_STUDENTS 100

typedef struct {

char name[50];
float score;

} Student;

void inputStudents(Student students[], int *count) {

int i;
printf("请输入学生人数 (不超过 %d): ", MAX_STUDENTS);
scanf("%d", count);

for (i = 0; i < *count; i++) {
    printf("请输入第 %d 个学生的姓名: ", i + 1);
    scanf("%s", students[i].name);
    printf("请输入第 %d 个学生的成绩: ", i + 1);
    scanf("%f", &students[i].score);
}

}

float calculateAverage(Student students[], int count) {

int i;
float sum = 0;
for (i = 0; i < count; i++) {
    sum += students[i].score;
}
return sum / count;

}

void findHighest(Student students[], int count, char highestName, float highestScore) {

int i;
*highestScore = students[0].score;
strcpy(highestName, students[0].name);

for (i = 1; i < count; i++) {
    if (students[i].score > *highestScore) {
        *highestScore = students[i].score;
        strcpy(highestName, students[i].name);
    }
}

}

int main() {

Student students[MAX_STUDENTS];
int count;
float average;
char highestName[50];
float highestScore;

inputStudents(students, &count);
average = calculateAverage(students, count);
findHighest(students, count, highestName, &highestScore);

printf("平均成绩是: %.2f\n", average);
printf("最高成绩是 %.2f,对应的学生是 %s\n", highestScore, highestName);

return 0;

}

代码说明
定义一个结构体Student用于存储学生的姓名和成绩。
定义三个函数:inputStudents用于录入学生信息,calculateAverage用于计算平均成绩,findHighest用于找出最高成绩及对应的学生姓名。
在main函数中,声明一个Student类型的数组用于存储学生信息,调用上述三个函数完成相应功能,并输出平均成绩和最高成绩及对应的学生姓名。
通过完成这十个 C 语言项目,你不仅能加深对 C 语言语法和编程思想的理解,还能在期末考试中更加自信从容。希望同学们认真练习,不断提升自己的编程能力。

最后修改:2025 年 08 月 03 日
如果觉得我的文章对你有用,请随意赞赏