数据结构实验之C 语言的函数数组指针结构体知识

简介: 本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。

一、实验目的

1、复习 C 语言中函数、数组、指针、结构体与共用体等的概念。

2、熟悉利用 C 语言进行程序设计的一般方法。

二、实验预习

说明以下 C 语言中的概念

1、 函数:相对独立的函数模块,可以通过调用的方式使用。

2、 数组:把具有相同类型的若干变量按有序的形式组织起来的整体。

3、指针:存储器的一个字节称为一个内存单元,内存单元的编号也叫做地址,于是这个地址就叫做指针。

4、结构体:由若干成员组成的构造类型,内存占用为整体。

5、共用体:由若干成员组成的构造类型,内存占用为最大的一个成员。

三、实验内容和要求

1、调试程序:输出 100 以内所有的素数(用函数实现)。

#include<stdio.h>

int isprime(int n){

    int m;

    for(m=2;m*m<=n;m++)

    if(n%m==0) return 0;

    return 1;

}

int main(){

    int i;

    printf("\n");

    for(i=2;i<100;i++)

          if(isprime(i)==1)

          printf("%4d",i);

    return 0;

}运行结果:

image.gif 编辑

2、 调试程序:对一维数组中的元素进行逆序排列。

#include<stdio.h>

#define N 10

int main(){

int a[N]={0,1,2,3,4,5,6,7,8,9},i,temp;

printf("\nthe original Array is:\n ");

for(i=0;i<N;i++)

    printf("%4d",a[i]);

for(i=0;i<N/2;i++)

    {temp=a[i];

    a[i]=a[N-i-1];

    a[N-i-1]=temp;}

printf("\nthe changed Array is:\n");

for(i=0;i<N;i++)

printf("%4d",a[i]);

return 0;

}运行结果:

image.gif 编辑

3、 调试程序:在二维数组中,若某一位置上的元素在该行中最大,而在该列中最小,则该

元素即为该二维数组的一个鞍点。要求从键盘上输入一个二维数组,当鞍点存在时,把鞍点

找出来。

#include<stdio.h>

#define M 3

#define N 4

int main(){

int a[M][N],i,j,k;

printf("\n 请输入二维数组的数据:\n");

for(i=0;i<M;i++)

    for(j=0;j<N;j++)

    scanf("%d",&a[i][j]);

for(i=0;i<M;i++) /*输出矩阵*/

    {for(j=0;j<N;j++)

          printf("%4d",a[i][j]);

          printf("\n");

    }

for(i=0;i<M;i++){

    k=0;

    for(j=1;j<N;j++) /*找出第 i 行的最大值*/

    if(a[i][j]>a[i][k])

          k=j;

    for(j=0;j<M;j++) /*判断第 i 行的最大值是否为该列的最小值*/

    if(a[j][k]<a[i][k])

          break;

    if(j==M)

    printf("%d,%d,%d\n",a[i][k],i,k);

    }

return 0;

}运行结果:

image.gif 编辑

4、 调试程序:利用指针输出二维数组的元素。

#include<stdio.h>

int main(){

int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};

int *p;

for(p=a[0];p<a[0]+12;p++){

if((p-a[0])%4==0) printf("\n");

printf("%4d",*p);

}

return 0;}

运行结果:

image.gif 编辑

5、 调试程序:设有一个教师与学生通用的表格,教师的数据有姓名、年龄、职业、教研室

四项,学生有姓名、年龄、专业、班级四项,编程输入人员的数据,再以表格输出。

#include <stdio.h>

#define N 10

struct student{

    char name[8]; /*姓名*/

    int age; /*年龄*/

    char job; /*职业或专业*/

    union{

          int cl; /*班级*/

          char office[10]; /*教研室*/

    }depa;

}stu[N];

int main(){

int i,n;

printf("\n 请输入人员数(<10):\n");

scanf("%d",&n);

for(i=0;i<n;i++){ /*输入 n 个人员的信息*/

    printf("\n 请输入第%d 人员的信息:(name age job class/office)\n",i+1);

    scanf("%s %d %c",stu[i].name, &stu[i].age, &stu[i].job);

    if(stu[i].job=='s')scanf("%d",&stu[i].depa.cl);

    else

    scanf("%s",stu[i].depa.office);

}

printf("name age job class/office\n");

for(i=0;i<n;i++){ /*输出*/

    if(stu[i].job=='s')

    printf("%4s %3d %2c    %d\n",stu[i].name, stu[i].age, stu[i].job, stu[i].depa.cl);

    else

    printf("%4s %3d %2c    %s\n",stu[i].name, stu[i].age, stu[i].job, stu[i].depa.office);

}

return 0;

}

输入的数据:

2

Wang 19 s 99061

Li 36 t computer

运行结果:

image.gif 编辑

四、实验小结

实验一:、

素数的判断条件可以为:

  1. i<=n/i
  2. i*i<=n
  3. i<sqrt(n)

在这里我希望用第一种,因为相比较之下2和3的速度较慢,该函数中使用平方是因为,只要看较小的除数存不存在就可以判断是否是素数,减少了循环次数。

实验二:

使用“define“,即宏定义,方便之后数据的修改。程序在编译阶段进行宏替换。

实验3:

使用双循环创建并输出二维数组

先找到行最大的情况下

判断该数是否为该列的最小,若不是,则去下一行寻找。

实验四:

二位数组实际上也是线性存储的。

实验五:

代码将结构体中使用共用体,可以灵活的根据职业的不同来选择不同地点。

class是用来定义类,不可以作为变量名

五、教师评语

目录
相关文章
|
1月前
|
存储 算法 编译器
数据结构实验之矩阵的运算器(二维数组)
本实验旨在通过团队合作,掌握数组和矩阵相关运算的代码实现,包括矩阵的加减、数乘、转置、乘法、n次方及行列式的计算。实验过程中,成员们需分工协作,解决编程难题,最终实现一个功能完备的矩阵计算器。通过本实验,不仅锻炼了编程能力,还加深了对数学概念的理解,同时培养了团队合作精神。
58 4
|
1月前
数据结构实验之串模式匹配问题
本实验旨在掌握串模式匹配技术,通过创建文本文件、实现单词计数与定位功能,最终构建一个包含文件建立、单词统计与定位、程序退出等选项的主菜单,以增强对字符串处理的理解与应用能力。
46 4
|
1月前
|
算法
数据结构实验之最长公共子序列
本实验旨在通过编程实践帮助学生理解串的基本概念及求解最长公共子序列的算法。实验内容包括使用动态规划方法设计并实现算法,以找出给定两序列的最大公共子序列。示例代码展示了如何通过构建状态矩阵和回溯路径来找到解决方案。实验总结指出,`memset()`函数用于内存初始化,且对于特定输入,程序能正确输出最长公共子序列之一。
54 4
|
1月前
|
算法
数据结构实验之操作系统打印机管理器问题
本实验旨在通过实现操作系统中的打印机管理器问题,掌握队列的基本操作如入队、出队等,利用队列的先进先出特性解决先申请先打印的问题。实验包括队列的初始化、入队、出队、打印队列内容等功能,并通过菜单式界面进行交互。实验结果显示基本功能可正常执行,但在连续操作时存在执行失败的情况,需进一步优化。
42 4
|
1月前
|
存储 算法 Perl
数据结构实验之链表
本实验旨在掌握线性表中元素的前驱、后续概念及链表的建立、插入、删除等算法,并分析时间复杂度,理解链表特点。实验内容包括循环链表应用(约瑟夫回环问题)、删除单链表中重复节点及双向循环链表的设计与实现。通过编程实践,加深对链表数据结构的理解和应用能力。
57 4
|
26天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
51 5
|
1月前
|
机器学习/深度学习 存储 算法
数据结构实验之二叉树实验基础
本实验旨在掌握二叉树的基本特性和遍历算法,包括先序、中序、后序的递归与非递归遍历方法。通过编程实践,加深对二叉树结构的理解,学习如何计算二叉树的深度、叶子节点数等属性。实验内容涉及创建二叉树、实现各种遍历算法及求解特定节点数量。
82 4
|
存储 C语言
【C语言】 条件操作符 -- 逗号表达式 -- []下标访问操作符,()函数调用操作符 -- 常见关键字 -- 指针 -- 结构体
【C语言】 条件操作符 -- 逗号表达式 -- []下标访问操作符,()函数调用操作符 -- 常见关键字 -- 指针 -- 结构体
【C语言】——define和指针与结构体初识
【C语言】——define和指针与结构体初识
|
存储 C语言
C语言初识-关键字-操作符-指针-结构体
C语言初识-关键字-操作符-指针-结构体
66 0