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

五、教师评语

目录
相关文章
|
11天前
|
C语言
【C语言程序设计——函数】亲密数判定(头歌实践教学平台习题)【合集】
本文介绍了通过编程实现打印3000以内的全部亲密数的任务。主要内容包括: 1. **任务描述**:实现函数打印3000以内的全部亲密数。 2. **相关知识**: - 循环控制和跳转语句(for、while循环,break、continue语句)的使用。 - 亲密数的概念及历史背景。 - 判断亲密数的方法:计算数A的因子和存于B,再计算B的因子和存于sum,最后比较sum与A是否相等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台对代码进行测试,预期输出如220和284是一组亲密数。 5. **通关代码**:提供了完整的C语言代码实现
50 24
|
7天前
|
存储 C语言
【C语言程序设计——函数】递归求斐波那契数列的前n项(头歌实践教学平台习题)【合集】
本关任务是编写递归函数求斐波那契数列的前n项。主要内容包括: 1. **递归的概念**:递归是一种函数直接或间接调用自身的编程技巧,通过“俄罗斯套娃”的方式解决问题。 2. **边界条件的确定**:边界条件是递归停止的条件,确保递归不会无限进行。例如,计算阶乘时,当n为0或1时返回1。 3. **循环控制与跳转语句**:介绍`for`、`while`循环及`break`、`continue`语句的使用方法。 编程要求是在右侧编辑器Begin--End之间补充代码,测试输入分别为3和5,预期输出为斐波那契数列的前几项。通关代码已给出,需确保正确实现递归逻辑并处理好边界条件,以避免栈溢出或结果
46 16
|
7天前
|
存储 编译器 C语言
【C语言程序设计——函数】分数数列求和2(头歌实践教学平台习题)【合集】
函数首部:按照 C 语言语法,函数的定义首部表明这是一个自定义函数,函数名为fun,它接收一个整型参数n,用于指定要求阶乘的那个数,并且函数的返回值类型为float(在实际中如果阶乘结果数值较大,用float可能会有精度损失,也可以考虑使用double等更合适的数据类型,这里以float为例)。例如:// 函数体代码将放在这里函数体内部变量定义:在函数体中,首先需要定义一些变量来辅助完成阶乘的计算。比如需要定义一个变量(通常为float或double类型,这里假设用float。
19 3
|
7天前
|
存储 算法 安全
【C语言程序设计——函数】分数数列求和1(头歌实践教学平台习题)【合集】
if 语句是最基础的形式,当条件为真时执行其内部的语句块;switch 语句则适用于针对一个表达式的多个固定值进行判断,根据表达式的值与各个 case 后的常量值匹配情况,执行相应 case 分支下的语句,直到遇到 break 语句跳出 switch 结构,若没有匹配值则执行 default 分支(可选)。例如,在判断一个数是否大于 10 的场景中,条件表达式为 “num> 10”,这里的 “num” 是程序中的变量,通过比较其值与 10 的大小关系来确定条件的真假。常量的值必须是唯一的,且在同一个。
11 2
|
11天前
|
存储 编译器 C语言
【C语言程序设计——函数】回文数判定(头歌实践教学平台习题)【合集】
算术运算于 C 语言仿若精密 “齿轮组”,驱动着数值处理流程。编写函数求区间[100,500]中所有的回文数,要求每行打印10个数。根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码。如果操作数是浮点数,在 C 语言中是不允许直接进行。的结果是 -1,因为 -7 除以 3 商为 -2,余数为 -1;注意:每一个数据输出格式为 printf("%4d", i);的结果是 1,因为 7 除以 -3 商为 -2,余数为 1。取余运算要求两个操作数必须是整数类型,包括。开始你的任务吧,祝你成功!
41 1
|
2月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
284 9
|
2月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
44 1
|
11天前
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
127 75
|
11天前
|
存储 C++ 索引
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】初始化队列、销毁队列、判断队列是否为空、进队列、出队列等。本关任务:编写一个程序实现环形队列的基本运算。(6)出队列序列:yzopq2*(5)依次进队列元素:opq2*(6)出队列序列:bcdef。(2)依次进队列元素:abc。(5)依次进队列元素:def。(2)依次进队列元素:xyz。开始你的任务吧,祝你成功!(4)出队一个元素a。(4)出队一个元素x。
34 13
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
|
11天前
|
存储 C语言 C++
【C++数据结构——栈与队列】链栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现链栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储整数,最大
35 9