2024年湖北省专升本C语言程序设计大题真题解析(湖北理工版)

下面的题目顺序不确定!!!!!!!!!!!!!!

1、2/1+3/2+5/3+8/5+...

参考答案:

#include <stdio.h>

/*
 * 计算斐波那契数列前n项的和
 * 参数:
 *   n - 要计算的斐波那契数列的项数
 * 返回值:
 *   sum - 前n项的和
 */
double calculateSeriesSum(int n) {
    double sum = 0; // 初始化和为0
    double a = 1, b = 2; // 初始化斐波那契数列的前两项

    // 循环计算斐波那契数列前n项的和
    for (int i = 0; i < n; ++i) {
        sum += b / a; // 将当前项的值加到和上
        double temp = b; // 保存当前项的值
        b = a + b; // 计算下一项的值
        a = temp; // 将当前项的值赋给a
    }

    return sum;
}

int main() {
    int n; // 用户输入的斐波那契数列项数

    // 获取用户输入的斐波那契数列项数
    printf("请输入要计算的项数:");
    scanf("%d", &n);

    double sum = calculateSeriesSum(n); // 计算斐波那契数列前n项的和

    // 输出结果
    printf("前%d项和为:%lf\n", n, sum);

    return 0;
}

2、求某年某月某日是一年的第几天,用循环和数组做

参考答案:

#include <stdio.h>

// 存储每个月的天数
int daysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

/**
 * 计算给定日期是当年的第几天
 * @param year 年份
 * @param month 月份
 * @param day 日期
 * @return 当年的天数
 */
int calculateDayOfYear(int year, int month, int day) {
    int dayOfYear = day; // 初始化为给定日期的天数
    // 累加之前月份的天数
    for (int i = 0; i < month - 1; ++i) {
        dayOfYear += daysInMonth[i];
    }
    // 检查是否为闰年,并调整天数
    if (month > 2 && (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)) {
        dayOfYear += 1; // 闰年二月多一天
    }
    return dayOfYear;
}

int main() {
    int year, month, day;
    printf("请输入年月日(格式:年 月 日):");
    scanf("%d %d %d", &year, &month, &day);
    int dayOfYear = calculateDayOfYear(year, month, day);
    printf("%d年%d月%d日是该年的第%d天。\n", year, month, day, dayOfYear);
    return 0;
}

3、用链表删除数据

参考答案:

#include <stdio.h>
#include <stdlib.h>

// 定义链表节点结构
struct Node {
    int data;         // 节点存储的数据
    struct Node* next; // 指向下一个节点的指针
};

// 创建新节点
/**
 * @brief 创建并返回一个新的链表节点。
 * 
 * @param data 节点将要存储的数据。
 * @return struct Node* 指向新创建节点的指针。
 */
struct Node* createNode(int data) {
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); // 分配节点内存
    newNode->data = data; // 设置节点数据
    newNode->next = NULL; // 初始化下一个节点指针为NULL
    return newNode; // 返回新节点
}

// 插入节点到链表尾部
/**
 * @brief 在链表尾部插入一个新节点。
 * 
 * @param head 链表头节点的指针的地址。
 * @param data 要插入的数据。
 */
void append(struct Node** head, int data) {
    struct Node* newNode = createNode(data); // 创建新节点
    if (*head == NULL) { // 如果链表为空,直接将新节点设为头节点
        *head = newNode;
        return;
    }
    struct Node* temp = *head; // 从头节点开始遍历链表
    while (temp->next != NULL) {
        temp = temp->next;
    }
    temp->next = newNode; // 将新节点连接到链表尾部
}

// 删除指定数据的节点
/**
 * @brief 删除链表中指定数据的节点。
 * 
 * @param head 链表头节点的指针的地址。
 * @param key 要删除的节点数据。
 */
void deleteNode(struct Node** head, int key) {
    struct Node *temp = *head, *prev = NULL; // 初始化当前节点和前一个节点指针

    // 如果头节点就是要删除的节点
    if (temp != NULL && temp->data == key) {
        *head = temp->next; // 更新头节点指针
        free(temp); // 释放删除的节点内存
        return;
    }

    // 找到要删除节点的前一个节点
    while (temp != NULL && temp->data != key) {
        prev = temp;
        temp = temp->next;
    }

    // 如果找到了要删除的节点
    if (temp == NULL) return; // 如果未找到,直接返回

    prev->next = temp->next; // 更新前一个节点的指针,跳过要删除的节点
    free(temp); // 释放删除的节点内存
}

// 打印链表
/**
 * @brief 打印链表的所有节点数据。
 * 
 * @param head 链表的头节点。
 */
void printList(struct Node* head) {
    struct Node* temp = head; // 从头节点开始遍历链表
    while (temp != NULL) {
        printf("%d ", temp->data); // 打印节点数据
        temp = temp->next; // 移动到下一个节点
    }
    printf("\n"); // 打印换行符
}

int main() {
    struct Node* head = NULL; // 初始化链表头节点为NULL
    int data; // 用于存储用户输入的数据
    char choice; // 用于存储用户的选择

    // 循环添加节点,直到用户选择不添加
    do {
        printf("请输入要添加到链表的数据:");
        scanf("%d", &data);
        append(&head, data);
        printf("是否继续添加?(y/n):");
        scanf(" %c", &choice);
    } while (choice == 'y' || choice == 'Y');

    printf("原始链表:\n");
    printList(head); // 打印原始链表

    int key; // 用于存储用户要删除的节点数据
    printf("请输入要删除的节点值:");
    scanf("%d", &key);
    deleteNode(&head, key); // 删除指定节点

    printf("删除节点值为%d后的链表:\n", key);
    printList(head); // 打印删除节点后的链表

    return 0;
}

4、输入4行4列二维数组数据,求出最大值,并返回最大值的行跟列

参考答案:

#include <stdio.h>

#define ROWS 4
#define COLS 4

/**
 * 在二维数组中查找最大值及其位置
 * @param arr 二维数组
 * @param maxValue 指向用于存储最大值的整型变量的指针
 * @param maxRow 指向用于存储最大值所在行的整型变量的指针
 * @param maxCol 指向用于存储最大值所在列的整型变量的指针
 */
void findMax(int arr[ROWS][COLS], int *maxValue, int *maxRow, int *maxCol) {
    *maxValue = arr[0][0]; // 初始化最大值为数组的第一个元素
    *maxRow = 0;
    *maxCol = 0;

    // 遍历二维数组以找到最大值及其位置
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            if (arr[i][j] > *maxValue) { // 如果当前元素大于最大值,则更新最大值及其位置
                *maxValue = arr[i][j];
                *maxRow = i;
                *maxCol = j;
            }
        }
    }
}

int main() {
    int arr[ROWS][COLS];

    // 从用户处接收二维数组的数据
    printf("请输入4行4列的二维数组数据:\n");
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            scanf("%d", &arr[i][j]);
        }
    }

    int maxValue, maxRow, maxCol;
    // 调用函数以确定最大值及其位置
    findMax(arr, &maxValue, &maxRow, &maxCol);

    // 输出最大值及其位置
    printf("最大值为:%d\n", maxValue);
    printf("最大值所在位置:第%d行,第%d列\n", maxRow + 1, maxCol + 1);

    return 0;
}

5、自定义一个strcat方法,用函数完成字符串拼接

参考答案:

#include <stdio.h>
#include <string.h>

/**
 * 使用自定义方法拼接两个字符串。
 * @param dest 目标字符串,即拼接后的结果将存储在此字符串中。
 * @param src 源字符串,将被拼接到目标字符串的末尾。
 */
void strcat_custom(char *dest, const char *src) {
    // 找到目标字符串的末尾
    while (*dest != '\0') {
        dest++;
    }

    // 将源字符串的内容复制到目标字符串的末尾
    while (*src != '\0') {
        *dest = *src;
        dest++;
        src++;
    }

    // 在拼接后的字符串末尾添加结束符
    *dest = '\0';
}

int main() {
    char str1[20] = ""; // 定义第一个字符串
    char str2[20] = ""; // 定义第二个字符串

    // 从用户处接收字符串1
    printf("请输入字符串1: ");
    fgets(str1, sizeof(str1), stdin);
    // 移除字符串1中的换行符
    str1[strcspn(str1, "\n")] = '\0';

    // 从用户处接收字符串2
    printf("请输入字符串2: ");
    fgets(str2, sizeof(str2), stdin);
    // 移除字符串2中的换行符
    str2[strcspn(str2, "\n")] = '\0';

    // 使用自定义函数拼接两个字符串
    strcat_custom(str1, str2);

    // 输出拼接后的结果
    printf("拼接后的字符串是: %s\n", str1);

    return 0;
}

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
【程序1】 题目:有1,2,3,4个数字,能组成多少个互不相同且无重复数字的三位数都是多少 1.程序分析:可填在百位,十位,个位的数字都是1,2,3,4.组成所有的排列后再去 掉不满足条件的排列. 2.程序源代码: main() { int i,j,k; printf("\n"); for(i=1;i<5;i++) /*以下为三重循环*/ for(j=1;j<5;j++) for (k=1;k<5;k++) { if (i!=k&&i!=j&&j!=k) /*确保i,j,k三位互不相同*/ printf("%d,%d,%d\n",i,j,k); } } ============================================================== 【程序2】 题目:企业发放的奖金根据利润提成.利润(i)低于或等于10万元时,奖金可提10%;利润高 于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提 成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于 40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于 100万元时,超过100万元的部分按1%提成,从键盘输入当月利润i,求应发放奖金总数 1.程序分析:请利用数轴来分界,定位.注意定义时需把奖金定义成长整型. 2.程序源代码: main() { long int i; int bonus1,bonus2,bonus4,bonus6,bonus10,bonus; scanf("%ld",&i); bonus1=100000*0.1;bonus2=bonus1+100000*0.75; bonus4=bonus2+200000*0.5; bonus6=bonus4+200000*0.3; bonus10=bonus6+400000*0.15; if(i<=100000) bonus=i*0.1; else if(i<=200000) bonus=bonus1+(i-100000)*0.075; else if(i<=400000) bonus=bonus2+(i-200000)*0.05; else if(i<=600000) bonus=bonus4+(i-400000)*0.03; else if(i<=1000000) bonus=bonus6+(i-600000)*0.015; else bonus=bonus10+(i-1000000)*0.01; printf("bonus=%d",bonus); }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员老李头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值