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

五、教师评语

目录
相关文章
|
2月前
|
存储 C语言
`scanf`是C语言中用于按格式读取标准输入的函数
`scanf`是C语言中用于按格式读取标准输入的函数,通过格式字符串解析输入并存入指定变量。需注意输入格式严格匹配,并建议检查返回值以确保读取成功,提升程序健壮性。
935 0
|
4月前
|
安全 C语言
C语言中的字符、字符串及内存操作函数详细讲解
通过这些函数的正确使用,可以有效管理字符串和内存操作,它们是C语言编程中不可或缺的工具。
312 15
|
10月前
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
558 23
|
9月前
|
人工智能 Java 程序员
一文彻底搞清楚C语言的函数
本文介绍C语言函数:函数是程序模块化的工具,由函数头和函数体组成,涵盖定义、调用、参数传递及声明等内容。值传递确保实参不受影响,函数声明增强代码可读性。君志所向,一往无前!
344 1
一文彻底搞清楚C语言的函数
|
10月前
|
算法 C语言
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
本文档介绍了如何编写两个子函数,分别求任意两个整数的最大公约数和最小公倍数。内容涵盖循环控制与跳转语句的使用、最大公约数的求法(包括辗转相除法和更相减损术),以及基于最大公约数求最小公倍数的方法。通过示例代码和测试说明,帮助读者理解和实现相关算法。最终提供了完整的通关代码及测试结果,确保编程任务的成功完成。
472 15
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
|
9月前
|
存储 人工智能 程序员
一文彻底搞明白C语言的数组
本文详细介绍了C语言中的数组,包括定义、初始化(静态与动态)、存储方式、访问方法及常用操作,如遍历、修改元素和作为函数参数传递。数组是C语言中最基本的数据结构之一,掌握它对编程至关重要。下篇将介绍二维数组,敬请期待!
482 0
一文彻底搞明白C语言的数组
|
10月前
|
C语言
【C语言程序设计——函数】亲密数判定(头歌实践教学平台习题)【合集】
本文介绍了通过编程实现打印3000以内的全部亲密数的任务。主要内容包括: 1. **任务描述**:实现函数打印3000以内的全部亲密数。 2. **相关知识**: - 循环控制和跳转语句(for、while循环,break、continue语句)的使用。 - 亲密数的概念及历史背景。 - 判断亲密数的方法:计算数A的因子和存于B,再计算B的因子和存于sum,最后比较sum与A是否相等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台对代码进行测试,预期输出如220和284是一组亲密数。 5. **通关代码**:提供了完整的C语言代码实现
219 24
|
10月前
|
存储 C语言
【C语言程序设计——函数】递归求斐波那契数列的前n项(头歌实践教学平台习题)【合集】
本关任务是编写递归函数求斐波那契数列的前n项。主要内容包括: 1. **递归的概念**:递归是一种函数直接或间接调用自身的编程技巧,通过“俄罗斯套娃”的方式解决问题。 2. **边界条件的确定**:边界条件是递归停止的条件,确保递归不会无限进行。例如,计算阶乘时,当n为0或1时返回1。 3. **循环控制与跳转语句**:介绍`for`、`while`循环及`break`、`continue`语句的使用方法。 编程要求是在右侧编辑器Begin--End之间补充代码,测试输入分别为3和5,预期输出为斐波那契数列的前几项。通关代码已给出,需确保正确实现递归逻辑并处理好边界条件,以避免栈溢出或结果
540 16
|
9月前
|
存储 人工智能 Java
一文轻松拿捏C语言的指针的基础使用
本文介绍了C语言中的指针概念,包括直接访问和间接访问内存的方式、指针变量的定义与使用、取址运算符`&`和取值运算符`*`的应用,帮助读者深入理解指针这一C语言的核心概念。君志所向,一往无前!
170 0
|
10月前
|
存储 编译器 C语言
【C语言程序设计——函数】分数数列求和2(头歌实践教学平台习题)【合集】
函数首部:按照 C 语言语法,函数的定义首部表明这是一个自定义函数,函数名为fun,它接收一个整型参数n,用于指定要求阶乘的那个数,并且函数的返回值类型为float(在实际中如果阶乘结果数值较大,用float可能会有精度损失,也可以考虑使用double等更合适的数据类型,这里以float为例)。例如:// 函数体代码将放在这里函数体内部变量定义:在函数体中,首先需要定义一些变量来辅助完成阶乘的计算。比如需要定义一个变量(通常为float或double类型,这里假设用float。
413 3

热门文章

最新文章