(3)C语言实验

时间:2024.4.14

《C语言程序设计》课程实验指导书

第一部分 前言

一、实验的目的

学习C程序设计课程不能满足于“懂得了”,满足于能看懂书上的程序,而应当熟练地掌握程序设计的全过程,即独立编写源程序、独立上机调试、独立运行程序和分析结果。

上机实验的目的,绝不仅仅是为了验证教材和讲课的内容,或者验证自己所编写的程序的正确与否。程序设计课程上机实验的目的是:

1.加深对讲授内容的理解,尤其是一些语法规定。通过实验来掌握语法规则是行之有效的方法。

2.熟悉所用的操作系统。

3.学会上机调试程序。通过反复调试程序掌握根据出错信息修改程序的方法。

4.通过调试完善程序。

二、实验前的准备工作

1.了解所用的计算机系统(包括C编译系统)的性能和使用方法。

2.复习和掌握与本实验有关的教学内容。

3.准备好上机所需的程序,切忌不编程或抄别人的程序去上机。

4.对程序中出现的问题应事先估计,对程序中自己有疑问的地方应先作上记号,以便上机时给予注意。

5.准备好调试程序和运行程序所需的数据。

三、实验的步骤

上机实验应一人一组,独立实验。上机过程中出现的问题,除了是系统的问题以外,不要轻易举手问老师。尤其对“出错信息”,应善于分析判断,找出出错的行,然后检查该行或其上一行。上机实验一般应包括以下几个步骤:

1.双击桌面Visual C++快捷方式进入Visual C++,或通过执行“开始=>程序=>

Microsoft Visual Studio 6.0=> Microsoft Visual C++6.0”或执行文件"C:\Program Files\Microsoft Visual Studio\COMMON\MSDev98\Bin\MSDEV.EXE"。

2.单击“文件”菜单的“新建”命令。

3.在打开的“新建”对话框中选择“文件”标签。

4.选择C++ Source File,选择文件保存位置,然后在文件输入栏中输入文件名。如图所示:

5.输入源程序。

6.编译程序:按“Ctrl+F7”或通过“编译”菜单中的“编译”命令,或使用工具栏中的相应工具进行编译                 编译   连接  运行

若程序有错则找到出错行修改程序。

7.连接:若程序没有语法错误,则可按功能键F7或执行“编译”菜单中的“构件”命令或通过工具栏中的相关工具(编译工具右边工具),进行连接生成可执行文件。

8.运行程序:按组合键“Ctrl+F5”,或通过“编译”菜单中的执行命令,或通过工具栏中的“”工具运行程序。

四、写好实验报告

实验报告应包括以下内容:

1.实验目的。

2.实验内容。

3.程序清单。

4.运行结果。

5.对运行结果的分析,以及本次调试程序所取得的经验。

五、实验任务与时间安排 

六、教材

《C程序设计(第三版)》潭浩强著 清华大学出版社


第二部分 实验内容

实验一 C程序的运行环境和运行一个C程序的方法

一、实验目的

1.了解所用的计算机系统。

2.了解在该系统上如何进行编辑、编译、连接和运行一个C程序。

3.通过运行简单的C程序了解C程序的特点。

二、实验内容和步骤

1.熟悉所用的系统。了解Windows资源管理器的使用方法:文件的查看、复制、运行等方法,Visual C++所在目录,文本文件的建立方法。

2.进入Visual C++,并新建一个C++源程序文件。

3.熟悉Visual C++的集成环境,了解各菜单项有哪些子菜单。

4.输入下面的程序(教材中的例1.1),注意区分大小写。

#include<stdio.h>

void main()

{

printf("This is a C program.\n");

}

编译并运行程序。

5.关闭工作区,新建一个程序,然后对教材中的例1.2重复4中的操作(即只将程序改为例1.2中的程序,其它操作步骤相同)。

6.关闭工作区,新建一个程序,然后输入并运行一个需要在运行时输入数据的程序

#include<stdio.h>

void main()

{int a,b,c;

int  max(int x,int y);

printf("input a and b:");

scanf("%d,%d",&a,&b);

c=max(a,b);

printf("\nmax=%d",c);

}

int  max(int x,int y)

{int z;

if(x>y) z=x;

else  z=y;

return(z);

}

(1)运行程序,若程序有错,则修改错误后继续运行程序,当没有错误信息时输入:2,5并按Enter键,查看运行结果。

(2)将程序的第三行改为:int a;b;c;然后按F9看结果如何,将其修改为int a,b,c;将子程序max的第3,4行合并为一行,运行程序,看结果是否相同。

7.运行一个自己编写的程序,程序的功能是输出两行文字。

实验二 数据类型、运算符和表达式

一、实验目的

1.掌握C语言数据类型,熟悉如何定义一个整型、字符型和实型的变量,以及对它们赋值的方法。

2.掌握不同数据类型之间赋值的规律。

3.学会使用C的有关算术运算符,以及包含这些运算符的表达式,特别是自加(++)和自减(――)运算符的使用。

4.进一步熟悉C程序的编辑、编译、连接和运行的过程。

二、实验内容和步骤

1.输入并运行下面的程序

#include<stdio.h>

void main()

{char  c1,c2;

c1='a';

c2='b';

printf("%c %c",c1,c2);

}

(1)运行此程序

(2)加入下面的一个语句作为“}”前的最后一个语句:

printf("%d,%d\n",c1,c2);

(3)将第3行改为:

int  c1,c2;

然后再运行程序,并观察结果是否相同。

(4)将第3行改为int  c1,c2;将第4,5行依次改为:

c1=a;c2=b;

c1="a";c2="b"

c1=300;c2=400;

每改为一次后运行程序,观察结果。

2.分析教材第3章习题3.6中的程序的运行结果,然后输入该程序并运行,将运行结果与前面分析的结果对比。

3.输入并运行下面的程序

#include<stdio.h>

void main()

{int a,b;

unsigned c,d;

long e,f;

a=100;

b=-100;

e=50000;

f=32767;

c=a;

d=b;

printf("%d,%d\n",a,b);

printf("%u,%u\n",a,b);

printf("%u,%u\n",c,d);

c=a=e;

d=b=f;

printf("%d,%d\n",a,b);

printf("%u,%u\n",c,d);

}

请对照程序和运行结果分析:

(1)将一个负整数赋给一个无符号的变量,会得到什么结果。画出它们在内存中的表示形式。

(2)将一个大于32767的长整数赋给一个整型变量,会得到什么结果。画出它们在内存中的表示形式。

(3)将一个长整数赋给无符号的变量,会得到什么结果。画出它们在内存中的表示形式。

4.输入习题3.10

(1)运行程序,注意i,j,m,n的值。

(2)将第4,5行改为:

m=i++;

n=++j;

再运行。

(3)将程序改为:

#include<stdio.h>

void main()

{int i,j;

i=8;j=10;

printf("%d,%d\n",++i,++j);

i=8;j=10;

printf("%d,%d\n",i++,j++);

i=8;j=10;

printf("%d,%d\n",++i,i);

i=8;j=10;

printf("%d,%d\n",i++,i);

}

运行程序并分析运行结果。

5.按习题3.7的要求编程并上机运行:

要将“China”译成密码,密码规律是:用原来的字母后面第4个字母代替原来的字母。例如,字母“A”后面第4个字母是“E”,用“E”代替“A”,因此,“China”应译为“Glmre”。请编一程序,用赋初值的方法使c1、c2、c3、c4、c5这5个变量的值分别为’C’,'h', 'i','n', 'a',经过计算,使c1、c2、c3、c4、c5分别变为:'G','l','m',r','e',并输出.

程序提示:

main函数算法如下:

 定义char型变量 c1,c2,c3,c4,c5;

 给字符型变量赋值

  c1=c1+4;

c2=c2+4;

  c3=c3+4;

  c4=c4+4;

   c5=c5+4;

输出c1,c2,c3,c4,c5


实验三 最简单的C程序设计

一、实验目的

1.掌握C语言中使用最多的一种语句――赋值语句的使用方法。

2.掌握各种类型数据的输入输出方法,能正确使用各种格式输出符。

二、实验内容和步骤

1.掌握各种格式输出符的使用方法。

#include<stdio.h>

void main()

{int a,b;

float  d,e;

char  c1,c2;

double  f,g;

long n,m;

unsigned  p,q;

a=61;b=62;

c1='a';c2='b';

d=3.56; e=-6.87;

f=3156.890121;g=0.123456789;

m=50000;n=-60000;

p=32768;q=40000;

printf("a=%d,b=%d\nc1=%c,c2=%c\nd=%6.2f,e=%6.2f\n",a,b,c1,c2,d,e);

printf("f=%15.6f,g=%15.12f\nm=%ld,n=%ld\np=%u,q=%u\n",f,g,m,n,p,q);

}

(1)运行此程序并分析运行结果。

(2)在此基础上,修改程序的第9-14行:

a=61;b=62;

c1=a;c2=b;

f=3156,890121;g=0.123456789;

d=f;e=g;

p=a=m=50000;q=b=n=-60000;

运行程序,分析运行结果。

(3)将9-14行改为以下的scanf语句,即用scanf函数接收从键盘输入的数据:

scanf("%d,%d,%c,%c,%f,%f,%lf,%lf,%ld,%ld,%u,%u",&a,&b,&c1,&c2,&d,&e,&f,&g,&m,&n,&p,&q);

运行程序(无错误的情况下)输入数据如下:

61,62,a,b,3.56,-6.87,3156,890121,0.123456789,50000,-60000,32768,40000

2.按习题3.8的要求编写程序并运行:

 设圆半径r=1.5,圆柱高h=3,求圆周长、圆面积,圆球表面积、圆球体积、圆柱体体积。用scanf输入数据,输出计算结果,输出时要有文字说明,取小数后2位数字。

程序提示:

#define PI 3.14159

main算法如下

    定义float型变量 r,h,L,s1,s2,v1,v2;

    用scanf语句输入圆半径和圆柱高

    求圆周长、面积、圆球表面积、圆柱体体积

输出圆周长、圆面积、圆球表面积、圆球体体积

程序中的π用PI代替。

3.编写程序,用getchar函数读入两个字符给c1,c2,然后分别用putchar函数和printf函数输出这两个字符。


实验四 选择结构程序设计

一、实验目的

1.了解C语言表示逻辑值的方法。

2.学会正确使用逻辑运算符和逻辑表达式的方法。

3.熟悉if语句和switch语句。

4.结合程序掌握一些简单的算法。

5.学习调试程序的方法。

二、实验内容

本实验要求编程解决以下问题,然后上机调试运行程序。

1.

用scanf函数输入x的值,求y的值。

程序提示

main函数结构如下:

定义实型变量x与y

使用scanf函数输入x的值

if x<1

   y=x

else 

if  x<10

     y=2x-1

else

     y=3x-11

输出x的值与y的值

2.给出一个百分制的成绩,要求输出成绩等级A,B,C,D,E。90分及以上为A,80-89为B,70-79为C,60-69为D,60分以下为E。要求从键盘输入成绩,然后输出相应等级,分别用if语句和switch语句实现。

程序提示

(1)使用if语句的main函数结构如下:

定义float型变量score,char型变量grade

输入百分制成绩赋给score

if  score>=90

grade='A'

else  if  score>=80

grade='B'

else  if  score>=70

grade='C'

else  if  score>=60

grade='D'

else  grade='E'

输出百分制成绩和等级。

(2)使用switch语句的main函数结构如下:

定义float型变量score,char型变量grade

输入百分制成绩赋给score

switch(int(score/10))

{

case  10:

case  9:   grade='A';break;

case  8:   grade='B';break;

case  7:   grade='C';break;

case  6:   grade='D';break;

default:   grade='E';break;

}

输出百分制成绩和等级

3.编程实现:输入一个不多于5位的正整数,要求:(1)输出它是几位数,(2)分别输出每一位数字,(3)按逆序输出各位数字,如原数为321,则应输出123。

应准备以下测试数据

要处理的数为1位正整数;

要处理的数为2位正整数;

要处理的数为3位正整数;

要处理的数为4位正整数;

要处理的数为5位正整数;

除此之外,程序还应当对不合法的输出作必要的处理。例如:

输入负数;

输入的数超过5位;

程序提示:main函数结构如下:

定义long型变量num,int型变量c1,c2,c3,c4,c5

输入一个不超过5位的正整数赋给num

if  num>99999

输出:输入的数超过5位

else if  num<0

输出:输入的数是一个负数

else

{

求得num的各位数分别赋给C1,C2,C3,C4,C5

c1=num/10000;

       c2=(num-c1*10000)/1000;

       c3=(num/100)%10;

       c4=(num/10)%10;

       c5=num%10;

       if(c1>0)

              {printf("\n%ld是一个5位数\n",num);

            printf("其各位分别为:%1d,%1d,%1d,%1d,%1d\n",c1,c2,c3,c4,c5);

               printf("逆序输出为:%1d%1d%1d%1d%1d\n",c5,c4,c3,c2,c1);

               }

else if(c2>0) 是4位数,输出其各位,格式与5位数类似

else if(c3>0) 是3位数,输出其各位,格式与5位数类似

else if(c4>0) 是2位数,输出其各位,格式与5位数类似

else if(c5>0) 是1位数,输出其各位,格式与5位数类似

}

4.编程实现:输入4个整数,要求按由小到大的顺序输出。得到正确结果后,修改程序使之按由大到小的顺序输出。

main函数结构如下:

int a,b,c,d,t;

    输入4个整数:赋给a,b,c,d;

    if(a>b) 交换a,b

    if(a>c) 交换a,c

    if(a>d) 交换a,d

    if(b>c) 交换b,c

    if(b>d) 交换b,d

    if(c>d) 交换c,d

    输出a,b,c,d


实验五 循环控制

一、实验目的

熟悉使用while语句,do-while语句和for语句实现循环的方法。掌握在程序设计中用循环的方法实现一些常用算法(如穷举、迭代、递推等)。

二、实验内容

1.上机完成习题6.1:输入两个正整数m和n,求出它们的最大公约数和最小公倍数。

输入时,使m<n,观察结果是否正确;

再输入时使m>n,观察结果是否正确;

修改程序使对任何的整数都能得到正确的结果。

程序提示

main结构如下:

int m,n,r,tm,tn;

       输入两个正整数赋给m,n

       tm=m;tn=n;

       if(m<n)交换m,n

       r=m%n;

       while(r)

       {

              m=n;

              n=r;

              r=m%n;

       }

       输出最大公约数n和最小公倍数m*tn/n;

2.编写程序利用公式:求e的近似值,精确到小数后6位

程序提示

main函数算法为:

定义int型变量n,i,double型变量e,p,t

输入n的值

e=1;t=1;p=1;i=1

while(t>=1e-7)

{e=e+t;

 i++;

p=p*i;

t=1.0/p;

}

输出e的值

3.编程求1到n中能被3或7整除的数之和。分别用for循环语句和while循环语句完成本题。

程序提示

for循环语句的主要算法如下:

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

    if i能被3或7整除

    sum=sum+i

while循环语句的主要算法如下:

while(i<=n)

    if i能被3或7整除

    sum=sum+i++;

4.上机完成习题6.10:猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉了一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少桃子。

在得到正确结果后,修改题目,改为每天早上都吃了前一天剩下的一半加二个,请修改程序,并运行,检查运行结果是否正确。

程序提示

使用以下循环结构

x=1

for(i=9;i>=1;i--)

x=2*x+1


实验六 数组

一、实验目的

1.掌握一维数组与二维数组的定义、赋值及输入输出方法。

2.掌握字符数组和字符串函数的使用。

3.掌握与数组有关的算法(特别是排序算法)

二、实验内容

1.用选择法对10个整数排序。10个整数用scanf函数输入。

程序提示

输入10个整数存放到数组a的a[1]到a[10]中

输出10个数

for(i=1;i<10;i++)

       {

              min=i;

              for(j=i+1;j<=10;j++)

                  if(a[min]>a[j]) min=j;

              交换a[i]与a[min]

       }

输出排序后的10个数

2.有15个数存放在一个数组中,输入一个数要求用折半查找法找出该数是数组中的第几个元素的值,如果该数不在数组中,则输出无此数,要找的数用scanf函数输入。

程序提示

用循环语句输入15个数

调用排序算法对其进行排序

while(flag)

       {

              输入要查找的数

              loca=0;

              top=0;

              bott=N-1;

              if(number<a[0]||number>a[N-1]) loca=-1;

              while(sign==1&&top<=bott&&loca>=0)

              {

                     mid=(bott+top)/2;

                     if(number==a[mid])

                            {loca=mid;

                          printf("找到了,数%d在数组的第%d位、\n",number,loca+1);

                             sign=0;}

                     else if(number<a[mid])        bott=mid-1;

                          else top=mid+1;

              }

              if(sign==1||loca==-1) printf("\n查无此数\n");

              printf("\n是否继续查找?(Y/N)");

              scanf("%c",&c);getchar();

              printf("\n");

              if(c=='N'||c=='n') flag=0;

       }

3.将两个串连接起来,不要用strcat函数。

程序提示

分别输入二个串字符

       i指向第一个数组的最后一个空数组元素

       while(s2[j]!='\0')

              s1[i++]=s2[j++];

       s1[i]='\0';

输出连接后的字符串

4.找出一个二维数组的“鞍点”,即该位置上的元素在该行上最大,在该列上最小。也可能没有鞍点。至少准备两组测试数据:

(1)二维数组有鞍点

9   80   205   40

90  -60  96    1

  210  -3  101   89

(2)二维数组没有鞍点

   9     80    205    40

  90    -60     96     1

 210    -3     101    89

  45    54     156     7

  用scanf函数从键盘输入数组的各元素的值,检查结果是否正确,题目未指定二维数组的行数和列数,程序应能处理任意行数和列数的数组。

程序提示

输入矩阵

flag2=0;//矩阵中无鞍点

       for(i=0;i<n;i++)//找第i行的鞍点

       {

              max=a[i][0];maxj=0;

              用for循环语句找第i行的最大值存放在max中,其下标j保存到maxj中

              for(k=0,flag1=1;k<n&&flag1;k++)//判断max是否在该列上最小flag1=0则不是最小

                   if(max>a[k][maxj]) flag1=0;//max不是该列的最小元素

              if(flag1)

              {

                     printf("\n第%d行第%d列的%d是鞍点\n",i+1,maxj+1,max);

                     flag2=1;

              }

       }//endfori

       if(!flag2) printf("\n矩阵中无鞍点\n");


实验七 函数

一、实验目的

1.掌握定义函数的方法。

2.掌握函数实参及形参的对应关系以及“值传递”方式。

3.掌握函数的嵌套调用和递归调用的方法。

4.掌握全局变量和局部变量,动态变量、静态变量的概念和使用方法。

5.学会对多文件程序的编译和运行。

二、实验内容

1.写出一个判别素数的函数,在主函数输入一个整数,输出是否素数的信息。本程序应准备以下测试数据:17,34,2,1,0,分别输入数据,运行程序并检查结果是否正确。

程序提示

求素数函数如下:

int prime(int n)

{if n<2  return 0

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

              if  n能被i整除 return 0;

       return 1;

}

main函数中输入一个整数赋给变量n,通过prime(n)判断其是否素数,若函数值为1则是素数否则不是素数。

2.用一个函数来实现将一行字符串中最长的单词输出。此行字符从主函数传递给该函数。(1)把两个函数放在同一个程序文件中。

(2)将两个函数分别放在两个程序文件中,作为两个文件进行编译、连接和运行。

程序提示

寻找最长单词的起始位置函数:

int longest(char string[])

//n为字符串的长度,len为每个单词的长度

//length为最长单词的长度,point为最长单词的起始位置

//函数返回最长单词的起始位置

{

       int len=0,i,n,length=0,flag=,place=0,point;

       n=strlen(string);

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

              if  string[i]为英文字母

                     if(flag) {point=i;flag=0;}

                     else len++;

              else

              {

                     flag=1;

                     if(len>=length)

                     {

                            length=len;

                            place=point;

                            len=0;

                     }

              }

              return place;

}

在main函数中输入一行字符,然后调用上面函数取得最长字符的开始位置,从该位置开始输入数组元素,直到输出的数组元素不是英文字母时止。

3.用递归法将一个整数n转换成字符串。例如输入483.应输出字符串“483”。n的位数不确定,可以是任意的整数。

程序提示

void convert(int n)

{

       int i;

       if((i=n/10)!=0)

              convert(i);

       putchar(n%10+'0');

}

在main函数中输入一个整数,然后先输出该数的符号,然后调用函数convert(n)。

4.求两个整数的最大公约数和最小公倍数。用一个函数求最大公约数用另一个函数根据求出的最大公约数求最小公倍数。分别用下面的两种方法编程。

(1)不用全局变量,在主函数中输入两个数和输出结果。

(2)用全部变量的方法,数据的传递通过全部变量的方法。

程序提示

使用下面函数求最大公因子,其中v为最大公因子,若将v设为外部变量,则可不使用return语句。

int hcf(int u,int v)//求最大公因子

{

       int t,r;

       if(v>u){t=u;u=v;v=t;}

       while((r=u%v)!=0)//余数r不为0时继续作辗转相除法

       {u=v;v=r;}

       return(v);

}

5.写一个函数,输入一个十六进制数,输出相应的十进制数。

程序提示

输入时将十六进制数作为一个字符串输入,然后将其每一个字符转换成十进制数并累加,转换方法如下:

if(s[i]>'0'&&s[i]<='9')

                     n=n*16+s[i]-'0';

              if(s[i]>='a'&&s[i]<='f')

                     n=n*16+s[i]-'a'+10;

              if(s[i]>='A'&&s[i]<='F')

                     n=n*16+s[i]-'A'+10;


实验八 编译预处理

一、实验目的

1.掌握宏定义的方法。

2.掌握文件包含处理方法。

3.掌握条件编译的方法。

二、实验内容

1.定义一个带参数的宏,使两个参数的值互换。在主函数中输入两个数作为使用宏的实参,输出已交换后的两个值。

程序提示

使用以下宏定义:

#define SWAP(a,b) t=b;b=a;a=t

调用格式:SWAP(a,b);

2.设计输出实数的格式,包括:(1)一行输出一个实数,(2)一行内输出两个实数,(3)一行内输出三个实数。实数用%6.2f格式输出。用一个文件printf_format.h包含以上用#define命令定义的格式,编写一程序,将printf_format.h包含到程序中,在程序中用scanf函数读入三个实数给f1,f2,f3,然后用上面定义的三格式分别输出:f1; f1,f2;f1,f2,f3。

程序提示

使用以下宏定义:

#define PR printf

#define NL "\n"

#define Fs "%f"

#define F "%6.2f"

#define F1 F NL

#define F2 F "\t" F NL

#define F3 F"\t" F"\t" F NL

然后再建立一个C程序,程序内容如下

#include<stdio.h>

#include"p_f.h"

void main()

{

  float f1,f2,f3;

  PR("Input three floating numbers f1,f2,f3:\n");

  scanf(Fs,&f1);

  scanf(Fs,&f2);

  scanf(Fs,&f3);

  PR(NL);

  PR("Output one floating number each line:\n");

  PR(F1,f1);

  PR(F1,f2);

  PR(F1,f3);

  PR(NL);

  PR("Output two number each line:\n");

  PR(F2,f1,f2);

  PR(NL);

  PR("Output three number each line:\n");

  PR(F3,f1,f2,f3);

}


实验九 指针

一、实验目的

1.通过实验进一步掌握指针的概念,会定义和使用指针变量。

2.能正确使用数组的指针和指向数组的指针变量。

3.能正确使用字符串的指针和指向字符串的指针变量。

4.能正确使用指向函数的指针变量。

5.了解指向指针的指针的概念及其使用方法。

二、实验内容

以下程序要求使用指针处理。

1. 输入三个整数,按由小到大的顺序输出。运行无错后改为:输入三个字符串,按由小到大的顺序输出。

程序提示

先排序,排序时交换两个数使用以下函数:

void swap(int *p1.int *p2)

{

  int p;

  p=*p1;

  *p1=*p2;

  *p2=p;

}

调用格式为:swap(&a,&b)可实现a与b的交换

字符串的交换使用以下函数:

void swap(char *p1,char *p2)

{

       char p[80];

       strcpy(p,p1);strcpy(p1,p2);strcpy(p2,p);

}

main函数结构如下:

int n1,n2,n3,*p1,*p2,*p3;

         void swap(int *p1,int *p2);

         输入三个数或三个字符串

         p1,p2,p3分别指向这三个数

         if(n1>n2) swap(p1,p2);

         if(n1>n3) swap(p1,p3);

         if(n2>n3) swap(p2,p3);

         输出这三个数

2.将一个3×3的矩阵转置,用一函数实现。

在一主函数中用scanf函数输入以下矩阵元素:

1  3  5

7  9  11

13 15 17

将数组名作为函数参数,在执行函数的过程中实现矩阵转置,函数调用结束后在主函数中输出转置后的矩阵。

程序提示:使用下面函数实现矩阵转置

void move(int *p)

{

       int i,j,t;

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

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

              {

                     t=*(p+3*i+j);

                     *(p+3*i+j)=*(p+3*j+i);

                     *(p+3*j+i)=t;

              }

}

main函数结构如下:

       int a[3][3],*p,i;

       void move(int *p);

       用for循环语句输入矩阵

       p=&a[0][0];

       move(p);

       输出矩阵

3.有n人围成一个圈,顺序排号,从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

程序提示:报数程序段如下:

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

              *(p+i)=i+1;

       i=0;//i为现正报数的人的编号

       k=0;//k为1.2.3计数时的计数变量

       m=0;//m为退出的人数

       while(m<n-1)

       {

              if(*(p+i)!=0)k++;

              if(k==3)//对退出的人的编号置0

              {

                     *(p+i)=0;

                     k=0;

                     m++;

              }

              i++;

              if(i==n)i=0;

       }

4.用一个函数实现两个字符串的比较,即自己写一个strcmp函数,函数的原型为:

int  strcmp(char  *p1,char  *p2);

设p1指向字符串s1,p2指向字符串s2.要求当两个字符相同时返回0,若两个字符串不相等,则返回返回它们二者第一个不同字符的ASCII码的差值。两个字符串s1,s2由主函数输入,strcmp函数的返回值也由主函数输出。

程序提示:使用以下函数进行比较:

int strcmp(char *p1,char *p2)

{

       int i=0;

       while(*(p1+i)==*(p2+i))

              if(*(p1+i++)=='\0') return 0;

       return *(p1+i)-*(p2+i);

}

5.写一个用矩形法求定积分的通用函数,分别求:

说明:积分中用到的三个函数已在系统的数学函数库中,程序开头要加#include<math.h>

调用格式为sin(x),cos(x),exp(x)

程序提示:求积分函数如下:

float integral(float (*p)(float),float a,float b,int n)

{

       int i;

       float x,h,s;

       h=(b-a)/n;

       x=a;

       s=0;

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

       {

              x=x+h;

              s=s+(*p)(x)*h;

       }

       return(s);

}

调用格式:

float (*p)(float);

float fsin(float);

p=fsin;

c=integral(p,a1,b1,n);

fsin函数如下:

float fsin(float x)

{return sin(x);}

6.用指向指针的指针的方法对n个整数排序并输出。要求将排序单独写成一个函数,n和各整数在主函数中输入,最后在主函数中输出。

程序提示:排序函数如下:

void sort(int **p,int n)

{

       int i,j,*temp;

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

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

              if(**(p+i)>**(p+j))

                     {temp=*(p+i); *(p+i)=*(p+j); *(p+j)=temp;}

}

main函数如下:

void main()

{

       void sort(int **p,int n);

       int i,n,data[10],**p,*pstr[10];

       printf("Input n:");

       scanf("%d",&n);

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

              pstr[i]=&data[i];

       printf("\nInput %d integer number:\n",n);

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

              scanf("%d",pstr[i]);

       p=pstr;

       sort(p,n);

       printf("\nNow,the sequence is:\n");

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

              printf("%5d",*pstr[i]);

       printf("\n");

}


实验十 结构体和共用体

一、实验目的

1.掌握结构体类型变量的定义和使用。

2.掌握结构体类型数组的概念和使用。

3.掌握链表的概念,初步学会对链表进行操作,学会在函数之间传送链表的方法。

4.掌握共用体的概念与使用。

二、实验内容

编写一个程序使用动态链表实现下面的功能:

  1. 建立一个链表用于存储学生的学号、姓名和三门课程的成绩和平均成绩
  2. 输入学号后输出该学生的学号、姓名和三门课程的成绩
  3. 输入学号后删除该学生的数据
  4. 插入学生的数据
  5. 输出平均成绩在80分及以上的记录
  6. 退出

要求用循环语句实现B--E的多次操作

程序提示:参照教材中建立链表程序

链表头指针的传递使用return语句,或使用二级指针,请参考上课课件

说明:本实验为设计性实验,程序由学生自己完成,实验报告打印后上交,源程序同时上交

实验十一 位运算

一、实验目的

1.掌握按位的概念和方法,学会使用位运算符。

2.学会通过位运算实现对某些位的操作。

二、实验内容

1.编写一个程序,检查所用的计算机系统的C编译在执行右移时是按照逻辑右移的原则,还是按照算术右移的原则进行操作。如果是逻辑右移,则请编写一个函数实现算术右移,若是算术右移,则请编写一个函数实现逻辑右移。

程序提示

unsigned getbits1(unsigned value,int n)

{

       unsigned z;

       z=~0;

       z=z>>n;

       z=~z;

       z=z|(value>>n);

       return(z);

}

unsigned getbits2(unsigned value,int n)

{

       unsigned z;

       z=(~(1>>n))&(value>>n);

       return z;

}

main函数内容如下:

int a,n,m;

       unsigned getbits1(unsigned value,int n);

       unsigned getbits2(unsigned value,int n);

       a=~0;

       if((a>>5)!=a)

       {

              printf("\nlogical move!\n");

              m=0;

       }

       else

       {

              printf("\n arithmetic move!\n");

              m=1;

       }

       printf("Input an octal number:");

       scanf("%o",&a);

       printf("\nHow many digit move owards the right:");

       scanf("%d",&n);

       if(m==0)

              printf("\nArithmetic right move,result:%o\n",getbits1(a,n));

       else

              printf("Logical right move,result:%o",getbits2(a,n));

2.编写一个函数getbits,从一个16位的单元中取出某几位(即这几位保留原值,其余位为0),函数调用形式为:

getbits(value,n1.n2)

value为该16位数的值,n1为欲取出的起始位,n2为欲取出的结束位。要求用八进制数输出这几位。注意,应先将这几位右移到最右端,然后用八进制形式输出。

程序提示

unsigned getbits(unsigned value,int n1.int n2)

{

       unsigned z;

       z=~0;

       z=(z>>n1)&(z<<(16-n2));

       printf("%o",z);

       z=value&z;

       z=z>>(16-n2);

       return z;

}

3.设计一个函数,使给出一个函数的原码,输出该数的补码。

程序提示

unsigned getbits(unsigned value)

{

  unsigned int z;

  z=value&0100000;

  if(z==0100000)

z=~value+1;

  else

z=value;

  return z;

}


实验十二 文件

一、实验目的

1.掌握文件、缓冲文件系统、文件指针的概念。

2.学会使用文件的打开、关闭、读、写等文件操作函数。

3.学会用缓冲文件系统对文件进行简单的操作。

二、实验内容

1.建立一个程序,用于产生200组算式,每组算式包括一个两位数的加法、减法(要求被减数要大于减数)、乘法和两位数除以一位数的除法算式,每一组为一行,将所有的算式保存到文本文件d:\a.txt中

程序提示

#include<stdio.h>

#include<stdlib.h>

void main()

{FILE *fp;

int i,a,b,t;

fp=fopen("d:\\a.txt","w");

for(i=1;i<=200;i++)

  {

    a=rand()%100;b=rand()%100;

     if(b<2) b=b+2;

    fprintf(fp,"\t%2d+%2d=   ",a,b);

    a=rand()%100;b=rand()%100;

     if(a<b) {t=a;a=b;b=t;}

    fprintf(fp,"\t%2d-%2d=   ",a,b);

    a=rand()%100;b=rand()%100;

    fprintf(fp,"\t%2d×%2d=   ",a,b);

    a=rand()%100;b=rand()%10;

     if(b<2) b=b+2;if(a<10) a=a+10;

    fprintf(fp,"\t%2d÷%2d=   ",a,b);

    fprintf(fp,"\n");

}

fclose(fp);

}

2.在WORD中打开d:\a.txt文件,查看文件内容是否正确

3.向d:\a.txt文件追加100组算式,每组算式包括一个一位数的加法、减法。

程序提示:对1题程序进行适当修改(修改打开方式与循环语句)。

更多相关推荐:
科学实验报告评语

1书写认真干净实验步骤清晰2书写整齐实验数据真实明确3书写杂乱4实验目的明确经过数据分析等到的结果很好5实验过程有些乱但总体还好6实验设计合理数据正确7通过这份实验报告可以看出你能很好的完成实验8看了这份实验报...

实验报告封皮及评语

此处写学校名称实习报告姓名学号系部专业班级指导教师实习名称实习时间实习单位xxxxxxxxxxxxxxx处制成绩评定

01实验报告模板(带评语)

石家庄铁道大学实验报告课程名称管理信息系统任课教师陈艳春实验日期班级姓名学号

实验报告模板(带评语)

石家庄铁道大学实验报告课程名称计量经济学任课教师贾文学实验日期20xx48班级经1303姓名张利娟学号20xx1312

综合实验评阅人评语3

综合实验评语学院化学化工学院专业材料化学姓名孙玥班级材料化学1302学号220xx0222193题目石墨烯基负载氧化钴材料的制备和催化剂氧还原的性能指导小组或指导教师评语评定成绩20xx年9月17日负责人或指导...

01实验报告模板(带评语)

石家庄铁道学院实验报告课程名称任课教师实验日期班级姓名学号

01实验报告模板(带评语)

石家庄铁道大学实验报告课程名称数据结构与算法任课教师王兴鹏实验日期20xx1115班级经0909姓名刘欣欣学号20xx1395

酸奶、片片橘、火腿肠、薯片感官评定实验表

姓名班级学号评分标准姓名班级学号评分标准姓名班级学号评分标准姓名班级学号评分标准

小学科学实验教学评价初探

小学科学实验教学评价初探小学课堂网萧山区瓜沥镇第三小学汪钢钧引言要建立促进学生全面发展的评价体系评价不仅要关注学生的学业成绩而且要发现和发展学生多方面的潜能了解学生发展中的需求帮助学生认识自我建立自信发挥评价的...

实验教学评价标准

实验教学评价标准

中学化学实验评价综述

中学化学实验评价综述摘要化学实验是化学学习的重要环节对于实验的评价更是衡量实验是否达到教学目标的直接手段本文对传统实验评价方式进行了总结并阐述了实验评价存在的问题进而归纳了实验评价的发展方向关键词化学实验评价发...

实验教学质量评价表

实验教学质量评价表

实验评语(22篇)