这是本文档旧的修订版!
c语言程序设计基础实验
点击下载
以下是根据题目要求设计的两个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;
}
以上程序覆盖了所有要求,如有需要调整的部分,请告诉我!
评论