aa

这是本文档旧的修订版!


c语言程序设计基础实验

实验3.zip

2024_10_21_c_epx_4.zip

点击下载

以下是根据题目要求设计的两个C语言程序:

(1) insert函数

设计一个char* insert(char* s1, char* s2, int n)函数,在字符串s1的第n个位置插入字符串s2:

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

char* insert(char* s1, char* s2, int n) {
    int len1 = strlen(s1);
    int len2 = strlen(s2);
    char* result = (char*)malloc(len1 + len2 + 1); // 分配新的内存

    if (n > len1) n = len1; // 防止n超出范围

    // 拷贝s1前n个字符
    strncpy(result, s1, n);
    result[n] = '\0';

    // 拼接s2
    strcat(result, s2);

    // 拼接s1剩余部分
    strcat(result, s1 + n);

    return result;
}

int main() {
    char s1[100], s2[100];
    int n;

    printf("请输入字符串s1: ");
    scanf("%s", s1);
    printf("请输入字符串s2: ");
    scanf("%s", s2);
    printf("请输入插入位置n: ");
    scanf("%d", &n);

    char* result = insert(s1, s2, n);
    printf("结果字符串: %s\n", result);

    free(result); // 释放动态分配的内存
    return 0;
}

(2) 改写strcpy函数

利用指针实现char* strcpy(char* s1, char* s2)的功能:

#include <stdio.h>

char* strcpy_custom(char* s1, char* s2) {
    char* p = s1; // 保存起始地址
    while ((*s1++ = *s2++) != '\0'); // 逐字符复制
    return p;
}

int main() {
    char s1[100], s2[100];

    printf("请输入源字符串s2: ");
    scanf("%s", s2);

    strcpy_custom(s1, s2);
    printf("复制结果s1: %s\n", s1);

    return 0;
}

以上代码分别完成了两个任务,运行后输入测试数据即可查看结果。


根据图片中的要求,以下是各题的 C 语言程序实现:

(1) 学生信息的结构体

#include <stdio.h>

typedef struct {
    char name[50];
    int id;
    int age;
} Student;

int main() {
    Student students[5];
    int sum_age = 0, min_age_index = 0;

    // 输入学生信息
    for (int i = 0; i < 5; i++) {
        printf("输入学生%d的姓名、学号和年龄:\n", i + 1);
        scanf("%s %d %d", students[i].name, &students[i].id, &students[i].age);
        sum_age += students[i].age;
        if (students[i].age < students[min_age_index].age) {
            min_age_index = i;
        }
    }

    printf("\n平均年龄: %.2f\n", sum_age / 5.0);
    printf("年龄最小的学生信息: 姓名: %s, 学号: %d, 年龄: %d\n",
           students[min_age_index].name, students[min_age_index].id, students[min_age_index].age);
    return 0;
}

(2) Student_Record 的结构体和排序

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

typedef struct {
    char name[50];
    char birth_date[15];
    float total_score;
} StudentRecord;

int main() {
    StudentRecord students[10];

    // 输入学生信息
    for (int i = 0; i < 10; i++) {
        printf("输入第%d个学生的姓名、出生日期和总分:\n", i + 1);
        scanf("%s %s %f", students[i].name, students[i].birth_date, &students[i].total_score);
    }

    // 按总分排序
    for (int i = 0; i < 9; i++) {
        for (int j = i + 1; j < 10; j++) {
            if (students[i].total_score < students[j].total_score) {
                StudentRecord temp = students[i];
                students[i] = students[j];
                students[j] = temp;
            }
        }
    }

    printf("\n按总分排序的学生信息:\n");
    for (int i = 0; i < 10; i++) {
        printf("姓名: %s, 出生日期: %s, 总分: %.2f\n",
               students[i].name, students[i].birth_date, students[i].total_score);
    }

    return 0;
}

(3) 城市信息的排序

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

typedef struct {
    char name[50];
    int population;
    int culture_level;
} City;

void sortCities(City cities[], int n, int key) {
    for (int i = 0; i < n - 1; i++) {
        for (int j = i + 1; j < n; j++) {
            if ((key == 1 && strcmp(cities[i].name, cities[j].name) > 0) ||
                (key == 2 && cities[i].population < cities[j].population) ||
                (key == 3 && cities[i].culture_level < cities[j].culture_level)) {
                City temp = cities[i];
                cities[i] = cities[j];
                cities[j] = temp;
            }
        }
    }
}

int main() {
    City cities[5];

    // 随机输入城市信息
    for (int i = 0; i < 5; i++) {
        printf("输入第%d个城市的名称、人口和文化程度:\n", i + 1);
        scanf("%s %d %d", cities[i].name, &cities[i].population, &cities[i].culture_level);
    }

    // 排序并显示
    for (int i = 1; i <= 3; i++) {
        sortCities(cities, 5, i);
        printf("\n排序方式 %d 的结果:\n", i);
        for (int j = 0; j < 5; j++) {
            printf("城市: %s, 人口: %d, 文化程度: %d\n",
                   cities[j].name, cities[j].population, cities[j].culture_level);
        }
    }

    return 0;
}

(4) 书名排序

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

typedef struct {
    char title[50];
} Book;

void sortBooks(Book books[], int n) {
    for (int i = 0; i < n - 1; i++) {
        for (int j = i + 1; j < n; j++) {
            if (strcmp(books[i].title, books[j].title) > 0) {
                Book temp = books[i];
                books[i] = books[j];
                books[j] = temp;
            }
        }
    }
}

int main() {
    Book books[10];

    // 输入书名
    for (int i = 0; i < 10; i++) {
        printf("输入第%d本书的书名:\n", i + 1);
        scanf("%s", books[i].title);
    }

    sortBooks(books, 10);

    printf("\n排序后的书名:\n");
    for (int i = 0; i < 10; i++) {
        printf("%s\n", books[i].title);
    }

    return 0;
}

(5-7) 单向链表操作

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

typedef struct Node {
    char name[50];
    int age;
    float salary;
    struct Node* next;
} Node;

Node* createList() {
    Node* head = NULL;
    Node* temp = NULL;

    for (int i = 0; i < 5; i++) {
        Node* newNode = (Node*)malloc(sizeof(Node));
        printf("输入第%d个节点的姓名、年龄和工资:\n", i + 1);
        scanf("%s %d %f", newNode->name, &newNode->age, &newNode->salary);
        newNode->next = NULL;

        if (head == NULL) {
            head = newNode;
        } else {
            temp->next = newNode;
        }
        temp = newNode;
    }
    return head;
}

void displayList(Node* head) {
    Node* temp = head;
    while (temp != NULL) {
        printf("姓名: %s, 年龄: %d, 工资: %.2f\n", temp->name, temp->age, temp->salary);
        temp = temp->next;
    }
}

Node* insertNode(Node* head, int position, char name[], int age, float salary) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    strcpy(newNode->name, name);
    newNode->age = age;
    newNode->salary = salary;

    if (position == 0) {
        newNode->next = head;
        return newNode;
    }

    Node* temp = head;
    for (int i = 0; i < position - 1 && temp != NULL; i++) {
        temp = temp->next;
    }

    if (temp != NULL) {
        newNode->next = temp->next;
        temp->next = newNode;
    }
    return head;
}

Node* deleteNode(Node* head, int position) {
    if (position == 0 && head != NULL) {
        Node* temp = head;
        head = head->next;
        free(temp);
        return head;
    }

    Node* temp = head;
    for (int i = 0; i < position - 1 && temp != NULL; i++) {
        temp = temp->next;
    }

    if (temp != NULL && temp->next != NULL) {
        Node* toDelete = temp->next;
        temp->next = temp->next->next;
        free(toDelete);
    }
    return head;
}

int main() {
    Node* head = createList();
    printf("\n链表内容:\n");
    displayList(head);

    head = insertNode(head, 2, "新节点", 25, 5000.0);
    printf("\n插入后的链表:\n");
    displayList(head);

    head = deleteNode(head, 2);
    printf("\n删除后的链表:\n");
    displayList(head);

    return 0;
}

以上程序覆盖了所有要求,如有需要调整的部分,请告诉我!
请输入您的评论. 可以使用维基语法:
F R R L N
 
  • aa.1733136934.txt.gz
  • 最后更改: 2024/12/02 18:55
  • doge24190