实验指导带答案(上)

更新时间:2023-10-06 16:11:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验8 数组(二)

一、实验目的

1.掌握一维数组和二维数组的定义、赋值和输入输出的方法 2.掌握字符数组和字符串函数的使用 3.掌握与数组相关的算法(排序算法)

二、实验内容及步骤

1. 找出一个二维数组中的鞍点,即该位置上的元素在所在行为最大,在所在列为

最小。如果没有这样的元素,请打印出相应的信息。

(1) 画出此题的流程图。

(2) 编写程序求矩阵中所有的鞍点并上机调试。 (3) 输入的数据和输出的结果要详细记录。 参考程序: #include\void main()

{

int a[4][4],i,j,min,m,n,max; for(i=0;i<4;i++) for(j=0;j<4;j++)

scanf(\ for(i=0;i<4;i++) {

max=a[i][0];

for(j=i+1;j<4;j++) if(a[i][j]>max) {

max=a[i][j]; n=j;

}

min=a[0][i]; for(j=i+1;j<4;j++) if(a[j][i]

min=a[j][i]; m=j; } }

if(max==min)

printf(\ else

printf(\没有鞍点\}

2.统计一个班的学生成绩。要求程序具有如下功能: (1) 每个学生的学号和四门功课的成绩从键盘读入。 (2) 计算每个学生的总分和平均分。

(3) 按平均成绩进行排序,输出排序后的成绩单(包括学号、四门功课的成绩和平均分),给出名次。如果分数相同,则名次并列,其他学生名次不变。 提示: 调试程序时,可先输入少量学生的成绩作为实验数据。如可输入3名学生4门课成绩:

学号 成绩

9701 67,72,65,80 9702 75,82,94,95 9703 70,74,80,76 参考程序: main() {

int i,j,k,n;

static int score[1000][7],temp; printf(\请输入第%d个学生的学号和成绩并按回车(学号和成绩之间用空格隔开,成绩之间用逗号隔开,输完后按回车:

printf(\请输入学生的人数:\scanf(\for(i=1;i<=n;i++) {

\

scanf(\re[i][1],&score[i][2],&score[i][3],&score[i][4]); score[i][5]=(score[i][1]+score[i][2]+score[i][3]+score[i][4])/4;

}

for(i=1;i<=n-1;i++) for(j=i+1;j<=n;j++)

if(score[i][5]

for(k=0;k<6;k++) {

temp=score[i][k];

}

for(i=1;i<=n;) { score[i][6]=i; j=1; }

while(score[i][5]==score[i+j][5]) { } i=i+j;

score[i+j][6]=i; j++;

for(i=1;i<=n;i++) printf(\第%d名的学生学号为%d,

score[i][k]=score[j][k];

平均成绩为%d\\n\

score[j][k]=temp; }

实验9 函数(一)

一、实验目的

1. 理解和掌握多模块的程序设计与调试的方法 2. 掌握函数的定义和声明函数的方法

3. 熟悉调用函数时实参和形参的对应关系,以及“值传递”的方式 二、实验内容及步骤

1. 用函数实现两个整数交换,设计一个函数swap,实现两个整数的交换。要求:在主函数中定义两个整型变量并初始化,然后调用swap函数对两变量的值进行真正交换,

最后输出交换后的两变量的值(分析用值传递和地址传递两种方式的结果,体会引用的作用)。 参考程序1(采用值传递) swap(int m,int n) {

int temp; temp=m; m=n; n=temp;

printf(\请输入两个数分别负值给x和y,用逗号隔开:\

scanf(\

printf(\交换之前x=%d,

y=%d\\n\ swap(x,y);

printf(\交换之后y=%d\\n\}

x=%d,

}

main() {

int x,y;

注意:在这里,采用值传递,只是把形式参数m和n的值交换了,而实参x和y的值并没有交换。

参考程序2(采用地址传递) swap(int *m,int *n) { int temp; temp=*m;

*m=*n; *n=temp; }

main()

{

int x,y;

printf(\请输入两个数分别负值给x和y,用逗号隔开:\ scanf(\

printf(\交换之前x=%d,y=%d\\n\swap(&x,&y);

printf(\交换之后x=%d,y=%d\\n\}

2.在主函数中输入一个十进制数,调用转换函数把这个十进制数转换成二、八、十六

进制数。

参考程序(该程序仅限于转换十进制整数): erjinzhi(int n) {

int i,k; int a[50];

for(i=0;i<20;i++) { if(n==0)break;

a[i]=n%2; n=n/2;

shiliujinzhi(int n) {

printf(\}

main() {

int n;

printf(\请输入一个十进制整数:\

scanf(\

printf(\转换为二进制为:\erjinzhi(n);

printf(\转换为八进制为:\

}

for(k=i-1;k>=0;k--) printf(\printf(\

}

bajinzhi(int n) {

printf(\}

bajinzhi(n);

printf(\转换为十六进制为:\

shiliujinzhi(n); }

3. 定义一个函数,判断三个整形边长能否构成三角形,如果是三角形,则判断它是否是直角三角形。

1) 声明函数judge;

2) 实现函数judge,根据输入的三个边长判断是否可以构成一个三角形; 3) 在main中调用judge;

4) 在main中根据judge的返回值判断是否是三角形,如果构成三角形则判断是

否为直角三角形,并给出结论。 参考程序:

judge(int m,int n,int k) {

if(m+n>k && m+k>n && n+k>m) {

printf(\输入的三条边可以构成三角形,\

if(m*m+n*n==k*k

||

m*m+k*k==n*n || k*k+n*n==m*m) printf(\并且可以构成直角三角形!\\n\

else printf(\但是不能构成直角三角形!\\n\

}

else printf(\输入的三条边不能构成三角形!\\n\} main() {

int x,y,z;

实验10 函数(二)

一、实验目的

1.进一步理解和掌握多模块的程序设计与调试的方法 2.熟悉函数的嵌套调用和递归调用的方法 3.练习并掌握数组作为函数参数的用法 二、实验内容及步骤

1. 编写程序,对n个数从小到大排序。

(1) 任选一种排序方法进行编程。 (2) 用sort()函数进行排序。

(3) 在主函数中输入数据,调用sort()函数,分别打印出排序前和排序后的结果。 参考程序:

#include a[j]=tmp; #define N 10 int a[N];

void sort()

{ int i,j,tmp;

for(i=0;i

for(j=i+1;ja[j]) {

tmp=a[i]; a[i]=a[j];

} }

main() {

int i;

printf(\请输入%d数:\\n\

for(i=0;i

printf(\ printf(\}

printf(\请输入三条边长,并用逗号隔开,按回车结束:\ scanf(\);

judge(x,y,z); }

个整

for(i=0;i

printf(\ sort();

printf(\排序之后:\

2.两数组对应元素的交换,设计一函数swap,实现对应元素的交换。

要求:在主函数中定义两个长度相同的整型数组A和B并初始化,然后调用swap函数

把两数组的对应元素值进行交换,最后输出交换后的这两个数组的内容。 参考程序:

swap(int aa[],int bb[],int n) { int i,temp;

for(i=0;i

{

temp=aa[i];

}

}

aa[i]=bb[i]; bb[i]=temp;

main()

{

int A[10]={1,2,3,4,5,6,7,8,9,10},B[10]={11,12,13,14,15,16,17,18,19,20}; int i;

printf(\交换之前:\\n数组A的值为:\

for(i=0;i<10;i++) printf(\printf(\数组B的值为:\for(i=0;i<10;i++)

printf(\swap(A,B,10);

printf(\交换之后:\\n数组A的值为:\for(i=0;i<10;i++) printf(\printf(\数组B的值为:\for(i=0;i<10;i++)

printf(\ printf(\}

3.用递归的方法编写函数求Fibonacci级数,观察递归调用的过程。 参考程序: #include long fib(int n) { int a;

if(n==1) a=1; else if(n==2) a=1; else

a=fib(n-1)+fib(n-2); return a;

}

main() { int h;

printf(\请输入级数h:\scanf(\

fib(h); printf(\级数%d的Fibonacci数为%d\\n\

}

实验11 指针(一)

一、实验目的

1. 理解指针和地址的概念,了解指针变量类型的含义

2. 掌握指针变量的初始化、赋值、运算和移动操作,以及通过指针引用变量的方法 3. 掌握取变量的地址、数组元素的地址以及字符串地址的方法

4. 理解数组名与地址值的关第。掌握通过指针或地址引用数组元素的方法 5. 能正确使用字符串的指针和指向字符串的指针变量

二、实验内容及步骤

1. 编写程序:定义一个变量,一个指针,建立该变量的引用。对变量进行初始化,并

将指针指向该变量,分别通过指针和引用改变该变量的值,并输出结果进行比较分析。 参考程序:

#include int main() { int a; int* ptr;

a = 10;

printf(“a的值为:%d\\n”, a);

*ptr = 20; printf(“通过指针修改后,a的值为:%d\\n”, a);

ptr = &a; }

2. 编写程序:任意输入10个整数放于数组中,利用指针访问数组,求出该数组中的最大数max以及最小数min。 参考程序: #include int main(void) {

int a[10]; int *p; int i,min,max; p=a;

printf(“请输入10个数:”); for(i=0;i<10;i++)

scanf(“%d”,p+i); p = a ;

min=max=*p ;

if(*p>max) {

max=*p ; }

else if(*p

min=*p ; } p++ ; }

printf(“最小值为%d,最大值为%d\\n”,min,max);

for(i=0;i<10;i++) } {

3. 编写程序:定义字符串,删掉字符串中的数字字符。 参考程序:

#include #define N 50

void delchar (char *p) { char *q=p; }

实验12 指针(二)

一、实验目的

1. 进一步掌握指针的应用

2. 能正确使用数组的指针和指向数组的指针变量 3. 能正确使用字符串的指针和指向字符串的指针变量 4. 理解函数指针

二、实验内容及步骤

1. 写一函数,求一个字符串的长度。

(1) 本部分要求全部用指针完成;

for (;*p!=NULL;p++) if((*p<'0')||(*p>'9')) *q++=*p; *q='\\0';

int main(void) {

char c[N]={NULL},*pt=c; printf(\输入一个字符串:\gets(pt);

delchar (pt);

printf (\删除数字以

后:%s\\n\}

(2) 在main函数中输入字符串,并输出其长度;

(3) 本题不能使用strlen()函数; 方法说明:

在主函数中定义一个指向字符串的指针变量pstr,并将输入的字符串的首地址赋值

给pstr,然后调用求字符串长度的函数strlenth(char *p),得到字符串的长度。在函数strlenth(char *p)中,判断*p是否为’\\0’,如果不为’\\0’,则进行len++的操作,直到遇到’\\0’为止。然后返回len值。

参考程序:

#include int strlenth(char *p) {

int len=0; while(1) {

if (p[len]=='\\0') break; len++; } return len; }

{

char str[100]; char *pstr=str;

printf(\ gets(str); // 这样输入允许字符串中夹带空白

//scanf(\ //这样输入不能 夹带空白

printf(\%d\\n\(pstr)); }

int main()

2. 编写一个函数,将数组中n个数按反序存放。 (1) 在主函数中输入10个数,并输出排好序的数。 (2) 编写函数invert()将10个数按反序存放。

参考程序:

#include \

void invert(int *p,int n) {

int i,temp; int *q; q=p+n-1;

for(i=1;i<=n/2;i++) {

temp=*p; *p=*q; *q=temp; p++; q--;

int a[10]; int i; int *p=a;

printf(\请输入10个数字:\

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

scanf(\

}

invert(p,10);

printf(\反序以后:\ for(i=0;i<10;i++) { }

printf(\

} }

int main() {

printf(\}

3. 设一个函数,调用它时,每次实现不同的功能:(1)求两个数之和;(2)求两个数之差;(3)求两个数之积。实验步骤与要求:

(1)在主函数中输入2个数a,b,并输出a,b的和、差和乘积。

(2)分别编写函数add()、sub()、mul()计算两个数的和、差、积。 (3) 编写函数process(),分别调用函数add()、sub()、mul()。 参考答案: #include void add(int a, int b) {

int c = a + b;

printf(\}

void sub(int a, int b) {

int c = a - b;

printf(\}

void mul(int a, int b) {

int c = a * b;

printf(\} }

实验13 结构体和共用体(一)

一、实验目的

1. 掌握结构体类型和结构体变量的定义 2. 掌握结构类型变量的定义和使用 3. 掌握结构体数组的定义和初始化 4. 结构体变量和数组的应用 二、实验内容及步骤

1.下面程序是定义一个结构体,并为其定义结构体变量,对其值输入、输出。(原来给出的程序有错误,改正之后的程序如下) #include struct worker work2,work3; struct worker { int num; char sex;

float salary;

}work1={100,'m',1034.5}; main() {

char m,n,t;

该程序的运行结果是:

如果输入的是m,则输出结果为:

1034.500000,100,m

2.有五个学生,每个学生的数据包括学号,姓名,三门课的成绩,从键盘输入五个学生的数据,要求打印出每个学生的平均成绩,以及最高分的学生的数据(包括学号,

work2=work1; work3.num=300; m=getchar(); work3.sex=m;

work3.salary=1256.4;

printf(\

ary,work2.num,work3.sex);

}

void process(int a, int b) {

add(a, b); sub(a, b); mul(a, b); } int main()

{

int a, b;

printf(\请输入两个数: \ scanf(\

printf(\他们的和是: %d\\n\ printf(\他们的差是: %d\\n\ printf(\他们的积是: %d\\n\ process(a,b);

姓名,三门课的成绩,平均分数)。

要求:用一个函数输入五个学生的数据;用一个函数求总平均分;用函数找出最高分学生数据,总平均分和最高分的学生的数据都在主函数中输出。

参考程序:

#include #define N 5 int i,j,maxi;

float sum,max,average; struct student {

char num[6]; char name[8]; float score[3]; float avr; }stu[N];

void shuruchengji() //通过该函数输入学号,姓名和成绩

{

for(i=0;i

printf(\请输入第%d个学生的学号:\

scanf(\ printf(\请输入第%d个学生的姓名:\

scanf(\

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

{

printf(\请输入

第%d个学生的学号第%d门成绩:\

scanf(\

}

} }

void ave() { average=0; max=0; maxi=0;

for(i=0;i

{

sum=0;

for(j=0;j<3;j++) sum+=stu[i].score[j]; stu[i].avr=sum/3;

average=average+stu[i].avr;

if(sum>max) { max=sum; maxi=i;

}

}

average/=N; }

int main() {

shuruchengji(); ave();

printf(\学号 姓名 成绩1 成绩2 成绩3 平均成绩\\n\

for(i=0;i

printf(\tu[i].name);

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

printf(\]);

printf(\

}

printf(\平均成绩=%5.2f\\n\

printf(\最高分:学生学号:%s,学生姓名%s\\n\].name);

printf(\成绩:科目1:%6.2f,科目2:%6.2f,科目3:%6.2f,平均成绩:%5.2f.\\n%u[maxi].avr);

}

实验14 结构体和共用体(二)

一、实验目的

1. 掌握指向结构体类型的指针

2. 掌握共用体的概念和使用 3. 熟练掌握链表的简单操作 二、实验内容及步骤

1.运行下面程序,写出结果

#include struct exam { long num; char name[10]; char sex; float score; };

main()

{

stud1,*p=&stud1;

struct

exam

stud1.num=200101;

strcpy(stud1.name,\ch=getchar(); stud1.sex=ch; (*p).score=543;

printf(\

,p->sex,p->score,p->name);

}

假设输入m,运行结果为: 200101,m,543.000000,wang

char ch;

2.运行下面程序,写出结果。

#include union list

{ long w; float x; char y; };

main()

{ union list data;

data.w=1234;

scanf(“%f”,&data.x); data.y=’M’;

printf(“%ld\\t%f\\t%c\\n”,

data.w,data.x,data.y);

}

将该程序中的共用体和结构体对比起来理解。 3.定义结点如下形式:(不要) struct menu {

char name; int no;

struct menu *next; };

进行如下操作:

(1) 建立一个长度为10的,如上面形式的链表;

(2)在建立的链表中,插入一个新结点(位置自定);内容如下: { name=cc1j

no=2211

(3)删除第三个结点;

next=选定的结点 }

实验15 文件操作

一、实验目的

1.掌握文件建立的方法。

2. 掌握包含文件操作的程序设计和调试方法。 二、实验内容及步骤

1.从键盘输入一个字符串,,将其中的小写字母全部转换成大写字母,然后输出到一

个磁盘文件“test”中保存。输入的字符串以“!”结束。 参考程序:

#include void convert(char *str) {

while (*str!='\\0')

{

if (*str>='a' && *str<='z')

{

*str-=32;

} main() { }

FILE *fp;

char str[100];

fp = fopen(\gets(str); convert(str); fputs(str,fp); fclose(fp);

}

*str++; }

2.建立一个磁盘文件“emploee”,内存放职工的数据。每个职工的数据包括:职工

姓名、职工号、性别、年龄、住址、工资、文化程度。要求将职工号、职工名、

工资的信息单独抽出来另建一个职工工资文件。 (1)调试程序,输入数据并运行程序。

(2)用type命令显示新建立的文件内容。

三、问题讨论

1.缓冲文件系统和非缓冲文件系统的区别?

2.文件打开和关闭的含义?为什么要打开和关闭文件

实验16 综合实验报告

一、实验目的

能综合运用本课程所学内容进行结构化程序设计 二、 实验内容及步骤

一个简单的学生通讯录(包含学号、姓名、电话)

1. 运用数据类型(基本、指针、构造)完成程序的数据类型部分的设计; 2. 运用基本结构语句(顺序、选择、循环)完成程序的结构部分的设计; 3. 运用文件管理方法把数据存储到磁盘文件中。 要求:

学生数据包括:学号、姓名、电话号码

程序包括的函数有:主控函数、数据输入函数、数据输出函数、插入数据函数和删除数据函数。

12

本文来源:https://www.bwwdw.com/article/pk7d.html

Top