数据结构实验之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是用来定义类,不可以作为变量名

五、教师评语

目录
相关文章
|
4月前
|
算法 数据处理 C语言
C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合
本文深入解析了C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合,旨在帮助读者掌握这一高效的数据处理方法。
124 1
|
14天前
|
存储 人工智能 程序员
一文彻底搞明白C语言的数组
本文详细介绍了C语言中的数组,包括定义、初始化(静态与动态)、存储方式、访问方法及常用操作,如遍历、修改元素和作为函数参数传递。数组是C语言中最基本的数据结构之一,掌握它对编程至关重要。下篇将介绍二维数组,敬请期待!
25 0
一文彻底搞明白C语言的数组
|
24天前
|
定位技术 C语言
c语言及数据结构实现简单贪吃蛇小游戏
c语言及数据结构实现简单贪吃蛇小游戏
|
2月前
|
搜索推荐 C语言
数据结构(C语言)之对归并排序的介绍与理解
归并排序是一种基于分治策略的排序算法,通过递归将数组不断分割为子数组,直到每个子数组仅剩一个元素,再逐步合并这些有序的子数组以得到最终的有序数组。递归版本中,每次分割区间为[left, mid]和[mid+1, right],确保每两个区间内数据有序后进行合并。非递归版本则通过逐步增加gap值(初始为1),先对单个元素排序,再逐步扩大到更大的区间进行合并,直至整个数组有序。归并排序的时间复杂度为O(n*logn),空间复杂度为O(n),且具有稳定性,适用于普通排序及大文件排序场景。
|
3月前
|
传感器 算法 安全
【C语言】两个数组比较详解
比较两个数组在C语言中有多种实现方法,选择合适的方法取决于具体的应用场景和性能要求。从逐元素比较到使用`memcmp`函数,再到指针优化,每种方法都有其优点和适用范围。在嵌入式系统中,考虑性能和资源限制尤为重要。通过合理选择和优化,可以有效提高程序的运行效率和可靠性。
238 6
|
4月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
107 5
|
4月前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
4月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
106 1
|
4月前
|
容器
在使用指针数组进行动态内存分配时,如何避免内存泄漏
在使用指针数组进行动态内存分配时,避免内存泄漏的关键在于确保每个分配的内存块都能被正确释放。具体做法包括:1. 分配后立即检查是否成功;2. 使用完成后及时释放内存;3. 避免重复释放同一内存地址;4. 尽量使用智能指针或容器类管理内存。
|
4月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
66 1