作业信息
这个作业属于哪个课程 | <班级的链接>(如2024-2025-1-计算机基础与程序设计) |
---|---|
这个作业要求在哪里 | <作业要求的链接>(如2024-2025-1计算机基础与程序设计第一周作业) |
这个作业的目标 | <写上具体方面> |
作业正文 | ... 本博客链接 |
教材学习内容总结
《C语言程序设计》第十二章结构体与数据结构基础
-
结构体(Structure):
- 结构体的定义和使用:如何声明结构体类型,以及如何创建和使用结构体变量。
- 结构体成员的访问:使用点(
.
)和箭头(->
)运算符访问结构体成员。 - 结构体数组:创建和操作结构体数组,以及如何遍历结构体数组。
- 结构体与函数:如何将结构体作为参数传递给函数,以及如何从函数返回结构体。
-
数据结构基础:
- 数据结构的概念:介绍数据结构的基本概念,包括数据的组织、存储和管理方式。
- 线性数据结构:如数组、链表等,介绍它们的结构、特点和基本操作。
- 非线性数据结构:如树、图等,介绍它们的结构、特点和基本操作。
-
链表(Linked List):
- 链表的定义:链表是一种动态数据结构,由节点组成,每个节点包含数据和指向下一个节点的指针。
- 单链表:介绍单链表的创建、插入、删除和遍历操作。
- 双向链表和循环链表:介绍这两种链表的特点和基本操作。
-
栈(Stack):
- 栈的定义:栈是一种遵循后进先出(LIFO)原则的数据结构。
- 栈的实现:使用数组或链表实现栈,介绍栈的基本操作,如入栈(push)、出栈(pop)和查看栈顶元素。
-
队列(Queue):
- 队列的定义:队列是一种遵循先进先出(FIFO)原则的数据结构。
- 队列的实现:使用数组或链表实现队列,介绍队列的基本操作,如入队(enqueue)、出队(dequeue)和查看队头元素。
-
树(Tree):
- 树的定义:树是一种层次结构的数据结构,由节点组成,每个节点可以有零个或多个子节点。
- 二叉树:介绍二叉树的定义、特点和基本操作,如遍历(前序、中序、后序遍历)。
-
图(Graph):
- 图的定义:图是一种复杂的非线性数据结构,由顶点和边组成。
- 图的表示:邻接矩阵和邻接表两种常见的图表示方法。
- 图的遍历:深度优先搜索(DFS)和广度优先搜索(BFS)。
-
排序和查找算法:
- 排序算法:介绍几种基本的排序算法,如冒泡排序、选择排序、插入排序等。
- 查找算法:介绍几种基本的查找算法,如线性查找和二分查找。
思维导图
《C语言程序设计》第四版第十二章
│
├── 结构体
│ ├── 结构体定义
│ │ └── struct 关键字
│ ├── 结构体变量
│ │ ├── 声明
│ │ └── 初始化
│ ├── 结构体成员访问
│ │ ├── 点运算符 (.)
│ │ └── 箭头运算符 (->)
│ └── 结构体数组
│ └── 遍历和操作
│
├── 数据结构基础
│ ├── 数据结构概念
│ └── 线性与非线性结构
│
├── 线性数据结构
│ ├── 数组
│ └── 链表
│ ├── 单链表
│ │ ├── 节点定义
│ │ ├── 插入操作
│ │ └── 删除操作
│ ├── 双向链表
│ └── 循环链表
│
├── 非线性数据结构
│ ├── 栈
│ │ ├── 后进先出 (LIFO)
│ │ └── 基本操作
│ ├── 队列
│ │ ├── 先进先出 (FIFO)
│ │ └── 基本操作
│ └── 树
│ ├── 二叉树
│ │ ├── 遍历方法
│ │ └── 特点
│ └── 图
│ ├── 顶点和边
│ ├── 邻接矩阵
│ └── 邻接表
│
└── 排序与查找算法
├── 排序算法
│ ├── 冒泡排序
│ ├── 选择排序
│ └── 插入排序
└── 查找算法
├── 线性查找
└── 二分查找
基于AI的学习
代码练习
include <stdio.h>
include <stdlib.h>
include <string.h>
define N 40
typedef struct
{
long num;
char name[10];
int score[3];
int z;
float p;
} STUDENT;
void READ(STUDENT x[],int n);
void CALCULATE(STUDENT x[],int n);
void RANK1(STUDENT x[],int n);
void RANK2(STUDENT x[],int n);
void SEARCH(STUDENT x[],int n);
void Printf(STUDENT x[],int n);
void WriteFILE(STUDENT x[],int n);
void READFILE(STUDENT x[],int n);
int main()
{
int n;
int y;
STUDENT x[N];
printf("1.Append record\n2.Caculate total and average score of every student\n3.Sort in ascending order by total score of every student\n4.Sort in dictionary order by name\n5.Search by name\n6.Write to a file\n7.Read from a file\n0.Exit\n");
do
{
printf("Please enter your choice:");
scanf("%d",&y);
switch(y)
{
case 1:
printf("Please input the student number:");
scanf("%d",&n);
READ(x,n);
break;
case 2:
CALCULATE(x,n);
Printf(x,n);
break;
case 3:
RANK1(x,n);
Printf(x,n);
break;
case 4:
RANK2(x,n);
Printf(x,n);
break;
case 5:
SEARCH(x,n);
break;
case 6:
WriteFILE(x,n);
break;
case 7:
READFILE(x,n);
Printf(x,n);
break;
}
}
while(y!=0);
}
void READ(STUDENT x[],int n)
{
int i;
for(i=0; i<n; i++)
{
printf("Input record:");
scanf("%ld %s %d %d %d",&x[i].num,&x[i].name,&x[i].score[0],&x[i].score[1],&x[i].score[2]);
}
}
void CALCULATE(STUDENT x[],int n)
{
int i;
for(i=0; i<n; i++)
{
x[i].z=x[i].score[0]+x[i].score[1]+x[i].score[2];
x[i].p=x[i].z/3.0;
}
}
void RANK1(STUDENT x[],int n)
{
int i,j;
int k;
STUDENT t;
for(i=0; i<n-1; i++)
{
k=i;
for(j=i+1; j<n; j++)
{
if(x[k].z<x[j].z)
k=j;
}
if(k!=i)
{
t=x[i];
x[i]=x[k];
x[k]=t;
}
}
}
void RANK2(STUDENT x[],int n)
{
int i,j;
int k;
STUDENT t;
for(i=0; i<n-1; i++)
{
k=i;
for(j=i+1; j<n; j++)
{
if(strcmp(x[k].name,x[j].name)>0)
k=j;
}
if(k!=i)
{
t=x[i];
x[i]=x[k];
x[k]=t;
}
}
}
void SEARCH(STUDENT x[],int n)
{
int i;
char m[10];
getchar();
printf("Please input the name:");
scanf("%s",m);
for(i=0; i<n; i++)
{
if(strcmp(m,x[i].name)0)
printf("%10ld%8s%4d%4d%4d%8d%8.2f\n",
x[i].num,x[i].name,
x[i].score[0],x[i].score[1],x[i].score[2],
x[i].z,x[i].p);
}
}
void Printf(STUDENT x[],int n)
{
int i;
for(i=0; i<n; i++)
{
printf("%10ld%8s%4d%4d%4d%8d%8.2f\n",
x[i].num,x[i].name,
x[i].score[0],x[i].score[1],x[i].score[2],
x[i].z,x[i].p);
}
}
void WriteFILE(STUDENT x[],int n)
{
FILE *fp;
int i;
if((fp=fopen("score.txt","w"))NULL)
{
printf("Failure to open score.txt!\n");
exit(0);
}
for(i=0; i<n; i++)
{
fprintf(fp,"%10ld%8s%4d%4d%4d%8d%8.2f\n",
x[i].num,x[i].name,
x[i].score[0],x[i].score[1],x[i].score[2],
x[i].z,x[i].p);
}
/fwrite(x,sizeof(STUDENT),n,fp);/
fclose(fp);
}
void READFILE(STUDENT x[],int n)
{
FILE *fp;
int i;
if((fp=fopen("score.txt","r"))==NULL)
{
printf("Failure to open score.txt!\n");
exit(0);
}
for(i=0; i<n; i++)
{
fscanf(fp,"%ld%s%d%d%d%d%f\n",
&x[i].num,x[i].name,
&x[i].score[0],&x[i].score[1],&x[i].score[2],
&x[i].z,&x[i].p);
}
/*fread(x,sizeof(STUDENT),n,fp);*/fclose(fp);
}
第一个点就是在第一个问题中的fgets()函数中,fgets()函数在读入时会把换行符\n也读入,导致我输入的是姓名\n,因此与结构体中的姓名字符串数组中的姓名不一样,导致了搜索函数的出错。第二个就是fwrite()函数与fread()函数的使用,这两个函数在写入文件和从文件中读取时虽然代码简便,但也存在一些问题。在编写代码时前后更换fwrite()函数、fread()函数、fprintf()函数、fscanf()函数的过程中,暴露出我对文件那部分的函数的使用注意事项不清楚,对文件部分的函数的掌握还不够熟练,文件部分的函数的使用最好要一一对应,而不要混乱使用。