南昌大学c语言上机实验_第1页
南昌大学c语言上机实验_第2页
南昌大学c语言上机实验_第3页
南昌大学c语言上机实验_第4页
南昌大学c语言上机实验_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言上机实验南昌大学信息工程学院实验1C语言的编程环境一.实验目的1.初步了解C程序的编译、连接和运行的过程。2.掌握和理解C程序的结构。

二.实验内容1.使用TC2.运行一个简单的C程序三.实验环境PC微机;DOS操作系统或Windows操作系统;TurboC程序集成环境。四.实验步骤1.启动TurboC如果用户计算机系统已经安装了TurboC编译系统,则在DOS命令状态下键入命令tc。进入TurboC集成环境后,首先在屏幕上显示TurboC主菜单窗口。在该窗口,有8个菜单条目。我们需要清楚知道每一个菜单的意义:

File处理文件(包括装入、存盘、选择、建立、换名写盘),目录操作(包括列表、改变工作目录),退出系统及调用DOS。Edit建立、编辑源文件。Run控制运行程序。如果程序已经编译连接好,且Debug/SourceDebugging以及Option/Compiler/Codegeneration/OBJDebugInformation开关置为On,则可以用此菜单初始化调试阶段。Compile编译并生成目标程序与可执行文件。Project允许说明程序中包含哪些文件的管理条目。Options可以选择集成环境任选项(如存储模式、编译时的任选项、诊断及连接任选项)及定义宏;也可以记录IncludeOutput及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>voidmain(){printf(“Howareyou!\n”);}3.运行程序按Ctrl+F9运行程序,如果没有报错,而且程序需要输入数据,则屏幕会切换到运行窗口,等待用户输入数据,并输出结果。在人们未来得及看清结果之前,屏幕很快又转回程序编辑窗口。为了看清结果,可以按Alt+F5查看运行结果,再按空格键回到编辑窗口。4.保存文件按F2键,弹出一个对话框,在对话框中输入文件名,如:exam1.c。5.退出TC程序按Alt+X键,弹出对话框,提示是否真的要退出TC,如果输入Y就会退出TC。也可以选择File→Quit,就会退出TurboC++3.0环境,回到Windows环境。6.打开已经存在的文件(1)首选启动TC。(2)按F3,弹出对话框。(3)在该对话框中,输入文件名即可。五.思考题总结实验中在编辑、编译、运行等各环节中所出现的问题及解决方法。 (1)在使用TC3.0时,要求建立的文件名称为.c文件,而不是.cpp。(2)在使用TC3.0编程时,每个C程序都要在程序首部写出“includestdio.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-1C语言程序结构示意图结合以上示例,可以看出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操作系统TurboC程序集成环境四.实验步骤1.当x=5,y=6,z=7时x<yy>xx!=yx==z-2x=x-2x>=zx<=z以上表达式的值分别为:1;1;1;1;3;0;1.2.当x=0,y=-1,z=1时x&&yx||yy&&zy||zx&yx|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.掌握简单、常用的算法,并在编程过程中体验各种算法的编程技巧。进一步学习调试程序,掌握语法错误和逻辑错误的检查方法。二.实验内容选择结构程序设计;if语句的使用;使用switch语句实现多分支选择结构;三种循环语句的应用;循环结构的嵌套;break和continue语句的使用。三.实验环境PC微机DOS操作系统或Windows操作系统TurboC程序集成环境四.实验步骤1.编程实现:输入一个整数,将其数值按照①小于10,②10~99,③100~999,④1000以上四个类别分类并显示。要求:(1)将变量定义为整型。(2)输入整数前,利用puts()/printf()给出提示信息。(3)输出结果时要有必要的说明,例如:输入358时,显示358is100to999。(4)该程序利用if语句实现。运行程序,分别输入9,21,321,4321数据检查输出信息的正确性。程序如下:#include<stdio.h>voidmain(){inti;scanf(“%d\n”,&i);if(i<10)printf(“%dis0to10\n”,i);if(i>=10&&i<99)printf(“%dis10to99\n”,i);if(i>=100&&i<999)printf(“%dis100to999\n”,i);if(i>=1000)printf(“%dis1000to+∞\n”,i);}2.编写程序:根据公式,输出π的值。要求:(1)变量π为单精度类型,n为整型;(2)计算当n的取值分别为20,50,100,200时的π值,说明什么问题?(3)修改程序,不给出n值,而改为求π值,直到最后一项的数值小于10-4为止。(4)对修改后的程序,输出π值以及总的项数n。输出格式为:π=值;n=值。程序如下:#include<stdio.h>#include<math>main(){intn;floats=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:12Output:1,2,3,4,6,12

#include"stdio.h"main(){inti=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(){charc,sum1=0,sum2=0,space=0,number=0,other=0;c=getchar();while(c!='\n'){if(c>='A'&&c<='Z')sum1++;elseif(c>='a'&&c<='z')sum2++;elseif(c>='0'&&c<='9')number++;elseif(c=='')space++;elseother++;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"intf(intx)//检查素数函数{inti;for(i=2;i<sqrt(x);i++)//检查该数是不是素数,从2开始到它的平方根为止if(x%i==0)return0;//不是素数返回0return1;//是素数返回1}voidmain(){inta[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个符号为'+'elseprintf("=");//最后一个符号为'='}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(intnum),它的功能是判别一个数是否为素数。如果num是素数,返回该数;否则返回0值。要求:(1)在主函数输入一个整数num,调用该函数后,输出num是否是素数的信息。输出格式为:numisprime或numisnotprime。(2)分别输入以下数据:0,1,2,5,9,13,59,121,运行程序并检查结果是否正确。

2.编写函数computNum(intnum),它的功能是计算任意输入的一个正整数的各位数字之和,结果由函数返回(例如:输入数据是123,返回值为6)。要求:num由主函数输入,调用该函数后,在主函数内输出结果。

3.编写函数,mulNum(inta,intb),它的功能是用来确定a和b是否是整数倍的关系。如果a是b的整数倍,则函数返回值为1,否则函数返回值为0。要求:(1)在主函数中输入一对数据a和b,调用该函数后,输出结果并加以相应的说明。例如:在主函数中输入:10,5,则输出:10ismultipleof5.(2)分别输入下面几组数据进行函数的正确性测试:1与5、5与5、6与2、6与4、20与4、37与9等,并对测试信息加以说明。4.编写一个计算组合数的函数combinNum(intm,intn)。计算结果由函数返回。计算组合数的公式是: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>intPrimeNum(intnum);/*声明判断函数*/voidmain(){ inti,num; printf("Pleaseinputnum:"); scanf("%d",&num); i=PrimeNum(num);/*调用判断函数*/ if(i==0) printf("%disnotprime",num); else printf("%disprime",num);}intPrimeNum(intnum){ intn,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>intcomputNum(intnum);/*声明函数*/voidmain(){ intnum,n; printf("请输入不多于10位的整数:"); scanf("%d",&num); n=computNum(num);/*调用函数*/ printf("%d",n);}intcomputNum(intnum){ intn,j; n=1;j=0; for(n=1;n<11;++n) { j=j+num%10;/*将数的每一位数加到j上*/ num=num/10; } returnj;/*直接返回j*/}三、#include<stdio.h>intmulNum(inta,intb);/*声明函数*/voidmain(){ inta,b,c; printf("Pleaseinputaandb:\n"); scanf("%d,%d",&a,&b); c=mulNum(a,b);/*调用函数*/ if(b>a)/*大的数是小的数的倍数,所以要判断两个数的大小*/ { c=b; b=a; a=c; } if(c==1)/*两数是倍数关系*/ printf("%dismultipleof%d",a,b); else/*不成倍数关系*/ printf("%disnotmultipleof%d",a,b);}intmulNum(inta,intb){ intc; if(a%b==0||b%a==0)/*判断是否能被整除*/ c=1; else c=0; returnc;}四、#include<stdio.h>intcombinNum(intm,intn);/*声明函数*/voidmain(){ intm,n,c; printf("Pleaseinputmandn:"); scanf("%d,%d",&m,&n);/*输入两个数*/ if(m<n||m<0||n<0)/*判断输入的两个数是否符合数学要求*/ printf("Matherror!\n\"m\"cannotsmallerthan\"n\"!\n\"m\"or\"n\"can`tsmallerthan0!"); else { c=combinNum(m,n);/*调用函数*/ printf("c(m,n)=m!/(n!*(m-n)!)=%d",c); }}intcombinNum(intm,intn){ intaccmulNum(intm);/*声明阶乘函数*/ inti,j,k,h; i=accmulNum(m);/*调用阶乘函数*/ j=accmulNum(n); k=accmulNum(m-n); h=i/(j*k); returnh;}intaccmulNum(intm)/*求数的阶乘的函数*/{ inti,j; j=1; for(i=1;i<=m;++i) j=j*i; returnj;}修改方案:在文件目录下创建头文件user.h,头文件内有如下内容:intcombinNum(inta,intb);intaccmulNum(inta);在主程序预处理中加入#include”use.h”,将主程序保存为main.cpp,被调用程序保存为user.cpp,在命令提示符中先后输入cluser.cpp/c、clmain.cpp/c、linkmain.objuser.obj,得到程序main.exe。五#include<stdio.h>intgcd(inta,intb);/*声明求公约数函数*/intmul(inta,intb);/*声明公倍数函数*/voidmain(){ inta,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);}intgcd(inta,intb)/*公约数函数*/{ inti,j,k; j=(a>b)?b:a; for(i=j;i>=1;--i) { if(a%i==0&&b%i==0) { k=i;break;/*第一次出现能同时被ab整除的是最小公约数*/ } } returnk;}intmul(inta,intb){ intgcd(inta,intb);/*调用公约数函数*/ inth,k; k=gcd(a,b); h=a*b/k;/*公约数和公倍数的数学关系*/ returnh;}使用递归调用修改方案:将函数intgcd(inta,intb)的定义改为:intgcd(inta,intb){ intc,i; for(;b!=0;) { i=a; a=b; b=i%b; c=gcd(a,b); } if(b==0) c=a; returnc;}采用全局变量修改方案#include<stdio.h>intk=0,h=0;intgcd(inta,intb);intmul(inta,intb);voidmain(){ inta,b,c,d; scanf("%d,%d",&a,&b); gcd(a,b); mul(a,b); printf("最大公约数是:%d,最小公倍数是:%d",k,h);}intgcd(inta,intb){ inti,j; j=(a>b)?b:a; for(i=j;i>=1;--i) { if(a%i==0&&b%i==0) { k=i;break; } } returnk;}intmul(inta,intb){ intgcd(inta,intb); k=gcd(a,b); h=a*b/k; returnh;}五、思考题或实验感想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决定的二维整型数组(nn),形成nn阶矩阵,将矩阵中最大元素所在的行和最小元素所在的行对调后,再输出该矩阵(注意:数组不允许动态定义)。例如:原始数据:n=4结果数据:123481114163591035910811141612341527615276要求:(1)本题中所涉及到的循环都采用for语句。(2)在输入/输出时进行必要的说明。(3)对输入的2~10之间的整数(例如4)以n=4的格式输出。(4)输入一个nn矩阵(假定最大值与最小值不在同一行上),输出原始矩阵数据(按上述矩阵形式)。(5)查找最大值与最小值,将矩阵中最大元素所在的行和最小元素所在的行对调,输出对调后的矩阵数据。(6)修改程序,对最大值与最小值可能出现在一行上的情况做出说明。(7)对n为3,4,5时,输入数组元素是要注意哪些问题?执行程序,检查程序的正确性。4.编程实现“折半查找”的过程。折半查找的处理过程是:在一个数据已排好序的数组中,首先比较关键字与数组中间的元素,如果两者相等,则查找结束;如果前者比后者小,则要查找的数据必然在数组的前半部,此后只需在数组的前半部中继续折半查找;如果前者的数值比后者大,则要查找的数据必然在数组的后半部,此后只需在数组的后半部继续进行折半查找。要求:(1)设定一个数组存放20个数据,用赋初值的方法在程序中给出(假设这些数据已排序)。(2)用scanf函数输入一个要找的数。(3)对查找的结果给出相应的说明,如果找到该数,则给出该数是数组中第几个元素。如果该数不在数组中,则输出“无此数”信息。(4)任意输入一些数据,检查程序的正确性。(5)修改程序,设定输入的数据是无序的,采用scanf函数的形式输入,首先要对这些无序的数据进行排序,然后再采用“折半查找”。最后通过测试几组差别较大的数据检查程序的正确性。(6)修改程序,改为函数调用的形式。编写一个选择法排序函数,对无序数据进行排序;编写一个查找函数对已排好序的数据进行查找。在主函数中输入数据(无序),调用上述函数,输出结果。5.编程实现:三个学生、五门课程的成绩分别存放在4×6矩阵的前3×5列,计算出每个学生的平均成绩存放在该数组的最后一列的对应行上。计算单科的成绩总和存放在最后一行的对应列上,并输出单科成绩的平均分。输入/输出格式举例如下:Input(输入成绩):6587685678<cr>8394678591<cr>7175698489<cr>Output(输出结果):658768567870.5839467859184.0717569848977.5219.0256.0204.0258.0232.00average:73.085.368.086.077.3要求:(1)数组类型为实型,输入成绩由scanf函数实现。(2)输出已输入的原始成绩数据(3×5)。(3)计算每个学生的平均成绩以及单科的成绩总和并按要求填入到数组中,输出填入结果后的数组(4×6)。(4)j计算单科平均成绩后输出。6.编写函数catStr(charstr1[],charstr2[])用于进行两个字符串的连接,编写函数lenStr()用于统计一个字符串的长度。编写函数cmpStr()用于判断两个字符串的大小。要求:(1)不允许使用字符处理库函数。(2)在主函数以初始化的方式输入两个字符串str1、str2。调用函数lenStr()计算字符串的长度。(3)调用函数cmpStr()判断两个字符串的大小,如果str1大于等于str2,调用函数catStr()进行两个字符串的连接,将str1连接在str2后,否则,将str2连接在str1后,调用函数lenStr()统计连接后的字符串长度。(4)在主函数中输出两个原始字符串和各自的长度以及处理后字符串及其长度。实验步骤在编程软件中写如以下代码:一、#include<stdio.h>voidmain(){ inta[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>voidmain(){ intj,n; chari; charc[]={"Iamastudent"};/*初始化字符串*/ 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>voidmain(){ intn,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>voidmain(){ inta[20]; intn,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); intm=20; for(n=0;n<=m;)/*折半查找*/{ i=(n+m)/2; if(a[i]<j) n=i+1; elseif(a[i]>j) m=i-1; elseif(a[i]=j){ printf("该数在数组的第%d位上",i+1);break;}/*输出找到的数,结束循环*/} if(n>m) printf("无此数");}按要求修改后的程序为:#include<stdio.h>voidarr();/*声明排序函数*/intsea(intj);/*声明折半查找函数*/inta[20];/*定义全局变量*/voidmain(){ intn,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);}voidarr()/*排序函数*/{ intz,n; for(intn=0;n<20;++n) for(intk=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]);/*输出已排序的数组*/}intsea(intj){ intn,i,h,m=20; for(n=0;n<=m;) { i=(n+m)/2; if(a[i]<j) n=i+1; elseif(a[i]>j) m=i-1; elseif(a[i]=j){ h=i+1;break;}/*找到该数后停止循环*/ } if(n>m) h=0; returnh;/*返回h值*/}五、#include<stdio.h>voidmain(){ intj,k; floata[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>voidcatStr(charstr1[],charstr2[]);/*声明连接两个字符串的函数*/intlenStr(charstr[]);/*声明统计长度的函数*/intcmpStr(charstr1[],charstr2[]);/*声明比较字符串大小的函数*/charstr3[]={""};voidmain(){ intn,j,k,len1,len2,len3; charc,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));/*输出合成字符串的长度*/}intlenStr(charstr[])/*统计字符串大小的函数*/{ intn,j,k; for(n=0;;++n) if(str[n]=='\0'){ returnn; break;}}intcmpStr(charstr1[],charstr2[])/*比较字符串大小的函数*/{ intn; for(n=0;str1[n]!='\0'&&str2[n]!='\0';++n){ if((int)str1[n]>(int)str2[n]){ return1; break;} if((int)str1[n]<(int)str2[n]){ return0; break;}} return1;}voidcatStr(charstr1[],charstr2[])/*将str2连在str1后面,将得到的新字符串存入str3*/{ intn,j; intlenStr(charstr[]); 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>voidmain(){ inta[10],n,sum=0; floataver;/*定义平均数为浮点型*/ int*p=a;/*初始化*/ printf("Pleaseinput10numbers:\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("Averageis%.2f",aver);/*精确到小数点后两位*/}二、#include<stdio.h>voidarr(int*a,intn);/*定义排序函数*/voidinsert(int*a,intnum);/*插入并排序函数*/intn=10;/*定义数据个数,可修改*/voidmain(){ 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);/*调用插入并排序函数*/}voidarr(int*a,intn)/*排序函数*/{ intk,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; }}voidinsert(int*a,intnum){ voidarr(int*a

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论