20241313 刘鸣宇 《计算机基础与程序设计》第13周学习总结

作业信息

这个作业属于哪个课程 <班级的链接>(如2024-2025-1-计算机基础与程序设计
这个作业要求在哪里 <作业要求的链接>(如2024-2025-1计算机基础与程序设计第一周作业)
这个作业的目标 <写上具体方面>
作业正文 ... 本博客链接

教材学习内容总结

《C语言程序设计》第十二章结构体与数据结构基础

  1. 结构体(Structure)

    • 结构体的定义和使用:如何声明结构体类型,以及如何创建和使用结构体变量。
    • 结构体成员的访问:使用点(.)和箭头(->)运算符访问结构体成员。
    • 结构体数组:创建和操作结构体数组,以及如何遍历结构体数组。
    • 结构体与函数:如何将结构体作为参数传递给函数,以及如何从函数返回结构体。
  2. 数据结构基础

    • 数据结构的概念:介绍数据结构的基本概念,包括数据的组织、存储和管理方式。
    • 线性数据结构:如数组、链表等,介绍它们的结构、特点和基本操作。
    • 非线性数据结构:如树、图等,介绍它们的结构、特点和基本操作。
  3. 链表(Linked List)

    • 链表的定义:链表是一种动态数据结构,由节点组成,每个节点包含数据和指向下一个节点的指针。
    • 单链表:介绍单链表的创建、插入、删除和遍历操作。
    • 双向链表和循环链表:介绍这两种链表的特点和基本操作。
  4. 栈(Stack)

    • 栈的定义:栈是一种遵循后进先出(LIFO)原则的数据结构。
    • 栈的实现:使用数组或链表实现栈,介绍栈的基本操作,如入栈(push)、出栈(pop)和查看栈顶元素。
  5. 队列(Queue)

    • 队列的定义:队列是一种遵循先进先出(FIFO)原则的数据结构。
    • 队列的实现:使用数组或链表实现队列,介绍队列的基本操作,如入队(enqueue)、出队(dequeue)和查看队头元素。
  6. 树(Tree)

    • 树的定义:树是一种层次结构的数据结构,由节点组成,每个节点可以有零个或多个子节点。
    • 二叉树:介绍二叉树的定义、特点和基本操作,如遍历(前序、中序、后序遍历)。
  7. 图(Graph)

    • 图的定义:图是一种复杂的非线性数据结构,由顶点和边组成。
    • 图的表示:邻接矩阵和邻接表两种常见的图表示方法。
    • 图的遍历:深度优先搜索(DFS)和广度优先搜索(BFS)。
  8. 排序和查找算法

    • 排序算法:介绍几种基本的排序算法,如冒泡排序、选择排序、插入排序等。
    • 查找算法:介绍几种基本的查找算法,如线性查找和二分查找。
      思维导图
      《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()函数的过程中,暴露出我对文件那部分的函数的使用注意事项不清楚,对文件部分的函数的掌握还不够熟练,文件部分的函数的使用最好要一一对应,而不要混乱使用。

posted @ 2024-12-22 17:19  Camellia×  阅读(10)  评论(0编辑  收藏  举报