南昌大学c语言上机实验

时间:2024.3.27

         C语言上机实验

           南昌大学信息工程学院 

 


                                                                                                  

 实验1  C语言的编程环境

一.实验目的

1.初步了解C程序的编译、连接和运行的过程。

2.掌握和理解C程序的结构。 

二.实验内容

1.使用TC

2.运行一个简单的C程序

三.实验环境

PC微机;

DOS操作系统或 Windows 操作系统;

Turbo C 程序集成环境。

四.实验步骤

1.启动Turbo C

如果用户计算机系统已经安装了Turbo C编译系统,则在DOS命令状态下键入命令tc。进入Turbo C集成环境后,首先在屏幕上显示Turbo C主菜单窗口。

在该窗口,有8个菜单条目。我们需要清楚知道每一个菜单的意义:

 File 处理文件(包括装入、存盘、选择、建立、换名写盘),目录操作(包括列表、改变工作目录),退出系统及调用DOS 。

Edit 建立、编辑源文件。

Run 控制运行程序。如果程序已经编译连接好,且Debug/Source Debugging以及Option/Compiler/Code generation/OBJ Debug Information开关置为On,则可以用此菜单初始化调试阶段。

Compile 编译并生成目标程序与可执行文件。

Project 允许说明程序中包含哪些文件的管理条目。

Options 可以选择集成环境任选项(如存储模式、编译时的任选项、诊断及连接任选项)及定义宏;也可以记录Include Output及Library文件目录,保存编译任选项和从配置文件加载任选。

Debug 检查、改变变量的值,查找函数,程序运行时查看调用栈。选择程序编译时是否在执行行代码中插入调试信息。

Break/Watch 增加、删除、编辑监视表达式,及设置、清除、执行至断点。

特别要指出的是,除了Edit项外,每一个菜单又有对应的子菜单。而选择Edit项目后,只是进入编辑器。

为了从主菜单中选择所需要的功能,可以用以下两种方式之一:

(1)按F10键后,可以看到屏幕上部主菜单中有反白显示,此时,利用左、右光标移动键(←与→)选择需要的菜单,然后按回车(Enter)键。

(2)直接按Alt+主菜单条目中的首字母(分别为F,E,R,C,P,O,D,B),此时就会出现相应的子菜单。例如,按Alt+F表示选择文件子菜单(File)。

当出现子菜单时,其中某个条目是高亮度的,此时可以利用上、下光标移动键(↑与↓)来移动该高亮度线,从而选择所需要的功能。在菜单调用时,按Esc键后将直接返回到活动窗口。

2.输入程序

      输入以下程序

#include <stdio.h>

void main()

{

printf(“How are you!\n”);

}

3.运行程序

按Ctrl+F9运行程序,如果没有报错,而且程序需要输入数据,则屏幕会切换到运行窗口,等待用户输入数据,并输出结果。在人们未来得及看清结果之前,屏幕很快又转回程序编辑窗口。为了看清结果,可以按Alt+F5查看运行结果,再按空格键回到编辑窗口。

4.保存文件

按F2键,弹出一个对话框,在对话框中输入文件名,如:exam1.c。

5.退出TC程序

按Alt+X键,弹出对话框,提示是否真的要退出TC,如果输入Y就会退出TC。也可以选择File→Quit,就会退出Turbo C++ 3.0 环境,回到Windows环境。

6.打开已经存在的文件

(1)首选启动TC。

(2)按F3,弹出对话框。

(3)在该对话框中,输入文件名即可。

五.思考题

总结实验中在编辑、编译、运行等各环节中所出现的问题及解决方法。

         (1)在使用 TC3.0 时,要求建立的文件名称为.c 文件,而不是.cpp。 (2)在使用 TC3.0编程时,每个 C 程序都要在程序首部写出“include stdio.h”,这个文件是基本输入输出文件,只有写上它,printf 函数和 scanf 函数才能正常使用。 (3)每个程序只有一个 main()函数。 (4)在程序输入中,注意区分 输入法,使用的是美式英文输入方式,而不是中文等其他方式。 (5)在程序执行过程中,要求每题都要执行,但是不能执行多次,不然容易出现死机现象。 (6)编程后,要注意保存路径,以便以后使用。 (7)注意,每做完一题后,最好关闭 TC3.0 环境,然后再重新打 开并新建 新的程 序;或者 ,在程 序菜单 file 中选 择来关闭以前编辑的程序,然后再重新新建。如果不进行上述工作时,可能会出现一个 TC环境中出现多个程序段,造成结果出错或不能执行。2. 总结 C 语言程序的结构和书写规则。 总结 C 程序结构 下面通过几个简单的示例,介绍 C 语言程序的基本构成和书写格式,使读者对 C 语言程序有一个基本的了解。在此基础上,再进一步了解 C 语言程序的语法和书写规则。 在以上示例中,一个完整的 C 语言程序结构有以下两种表现形式: (1)仅由一个 main函数又称主函数构成, (2)由一个且只能有一个 main函数和若干个其他函数结合而成,如图 1-1b所示。其中,自定义函数由用户自己设计。 图 1-1 C 语言程序结构示意图 结合以上示例,可以看出 C 语言程序结构有以下基本特点: (1)C 语言程序是由函数如:main 函数和 max 函数组成的,每一个函数完成相对独立的功能,函数是 C 语言程序的基本模块单元。main 是函数名,函数名后面的一对圆括号“”是用来写函数的参数的。参数可以有,也可以没有(本程序没有参数),但圆括号不能省略。 (2)一个 C 语言程序总是从 main函数开始执行。主函数执行完毕,程序执行结束。 (3)C 语言编译系 统区分字母大小写。C 语言把大小写字母视为两个不同的字符,并规定每条语句或数据说明均以分号结束。分号是语句不可缺少的组成部分。 (4)主函数 main既可以放在 max函数之前,也可以放在max函数之后。习惯上,将主函数 main放在最前面。 (5)C 语言程序中所调用的函数,既可以是由系统提供的库函数,也可以是由设计人员自己根据需要而设计的函数,printf函数是 C 语言编译系统库函数中的一个函数,它的作 用是在屏幕上按指定格式输出指定的内容;max函数是由用户自己设计的函数,它的作用是计算两个数中的较大值。 语言程序的书写规则 (1)C 源程序是由一个主函数和若干个其它函数组成的。 (2)函数名后必须有小括号,函数体放在大括号内。 (3)C 程序必须用小写字母书写。 (4)每句的末尾加分号。 (5)可以一行多句。 (6)可以一句多行。 (7)可以在程序的任何位置加注释。 一个完整的C语言程序,是由一个 main函数(又称主函数)和若干个其它函数结合而成的,或仅由一个 main函数构成。

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

一.实验目的

1.了解C语言中数据类型的意义;

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

3.学会有关C语言的有关运算符,以及包含这些运算符的表达式,特别是是++和—运算符的使用。

4.进一步熟悉C程序的编辑环境。

二.实验内容

1.用printf函数来输入表达式运行结果

2.观察实验步骤中表达式的结果

三.实验环境

PC微机

DOS操作系统或 Windows 操作系统

Turbo C 程序集成环境

四.实验步骤

1.当x=5,y=6,z=7时

x<y

y>x

x!=y

x==z-2

x=x-2

x>=z

x<=z

以上表达式的值分别为:1;1;1;1;3;0;1.

2.当x=0,y=-1,z=1时

x&&y

x||y

y&&z

y||z

x&y

x|y

以上表达式的值分别为:0;1;1;1;?;?。

五.思考题

1.“=”和“==”有什么区别?

       2.“&”和“&&”、“|”和“||”有什么区别?

答1:“=”是赋值运算符;而“==”是关系运算符。且“==”的优先级高于“=”,运算时,“==”自左至右结合,但“=”自右至左结合。

答2:“&”是按位与运算符;而“&&”是逻辑与运算符,“|”是按位或运算符;而“||”是逻辑或运算符。

   实验3 控制语句

一.实验目的

1.熟练掌握if 、if…else、if…elseif语句和switch语句格式及使用方法,掌握if语句中的嵌套关系和匹配原则,利用if语句和switch语句实现分支选择结构。

2.熟练掌握while语句、do ...while语句和for语句格式及使用方法,掌握三种循环控制语句的循环过程以及循环结构的嵌套,利用循环语句实现循环结构。

3.掌握简单、常用的算法,并在编程过程中体验各种算法的编程技巧。进一步学习调试程序,掌握语法错误和逻辑错误的检查方法。

二.实验内容

1.  选择结构程序设计;

2.  if语句的使用;

3.  使用switch语句实现多分支选择结构;

4.  三种循环语句的应用;

5.  循环结构的嵌套;

6.  break和continue语句的使用。

三.实验环境

PC微机

DOS操作系统或 Windows 操作系统

Turbo C 程序集成环境

四.实验步骤

1.编程实现:输入一个整数,将其数值按照①小于10,②10~99,③100~999,④1000以上四个类别分类并显示。 

要求:

(1)将变量定义为整型。

(2)输入整数前,利用puts()/printf()给出提示信息。

(3)输出结果时要有必要的说明,例如:输入358时,显示358 is 100 to 999。

(4)该程序利用if语句实现。

运行程序,分别输入9,21,321,4321数据检查输出信息的正确性。

程序如下:

#include<stdio.h>

void main()

{

int i;

scanf(“%d\n”,&i);

if(i<10) printf(“%d is 0 to 10\n”,i);

if(i>=10&&i<99) printf(“%d is 10 to 99\n”,i);

if(i>=100&&i<999) printf(“%d is 100 to 999\n”,i);

if(i>=1000) printf(“%d is 1000 to +∞\n”,i);

}

2.编写程序:根据公式   ,输出 π的值。

要求:

(1)变量π为单精度类型,n为整型;

(2)计算当n的取值分别为20,50 ,100,200时的π值,说明什么问题?

(3)修改程序,不给出n值,而改为求π值,直到最后一项的数值小于10-4 为止。

(4)对修改后的程序,输出π值以及总的项数n。输出格式为:π=值;n=值。

程序如下:

#include<stdio.h>

#include<math>

main()

{

int n;float s=0,

for(n=1;n<=20;n++)  s+=1/(n*n);

 =squar(6*s);

Printf(“%f\n”, );

}

3.从键盘输入一个0~1000之间的任意整数,输出该整数的所有因子(例如:输入12,其因子为1,2,3,4,6,12)。

要求:

(1)采用while循环语句实现。

(2)输出格式为:Input:12

                 Output:1,2,3,4,6,12 

#include "stdio.h"

main()

{

int i=0,n=0;

printf("input:");

scanf("%d",&n);

printf("output:");

while(i<=n)

if(n%i==0)

printf("%d,",i);

}

4.编程实现:由用户从键盘输入一串字符(以回车键结束),统计其中数字、大、小写字母、空格、其它字符的个数。

要求:

(1)通过键盘输入字符。

(2)给出相应的输入/输出信息提示。并按照数字、大写字母、小写字母、空格、其它字符数的顺序输出结果。

#include "stdio.h"

main()

{char c,sum1=0,sum2=0,space=0,number=0,other=0;

c=getchar();

while(c!='\n')

{

if(c>='A'&&c<='Z') sum1++;

else if(c>='a'&&c<='z') sum2++;

else if(c>='0'&&c<='9') number++;

else if(c==' ') space++;

else other ++;

c=getchar();

}

printf("%d,%d,%d,%d,%d",sum1,sum2,space,number,other);

}

5.计算并输出1000以内最大的10个素数以及它们的和。

要求:

(1)在程序内部加必要的注释。

(2)由于偶数不是素数,可以不考虑对偶数的处理。

(3)虽然在1000以内的素数超过10个,但是要对1000以内不够10个素数的情况进行处理。

(4) 输出形式为:素数1+素数2+素数+…+素数10=总和值。

#include"stdio.h"

#include"math.h"

int f(int x)//检查素数函数

{

 int i;

 for(i=2;i<sqrt(x);i++)//检查该数是不是素数,从2开始到它的平方根为止

  if(x%i==0)

   return 0;//不是素数返回0

 return 1;//是素数返回1

}

void main()

{

 int a[10],sum=0,i,j,count=0;

 for(i=999,j=0;count!=10;i-=2)//计算器等于10为循环结束条件,i-=2为只检查奇数。

  if(f(i))//调用函数

  {count++;//计数器加一

  a[j]=i;//赋值给数组

  j++;

  }

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

 { sum+=a[j];//计算十个数的总和

        printf("%d",a[j]);

  if(j<9)

    printf("+");//前9个符号为'+'

  else

    printf("=");//最后一个符号为'='

 }

  printf("%d\n",sum);

}

五.思考题

1.对于多分支选择结构何时使用if语句的嵌套,何时使用switch语句?

在if语句里面标签可以重复(但一般不那么写),而switch里面的case的标签就不能重复;if相对于switch来说,速度要慢一点,看起来没switch简洁、明了;它们都是用来实现选择结构程序设计的,也就是分支结构;

2.小结三种形式的循环使用的区别。

1do-while中循环体至少执行一次; 2、while和do-while中在while后指定条件,循环体中包含使循环趋于结束的语句;for在exp3中可含使循环趋于结束的语句,也可含在循环体中。 3、while和do-while中,循环变量初始化语句应放在while和do-while语句前;for可在exp1中实现循环变量初始化。

一、      实验项目名称

函数

二、    实验目的

1.掌握C函数的定义方法、函数的调用方法、参数说明以及返回值。掌握实参与形参的对应关系以及参数之间的“值传递”的方式;掌握函数的嵌套调用及递归调用的设计方法;

2.掌握全局变量和局部变量、动态变量与静态变量的概念和使用方法;

3.在编程过程中加深理解函数调用的程序设计思想。

三、实验内容

1.多模块的程序设计与调试的方法;

2.函数的定义和调用的方法;

3.用递归方法进行程序设计。

具体内容:

1.编写一个函数primeNum(int num),它的功能是判别一个数是否为素数。如果num是素数,返回该数;否则返回0值。

要求:

(1)在主函数输入一个整数num,调用该函数后,输出num是否是素数的信息。输出格式为:num is prime或num is not prime。 

(2)分别输入以下数据:0,1,2,5,9,13,59,121,运行程序并检查结果是否正确。 

2.编写函数computNum( int num),它的功能是计算任意输入的一个正整数的各位数字之和,结果由函数返回(例如:输入数据是123,返回值为6)。

要求: num由主函数输入,调用该函数后,在主函数内输出结果。 

3.编写函数,mulNum(int a,int b),它的功能是用来确定a和b是否是整数倍的关系。如果a是b的整数倍,则函数返回值为1,否则函数返回值为0。

要求:

(1)在主函数中输入一对数据a和b,调用该函数后,输出结果并加以相应的说明。例如:在主函数中输入:10,5 ,则输出:10  is  multiple of 5. 

(2)分别输入下面几组数据进行函数的正确性测试:1与5、5与5、6与2、6与4、20与4、 37与9等,并对测试信息加以说明。

4.编写一个计算组合数的函数combinNum(int m,int n)。计算结果由函数返回。

计算组合数的公式是:

c(m,n)=m!/(n!*(m-n)!)

要求:

(1)从主函数输入m和n的值。对m>n、m<n和m=n 的情况作分别处理后调用函数combinNum(m,n),在主函数内输出结果值。

(2)对m>n、m<n和m=n 的情况各取一组数据进行测试,检查程序的正确性。

(3)修改程序,把两个函数分别放在两个程序文件中,作为两个文件进行编译、链接和运行。 

5.整数a,b的最大公约数是指既能被a整除又能被b整除的最大整数。整数a,b的最小公倍数是指既是a的倍数又是b的倍数的最小整数。编写两个函数,一个函数gcd()的功能是求两个整数的最大公约数,另一个函数mul()的功能是求两个整数的最小公倍数。

要求:

(1)两个整数在主函数中输入,并在主函数中输出求得的最大公约数和最小公倍数。

(2)首先将两个整数a和b作为实参传递给函数gcd(),求出的最大公约数后,由函数gcd()带值返回主函数,然后将最大公约数与两个整数a、b一起作为实参传递给函数mul(),以此求出最小公倍数,再由函数mul()带值返回主函数。

(3)修改函数gcd(),函数gcd()采用递归调用的编写方法,两个整数a和b的最大公约数的递归公式是:

如果b=0,那么gcd(a,b)=x,否则gcd(a,b)= gcd(b,a%b)。 然后将最大公约数与两个整数a、b一起传递给函数mul(),求出最小公倍数,再由函数mul()将最小公倍数返回主函数。

(4)修改程序,采用全局变量的处理方法,将最大公约数和最小公倍数都设为全局变量,分别用函数gcd()和函数mul()求最大公约数和最小公倍数,但其值不是由函数返回,而是通过全局变量在函数之间传递的特性将结果反映在主函数中。

四、实验步骤及结果

打开编程软件,分别写入以下代码:

一、

#include<stdio.h>

int PrimeNum(int num);/*声明判断函数*/

void main()

{

     int i,num;

     printf("Please input num: ");

     scanf("%d",&num);

     i=PrimeNum(num);/*调用判断函数*/

     if (i==0)

            printf("%d is not prime",num);

     else

            printf("%d is prime",num);

}

int PrimeNum(int num)

{

     int n,m;

     if (num==1)/*1不是素数*/

            m=0;

     else{

            for (n=2;n<num;++n)

                   if (num%n==0)

                          break;/*若能被整除,说明不是素数,停止循环*/

            if (n>=num)

                   m=num;

            else

                   m=0;}

     return (m);/*返回m*/      

}

二、

#include <stdio.h>

int computNum(int num);/*声明函数*/

void main()

{

     int num,n;

     printf("请输入不多于10位的整数:");

     scanf("%d",&num);

     n=computNum(num);/*调用函数*/

     printf("%d",n);

}

int computNum(int num)

{

     int n,j;

     n=1;j=0;

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

     {

            j=j+num%10;/*将数的每一位数加到j上*/

            num=num/10;

     }

     return j;/*直接返回j*/

}

三、

#include<stdio.h>

int mulNum(int a,int b);/*声明函数*/

void main()

{

     int a,b,c;

     printf("Please input a and b:\n");

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

     c=mulNum(a,b);/*调用函数*/

     if (b>a)/*大的数是小的数的倍数,所以要判断两个数的大小*/

     {

            c=b;

            b=a;

            a=c;

     }

     if (c==1)/*两数是倍数关系*/

            printf("%d is multiple of %d",a,b);

     else/*不成倍数关系*/

            printf("%d is not multiple of %d",a,b);

}

int mulNum(int a,int b)

{

     int c;

     if (a%b==0 || b%a==0)/*判断是否能被整除*/

            c=1;

     else

            c=0;

     return c;

}

四、

#include <stdio.h>

int combinNum(int m,int n);/*声明函数*/

void main()

{

     int m,n,c;

     printf("Please input m and n: ");

     scanf("%d,%d",&m,&n);/*输入两个数*/

     if (m<n || m<0 || n<0)/*判断输入的两个数是否符合数学要求*/

            printf("Math error!\n\"m\" cannot smaller than \"n\"!\n\"m\" or \"n\" can`t smaller than 0!");

     else

     {

            c=combinNum(m,n);/*调用函数*/

            printf("c(m,n)=m!/(n!*(m-n)!)=%d",c);

     }

}

int combinNum(int m,int n)

{

     int accmulNum(int m);/*声明阶乘函数*/

     int i,j,k,h;

     i=accmulNum(m);/*调用阶乘函数*/

     j=accmulNum(n);

     k=accmulNum(m-n);

     h=i/(j*k);

     return h;

}

int accmulNum(int m)/*求数的阶乘的函数*/

{

     int i,j;

     j=1;

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

            j=j*i;

     return j;

}

修改方案:

在文件目录下创建头文件user.h,头文件内有如下内容:

int combinNum(int a,int b);

int accmulNum(int a);

在主程序预处理中加入#include”use.h”,将主程序保存为main.cpp,被调用程序保存为user.cpp,在命令提示符中先后输入cl user.cpp /c、cl main.cpp /c、link main.obj user.obj,得到程序main.exe。

#include <stdio.h>

int gcd(int a,int b);/*声明求公约数函数*/

int mul(int a,int b);/*声明公倍数函数*/

void main()

{

     int a,b,c,d;

     printf("请输入a,b:\n");

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

     c=gcd(a,b);/*调用公约数函数*/

     d=mul(a,b);/*调用公倍数函数*/

     printf("最大公约数是:%d,最小公倍数是:%d",c,d);

}

int gcd(int a,int b)/*公约数函数*/

{

     int i,j,k;

     j= (a>b)? b:a;

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

     {

            if (a%i==0 && b%i==0)

            {

                   k=i;break;/*第一次出现能同时被ab整除的是最小公约数*/

            }

     }

     return k;

}

int mul(int a,int b)

{

     int gcd(int a,int b);/*调用公约数函数*/

     int h,k;

     k=gcd(a,b);

     h=a*b/k;/*公约数和公倍数的数学关系*/

     return h;

}

使用递归调用修改方案:

将函数int gcd(int a,int b)的定义改为:

int gcd(int a,int b)

{

     int c,i;

     for (;b!=0;)

     {

            i=a;

            a=b;

            b=i%b;

            c=gcd(a,b);

     }

     if(b==0)

            c=a;

     return c;

}

采用全局变量修改方案

#include <stdio.h>

int k=0,h=0;

int gcd(int a,int b);

int mul(int a,int b);

void main()

{

     int a,b,c,d;

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

     gcd(a,b);

     mul(a,b);

     printf("最大公约数是:%d,最小公倍数是:%d",k,h);

}

int gcd(int a,int b)

{

     int i,j;

     j= (a>b)? b:a;

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

     {

            if (a%i==0 && b%i==0)

            {

                   k=i;break;

            }

     }

     return k;

}

int mul(int a,int b)

{

     int gcd(int a,int b);

     k=gcd(a,b);

     h=a*b/k;

     return h;

}

五、思考题或实验感想

1.小结函数的定义及调用方法;

答:函数的定义的一般形式为:

类型标识符 函数名 (形式参数表列)

{

     声明部分

语句部分

}

函数的调用很灵活,可以由主函数点用其他函数,其他函数也可以互相调用,要调用函数必须要先声明“类型标识符 函数名 ();”然后才能调用。

2.小结函数中形参和实参的结合规则;

答:(1)、在定义函数中指定的形参,在未出现函数调用时,它们不占内存中的存储单元。(2)、实参可以是常量、变量或表达式,在调用时将实参的值赋给形参。(3)、在被定义的函数中,必须指定形参的类型。(4)、实参和形参和类型应相同或赋值兼容。(5)、在C语言中,实参向形参的数据传递是“值传递”,单向传递,只由实参传给形参,而不能由形参传回来给实参。

3.编写和调试包含多模块的程序时,容易出现什么样的错误?根据自己的实践总结一下。

答:容易出现变量的重定义,被定义函数中有未声明的标识符,函数返回值的类型和函数类型不对应,几个函数互相调用时未声明。

一、      实验项目名称

数组

二、    实验目的

1.掌握数组的基本概念,包括:数组的定义、数组的类型、数组的初始化、数组的赋值、数组元素下标的范围、数组元素的正确以及引用数组元素的输入/输出。

2.掌握字符数组与字符串的使用方法。理解字符数组与其它数组的区别、理解字符串及其特点。掌握常用的字符串处理库函数的用法并清楚对字符串的简单处理。

3.掌握与数组相关的算法,包括排序算法和查找算法等。

三、    实验内容

进行有关数组的程序设计。

具体内容:

1.编程实现:对任意一个一维数组,从中找出数组元素的最大值和最小值。

要求:

(1)数组为整型数组(10个元素)。

(2)使用scanf函数实现数组元素的输入。在输入前给出必要的提示。

(3)输出时给出必要的说明,首先输出原始的10个元素,换行后输出最大值以及最大值在数组中的位置、最小值以及最小值在数组中的位置。

(4)如果现改为20个元素的数组,怎样修改程序?修改程序后,运行程序进行检查。如果需要数组元素不断改变,应怎样修改程序? 

2.编程实现:在给定的字符串中查找满足条件的第一个字符。

要求:

(1)字符串采用初始化的方式处理。

(2)通过scanf函数读入一个任意字符。

(3)在字符串中查找该字符,如果存在该字符,输出该字符在字符串中的位置以及相应的说明。如果不存在该字符,则要给出相应的信息。

3.编程实现:首先任意输入一个大于2且小于10的整数n,再输入一个由n决定的二维整型数组(n  n),形成n  n阶矩阵,将矩阵中最大元素所在的行和最小元素所在的行对调后,再输出该矩阵(注意:数组不允许动态定义)。

例如:原始数据: n=4          结果数据:

1   2   3   4               8   11  14  16

3   5   9  10               3   5   9  10

8  11  14  16               1   2   3   4

15  2  7   6                15   2   7   6

要求:

(1)本题中所涉及到的循环都采用for语句。

(2)在输入/输出时进行必要的说明。

(3)对输入的2~10之间的整数(例如4)以n=4的格式输出。

(4)输入一个n  n矩阵(假定最大值与最小值不在同一行上),输出原始矩阵数据(按上述矩阵形式)。

(5)查找最大值与最小值,将矩阵中最大元素所在的行和最小元素所在的行对调,输出对调后的矩阵数据。

(6)修改程序,对最大值与最小值可能出现在一行上的情况做出说明。

(7)对n为3,4,5时,输入数组元素是要注意哪些问题?执行程序,检查程序的正确性。

4.编程实现“折半查找”的过程。折半查找的处理过程是:在一个数据已排好序的数组中,首先比较关键字与数组中间的元素,如果两者相等,则查找结束;如果前者比后者小,则要查找的数据必然在数组的前半部,此后只需在数组的前半部中继续折半查找;如果前者的数值比后者大,则要查找的数据必然在数组的后半部,此后只需在数组的后半部继续进行折半查找。

要求:

(1)设定一个数组存放20个数据,用赋初值的方法在程序中给出(假设这些数据已排序)。

(2)用scanf函数输入一个要找的数。

(3)对查找的结果给出相应的说明,如果找到该数,则给出该数是数组中第几个元素。如果该数不在数组中,则输出“无此数”信息。

(4)任意输入一些数据,检查程序的正确性。

(5)修改程序,设定输入的数据是无序的,采用scanf函数的形式输入,首先要对这些无序的数据进行排序,然后再采用“折半查找”。最后通过测试几组差别较大的数据检查程序的正确性。

(6)修改程序,改为函数调用的形式。编写一个选择法排序函数,对无序数据进行排序;编写一个查找函数对已排好序的数据进行查找。在主函数中输入数据(无序),调用上述函数,输出结果。

5.编程实现:三个学生、五门课程的成绩分别存放在4×6矩阵的前3×5列,计算出每个学生的平均成绩存放在该数组的最后一列的对应行上。计算单科的成绩总和存放在最后一行的对应列上,并输出单科成绩的平均分。输入/输出格式举例如下:

Input(输入成绩):

              65   87   68   56   78<cr>

              83   94   67   85   91<cr>

              71   75   69   84   89<cr>

Output(输出结果) :

              65       87       68       56       78     70.5

              83       94       67       85       91     84.0

              71       75       69       84       89     77.5

              219.0    256.0    204.0    258.0    232.0     0

average:

              73.0   85.3   68.0   86.0   77.3   

 要求:

(1)数组类型为实型,输入成绩由scanf函数实现。

(2)输出已输入的原始成绩数据(3×5)。

(3)计算每个学生的平均成绩以及单科的成绩总和并按要求填入到数组中,输出填入结果后的数组(4×6)。

(4)j计算单科平均成绩后输出。

6.编写函数catStr(char str1[],char str2[])用于进行两个字符串的连接,编写函数lenStr()用于统计一个字符串的长度。编写函数cmpStr()用于判断两个字符串的大小。

要求:

(1)不允许使用字符处理库函数。

(2)在主函数以初始化的方式输入两个字符串str1、str2。调用函数lenStr()计算字符串的长度。

(3)调用函数cmpStr()判断两个字符串的大小,如果str1大于等于str2,调用函数catStr()进行两个字符串的连接,将str1连接在str2后,否则,将str2连接在str1后,调用函数lenStr()统计连接后的字符串长度。

(4)在主函数中输出两个原始字符串和各自的长度以及处理后字符串及其长度。

四、    实验步骤

在编程软件中写如以下代码:

一、

#include <stdio.h>

void main()

{

  int a[10],i,j,k,max,min;

  printf("请输入10个数:\n");

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

         scanf("%d",&a[i]);

  printf("原始数据:");

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

         printf("%d ",a[i]);

  printf("\n");

  max=a[0];/*初始化max和min*/

  min=a[0];

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

  {

         if (a[i]>=max)

                max=a[i];

         if (a[i]<=min)

                min=a[i];/*找最大值和最小值*/

  }

  printf("最大值为");

  for (i=0;i<10;++i)/*应对有多个最值的情况*/

         if (a[i]==max)

                printf("第%d个",i+1);

  printf("数,%d\n",max);

  printf("最小值为");

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

         if (a[i]==min)

                printf("第%d个",i+1);

  printf("数,%d",min);

}

修改为20个元素的方案:

将程序中所有的10改为20即可。如果数组元素不断改变,只需将代码中的10改成元素个数即可。

二、

#include <stdio.h>

#include <string.h>

void main()

{

  int j,n;

  char i;

  char c[]={"I am a student"};/*初始化字符串*/

  printf("给定字符串为:%s\n请输入要查找的字符:",c);

  scanf("%c",&i);

  n=strlen(c);/*得到函数给定字符串的长度*/

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

         if ((int)c[j]==(int)i)

         {

                printf("字符串中满足条件的第一个字符为第%d个字符",j+1);break;/*找到符合条件的第一个字符,结束循环*/

         }

  if (j>=n)

         printf("字符串中不存在满足条件的字符!");

}

三、

#include <stdio.h>

void main()

{

  int n,j,k,z,x,max,min,a[10][10];

  printf("请输入一个2到10之间的数:");

  scanf("%d",&n);

  printf("请输入一个n*n数组:\n");

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

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

                scanf("%d",&a[j][k]);

  printf("原始数组为:n=%d\n",n);

  for (j=0;j<n;++j){

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

                printf("%5d",a[j][k]);/*输出原始数组*/

         printf("\n");/*输出n个数后换行,使数组为n*n的格式*/}

  max=a[0][0];/*初始化最大值和最小值*/

  min=a[0][0];

  z=0;x=0;

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

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

                if (a[j][k]>max)

                {

                       max=a[j][k];

                       z=j;/*得到最大值的行数*/

                }

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

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

                if (a[j][k]<min)

                {

                       min=a[j][k];

                       x=j;/*得到最小值的行数*/

                }

  for (j=0;j<n;++j){

         k=a[z][j];

         a[z][j]=a[x][j];

         a[x][j]=k;/*交换最大值所在行和最小值所在行*/}

  printf("结果数据:\n");

  for (j=0;j<n;++j)/*输出结果*/{

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

                printf("%5d",a[j][k]);

         printf("\n");}

}

修改程序得到最大值和最小值所在行,只需在程序末尾加上语句:

printf(“最大值在第%d行,最小值在第%d行”,z,x);

在输入数组元素时要注意尽量不要重复出现最大值和最小值,程序会以最值中第一个出现的值作为最值。

四、

#include <stdio.h>

void main()

{

  int a[20];

  int n,j,i,k;

  printf("给定的数组为:\n");

  for(n=0;n<20;++n){

         a[n]=2*n+3;/*给定数组的初始化*/

         printf("%d ",a[n]);}

  printf("\n");

  printf("请输入要查找的数:");

  scanf("%d",&j);

  int m=20;

  for (n=0;n<=m;)/*折半查找*/{

  i=(n+m)/2;

  if(a[i]<j)

    n=i+1;

  else if(a[i]>j)

    m=i-1;

  else if(a[i]=j){

         printf("该数在数组的第%d位上",i+1);break;}/*输出找到的数,结束循环*/}

  if (n>m)

         printf("无此数");

}

按要求修改后的程序为:

#include <stdio.h>

void arr();/*声明排序函数*/

int sea(int j);/*声明折半查找函数*/

int a[20];/*定义全局变量*/

void main()

{

  int n,j,i,h;

  printf("请输入20个数据:\n");

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

  {

         scanf("%d",&a[n]);/*输入无序的20个数据*/

  }

  arr();/*调用排序函数*/

  printf("\n请输入要查找的数:");

  scanf("%d",&j);

  h=sea(j);/*调用折半查找函数*/

  if(h==0)

         printf("无此数");

  else

         printf("该数在已排序数组的第%d位",h);

}

void arr()/*排序函数*/

{

  int z,n;

  for (int n=0;n<20;++n)

         for (int k=0;k<19-n;++k)

                if (a[k]>a[k+1])

                {

                       z=a[k];

                       a[k]=a[k+1];

                       a[k+1]=z;

                }

  printf("将数组排序,得:\n");

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

         printf("%d ",a[n]);/*输出已排序的数组*/

}

int sea(int j)

{

  int n,i,h,m=20;

  for (n=0;n<=m;)

  {

  i=(n+m)/2;

  if(a[i]<j)

    n=i+1;

  else if(a[i]>j)

    m=i-1;

  else if(a[i]=j){

         h=i+1;break;}/*找到该数后停止循环*/

  }

  if (n>m)

         h=0;

  return h;/*返回h值*/

}

五、

#include <stdio.h>

void main()

{

  int j,k;

  float a[3][5],d[3]={0},b[6]={0},c[5]={0};

  printf("Input(输入成绩):\n");

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

         for (k=0;k<5;++k)

                scanf("%f",&a[j][k]);

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

         for (k=0;k<5;++k)

                d[j]=d[j]+a[j][k]/5;

  for (k=0;k<5;++k)

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

                b[k]=b[k]+a[j][k];

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

         b[5]=b[5]+d[j];

  for (k=0;k<5;++k)

         c[k]=b[k]/3;

  printf("\nOutput(输出结果):");

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

         printf("\n     ");

         for (k=0;k<5;++k)

                printf("%-7.0f",a[j][k]);

         printf("%-7.1f",d[j]);}

  printf("\n     ");

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

         printf("%-7.1f",b[k]);

  printf("\nAverage:\n     ");

  for (k=0;k<5;++k)

         printf("%-7.1f",c[k]);

}

六、

#include <stdio.h>

void catStr(char str1[],char str2[]);/*声明连接两个字符串的函数*/

int lenStr(char str[]);/*声明统计长度的函数*/

int cmpStr(char str1[],char str2[]);/*声明比较字符串大小的函数*/

char str3[]={""};

void main()

{

  int n,j,k,len1,len2,len3;

  char c,str1[]={""},str2[]={""};

  printf("请输入str1:");

  gets(str1);

  printf("请输入str2:");

  gets(str2);

  printf("str1原长为:%d\nstr2原长为:%d\n",lenStr(str1),lenStr(str2));/*调用统计长度的函数并输出原始长度*/

  j=cmpStr(str1,str2);/*调用比较大小函数*/

  if (j==1)/*将小字符串连接在大字符串后面*/{

         printf("\"%s\"大于\"%s\"\n",str1,str2);

         catStr(str1,str2);/*调用连接两个字符串的函数*/

         printf("合成的字符串为:%s\n",str3);}

  else{

         printf("\"%s\"小于\"%s\"\n",str1,str2);

         catStr(str2,str1);

         printf("合成的字符串为:%s\n",str3);}

  printf("合成的字符串长度为:%d",lenStr(str3));/*输出合成字符串的长度*/

}

int lenStr(char str[])/*统计字符串大小的函数*/

{

  int n,j,k;

  for (n=0;;++n)

         if (str[n]=='\0'){

                return n;

                break;}

}

int cmpStr(char str1[],char str2[])/*比较字符串大小的函数*/

{

  int n;

  for (n=0;str1[n]!='\0' && str2[n]!='\0';++n){

         if ((int)str1[n]>(int)str2[n]){

                return 1;

                break;}

         if ((int)str1[n]<(int)str2[n]){

                return 0;

                break;}}

  return 1;

}

void catStr(char str1[],char str2[])/*将str2连在str1后面,将得到的新字符串存入str3*/

{

  int n,j;

  int lenStr(char str[]);

  for (n=0;n<lenStr(str1);++n)

         str3[n]=str1[n];

  for (n=0;n<lenStr(str2);++n)

         str3[n+lenStr(str1)]=str2[n];

  str3[lenStr(str1)+lenStr(str2)]='\0';/*结束字符串str3*/

}

五、    思考题或实验感想

小结有关数组和字符串的程序设计方法:

首先要定义数组,必要时进行初始化。然后要善于使用字符库函数,注意使用函数时不要重定义。要注意数组的第一个下标是0。数组和字符串的输入输出要善于利用for循环。使用字符串库函数时要记得预处理。

一、      实验项目名称

指针

二、    实验目的

1.掌握指针的基本概念和基本用法。包括:变量的地址和变量的值,指针变量的说明、指针变量的初始化、指针的内容与定义格式、指针的基本运算等;

2.掌握数组与指针的关系并能够利用指针解决数组的相关问题;

3.掌握字符串与指针的关系并能够利用指针处理字符串的问题;

4.掌握指针与函数的关系并能够利用指针处理函数问题;

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

6.能够使用指针进行程序设计。

三、    实验内容

有关指针的程序设计

1.编程实现:任意输入的10个数,求其平均值。

要求:

(1)10个数采用scanf语句读入。

(2)利用指针实现对这10个数的访问。

(3)要求平均值的精度为小数后面2位。 

2.编程实现:将一个任意整数插入到一个已排序的整数数组中,插入后数组中的数仍然保持有序。

要求:

(1)整数数组由初始化方式输入。任意整数由scanf函数输入;

(2)实现过程采用指针处理;

(3)输出原始数组数据以及插入数据后的数组数据并加以相应说明。

3.编写函数newcopy(char *new,char *old),它的功能是删除old所指向的字符串中的小写字母,并将所得到的新串存入new中。

要求:

(1)在主函数中以初始化方式输入一个字符串;

(2)调用newcopy()函数;

(3)在主函数中输出处理后的结果。

4.编程实现:输入三个整数,按由大到小的顺序输出。

要求:

(1)通过scanf函数输入三个数据并存入三个变量中;

(2)利用指针实现从大到小输出;

(3)修改程序,将三个整型数据改为字符型数据,输入三个字符,按从大到小数顺序输出;

(4)修改程序,将三个字符型数据改为字符串数据,输入三个字符串,按从小到大顺序输出;

(5)体会指针对不同数据处理的特点。

四、    实验步骤及结果

一、

#include <stdio.h>

void main()

{

  int a[10],n,sum=0;

  float aver;/* 定义平均数为浮点型*/

  int *p=a;/*初始化*/

  printf("Please input 10 numbers:\n");

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

         scanf("%d",&a[n]);/*输入十个数*/

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

         sum=sum+*(p+n);/*使用指针访问数据*/

  aver=(float)sum/n;

  printf("Average is %.2f",aver);/*精确到小数点后两位*/

}

二、

#include <stdio.h>

void arr(int *a,int n);/*定义排序函数*/

void insert(int *a,int num);/*插入并排序函数*/

int n=10;/*定义数据个数,可修改*/

void main()

{

  int *a,num,j,k,b[10];

  printf("请输入个数据:\n");

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

         scanf("%d",&b[j]);/*输入原始数据*/

  a=&b[0];/*初始化*/

  arr(a,n);/*调用排序函数*/

  printf("排序好的数据为:\n");

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

         printf("%d ",*(a+j));/*输出排序好的原始数据*/

  printf("\n请输入要插入的数:");

  scanf("%d",&num);

  printf("插入%d后的数据为:\n",num);

  insert(a,num);/*调用插入并排序函数*/

}

void arr(int *a,int n)/*排序函数*/

{

  int k,j,h;

  for (k=0;k<10;++k)

         for (j=0;j<n-k-1;++j)

                if (*(a+1+j)<*(a+j)){

                       h=*(a+1+j);

                       *(a+1+j)=*(a+j);

                       *(a+j)=h;

                }

}

void insert(int *a,int num)

{

  void arr(int *a,int n);

  int j,k;

  *(a+n)=num;/*将插入的数排在数组最后一位*/

  arr(a,n+1);/*将新数组重新排序*/

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

         if (*(a+j)==num){

                k=j;

                break;}/*找到插入的数在数组中的位置*/

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

         printf("%d ",*(a+j));

  printf("\n插入的数据排在数组的第%d位",k+1);

}

三、

#include <stdio.h>

void newcopy(char *new1,char *old);

void main()

{

  char *new1,*old,a[10];/*new是不能当做变量,所以用new1*/

  old=a;

  new1=a;/*字符串的初始化*/

  printf("请输入字符串:\n");

  scanf("%s",a);

  newcopy(new1,old);/*调用函数*/

  printf("新的字符串为:\n");

  printf("%s",new1);

}

void newcopy(char *new1,char *old)

{

  int n,j=0;

  for (;* old!='\0';++old)

         if ((* old)>'z' || (* old)<'a'){

                * (new1+j)=* old;

                ++j;}/*排除原字符串中的小写字母,将其他字符存入新字符串*/

  *(new1+j)='\0';/*结束新字符串,否则新字符串的输出会故障*/

}

四、

#include <stdio.h>

void main()

{

  void exchange(int *q1,int *q2,int*q3);

  int a,b,c,*q1,*q2,*q3;

  printf("请输入个数:\n");

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

  q1=&a;q2=&b;q3=&c;/*将三个数的地址存入q1q2q3中*/

  exchange(q1,q2,q3);/*调用排序函数*/

  printf("3个数从大到小排列为:\n%d,%d,%d",a,b,c);

}

void exchange(int *q1,int *q2,int *q3)

{

  void swap(int *q1,int *q2);/*调用交换函数*/

  if (*q1<*q2)

         swap(q1,q2);/*若*q1小于*q2,交换地址位置*/

  if (*q1<*q3)

         swap(q1,q3);

  if (*q2<*q3)

         swap(q2,q3);

}

void swap(int *q1,int *q2)/*交换函数*/

{

  int n;

  n=*q1;

  *q1=*q2;

  *q2=n;

}

修改程序,将三个整型数据改为字符型数据,输入三个字符,按从大到小数顺序输出:只需将程序中的所有int改为char,将%d改为%c即可。

修改程序,将三个字符型数据改为字符串数据,输入三个字符串,按从小到大顺序输出:

#include<stdio.h>

#include<stdlib.h>

#include<conio.h>

int cmp(char *p1,char *p2) /* 字符串比较函数*/

{

  int i=0;

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

         if (*(p1+i++)=='\0') return 0; /* 这里是先判断*(p1+i)=='\0',然后再是i++ */

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

}

void sort(char *a[3]) /*排序函数*/

{

  char *temp;

  int i,j;

  for(i=0;i<3-1;i++)/* 选择排序*/

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

                if(cmp(a[i],a[j])>0)

                       {temp=a[i];

                       a[i]=a[j];

                       a[j]=temp;}

}

void main()

{

  int i;

  char s[3][81],*p[3];/* 设定每个字符串不超过字节*/

         printf("请输入3个字符串:\n");

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

  {

         gets(s[i]);

         p[i]=s[i];

  }

  sort(p);

  printf("字符串从小到大排序为:\n");

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

         printf("%s\n",p[i]);

}

五、    思考题或实验感想

小结函数指针、数组指针、字符串指针的使用。

对于指针的使用,最重要的是搞清楚函数指针、数组指针和字符串指针的概念,不能混乱起来。

函数指针变量指向一个函数,然后通过该指针变量调用此函数。函数指针中,函数名代表该函数的入口地址。函数指针只能指向函数的入口而不能指向函数中的某一条指令处,因此不能用*(p+1)表示函数的下一条指令。

数组元素的指针就是数组元素的地址。C语言中规定数组名代表数组中首元素的地址,所以p=&a[0]和p=a等价。p+i,a+i就是a[i]的地址,或者指向数组的第i个元素。*(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即a[i]。指向数组的指针变量可以带有下标,如p[i]与*(p+i)等价。

字符串指针实际上是把字符串的第一个字符赋给指针变量。指针变量只能指向一个字符变量或其他字符型数据,不能同时指向多个字符数据。




更多相关推荐:
C语言上机实验心得

在科技高度发展的今天,计算机在人们之中的作用越来越突出。而C语言作为一种计算机的语言,学习它将有助于我们更好的了解计算机,与计算机进行交流,因此,我们一定要学好C语言,这对我们以后的发展是十分重要的。说到这,上…

C语言集中上机实验报告

重庆邮电大学移通学院C语言集中上机实验报告学生学号班级专业重庆邮电大学移通学院20xx年5月重庆邮电大学移通学院目录第一章循环311实验目的312实验要求313实验基本内容3131题目一3132题目二5第二章数...

大一C语言上机实验试题及答案

实验一上机操作初步2学时一实验方式一人一机二实验目的1熟悉VC语言的上机环境及上机操作过程2了解如何编辑编译连接和运行一个C程序3初步了解C程序的特点三实验内容说明前三题为必做题目后两题为选做题目1输出入下信息...

川师C语言上机实验报告答案

四川师范大学计算机学院实验报告册院系名称计算机科学学院课程名称C语言程序设计实验学期20xx年至20xx年第二学期专业班级20xx级2班姓名黄涛学号20xx110210指导教师苏菡老师实验最终成绩本学期年开设实...

C语言上机实验报告样式

实验一实验的名称一、实验目的:1、熟悉VC++语言的上机环境及上机操作过程。2、了解如何编辑、编译、连接和运行一个C程序。3、初步了解C程序的特点。二、实验内容:1、建立VC++工程。2、编写HelloWorl…

C语言上机实验报告

中南大学C语言程序设计实验报告学生姓名学号专业班级指导教师学院信息科学与工程学院完成时间20xx年10月20xx年12月实验报告一顺序程序结构设计一目的要求1熟悉C语言的表达式语句空语句和复合语句2熟悉函数调用...

C语言_上机实验报告样例

实验报告课程名称程序设计语言C实验名称控制结构程序设计姓名潘登学号20xx120xx628专业班级材料1006实验日期20xx年5月20日成绩指导教师侯锐一实验目的1学会正确使用关系运算符和关系表达式逻辑运算符...

c语言 图书管理系统 上机实验报告

成都信息工程大学计算机系课程实验报告一上机实验目的设计并实现该课程设计的目的主要在于1对一定规模的综合软件编程有一定的经历与认识在做的过程中你会发现提前的规划即分析与设计重要过编程过程否则会走很多弯2综合并结合...

C语言集中上机实验报告

重庆邮电大学移通学院C语言集中上机实验报告学生学号班级专业重庆邮电大学移通学院20xx年5月重庆邮电大学移通学院目录第一章循环311实验目的312实验要求313实验基本内容3131题目一3132题目二3第二章数...

C语言上机实验(第四版)参考答案

C语言程序设计上机实验指导与习题参考答案第四版学生改编实验1C语言程序初步一实验目的1了解所用的计算机系统的基本操作方法学会独立使用该系统2了解在该系统上如何编辑编译连接和运行一个C程序3通过运行简单的C程序初...

C语言程序设计上机实验指导与习题第四版

加载到下一页C语言程序设计上机实验指导与习题参考答案第四版学生改编实验1C语言程序初步一实验目的1了解所用的计算机系统的基本操作方法学会独立使用该系统2了解在该系统上如何编辑编译连接和运行一个C程序3通过运行简...

05 VC6.0上机指导--- C语言实验讲义

实验一C语言的运行环境和运行过程实验目的1掌握c程序设计编程环境visualc掌握运行一个c程序设计的基本步骤包括编辑编译连接和运行2掌握c语言程序设计的基本框架能够编写简单的c程序3了解程序调试的思想能找出并...

c语言上机实验报告(38篇)