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;

}

以上程序覆盖了所有要求,如有需要调整的部分,请告诉我!

请输入您的评论. 可以使用维基语法:
W T P P X
 
  • aa.1733135450.txt.gz
  • 最后更改: 2024/12/02 18:30
  • doge24190