(计12个实验)
VC++实验指导书
江苏科技大学电子信息学院计算机系 实验一 C++上机操作和输入/出练习一、实验目的::熟悉Visual C++6.0集成开发环境和程序开发的一般步骤。
二、实验内容:
1.按照教材第1章1.5的步骤上机操作,以例1.1作验证。
2.编写程序要求用sizeof操作符验证教材表2-4中各数据类型所占的字节长度,输出格式为:
sizeof(char)=1 byte(s)
sizeof(short)=2 byte(s)
……
3.编写程序要求:
(1)运行时首先提示“Input a,b,c=”,然后从键盘上依次输入三个整数(如:8、5、11),分别赋给整型变量a、b、c;
(2)求a、b、c中的最小值赋给整型变量i;
(3)以下列格式输出最小值。
min(8,5,11)=5
三、实验过程:
(包括源程序)
四、实验结果:
(包括测试数据、操作结果)
五、实验总结:
(包括体会)
2.参考程序:
#include<iostream.h>
void main(void){
int k,s=0;
cout<<"1.字符型(char).\n";
cout<<"2.有符号字符型(signed char).\n";
cout<<"3.无符号字符型(unsigned char).\n";
cout<<"4.短整型(short int).\n";
cout<<"5.有符号短整型(signed short int).\n";
cout<<"6.无符号短整型(unsigned short int).\n";
cout<<"7.整型(int).\n";
cout<<"8.有符号整型(signed int).\n";
cout<<"9.无符号整型(unsigned int).\n";
cout<<"10.长整型(long int).\n";
cout<<"11.有符号长整型(signed long int).\n";
cout<<"12.无符号长整型(unsigned long int).\n";
cout<<"13.实型(float).\n";
cout<<"14.双精度型(double).\n";
cout<<"15.长双精度型(long double).\n";
do{
cout<<'\n';
cout<<"请选择数据类型(1~15)(输入0结束!):";
cin>>k;
cout<<'\n';
s++;
if(k==0)return;
if(s%4==0){
cout<<"1.字符型(char).\n";
cout<<"2.有符号字符型(signed char).\n";
cout<<"3.无符号字符型(unsigned char).\n";
cout<<"4.短整型(short int).\n";
cout<<"5.有符号短整型(signed short int).\n";
cout<<"6.无符号短整型(unsigned short int).\n";
cout<<"7.整型(int).\n";
cout<<"8.有符号整型(signed int).\n";
cout<<"9.无符号整型(unsigned int).\n";
cout<<"10.长整型(long int).\n";
cout<<"11.有符号长整型(signed long int).\n";
cout<<"12.无符号长整型(unsigned long int).\n";
cout<<"13.实型(float).\n";
cout<<"14.双精度型(double).\n";
cout<<"15.长双精度型(long double).\n";
}
}while(k<1||k>15);
switch(k){
case 1:cout<<"sizeof(char)="<<sizeof(char)<<"byte(s)"<<'\n';
s++; break;
case 2:cout<<"sizeof(signed char)="<<sizeof(signed char)<<"byte(s)"<<'\n';
s++; break;
case 3:cout<<"sizeof(unsigned char)="<<sizeof(unsigned char)<<"byte(s)"<<'\n';
s++;break;
case 4:cout<<"sizeof(short int)="<<sizeof(short int)<<"byte(s)"<<'\n';
s++;break;
case 5:cout<<"sizeof(signed short int)="<<sizeof(signed short int)<<"byte(s)"<<'\n';
s++; break;
case 6:cout<<"sizeof(unsigned short int)="<<sizeof(unsigned short int)<<"byte(s)"<<'\n';
s++; break;
case 7:cout<<"sizeof(int)="<<sizeof(int)<<"byte(s)"<<'\n';
s++; break;
case 8:cout<<"sizeof(signed int)="<<sizeof(signed int)<<"byte(s)"<<'\n';
s++; break;
case 9:cout<<"sizeof(unsigned int)="<<sizeof(unsigned int)<<"byte(s)"<<'\n';
s++; break;
case 10:cout<<"sizeof(long int)="<<sizeof(long int)<<"byte(s)"<<'\n';
s++; break;
case 11:cout<<"sizeof(signed long int)="<<sizeof(signed long int)<<"byte(s)"<<'\n';
s++; break;
case 12:cout<<"sizeof(unsigned long int)="<<sizeof(unsigned long int)<<"byte(s)"<<'\n';
s++; break;
case 13:cout<<"sizeof(float)="<<sizeof(float)<<"byte(s)"<<'\n';
s++; break;
case 14:cout<<"sizeof(double)="<<sizeof(double)<<"byte(s)"<<'\n';
s++; break;
case 15:cout<<"sizeof(long double)="<<sizeof(long double)<<"byte(s)"<<'\n';
s++; break;
}
while(1){
if(s%8==0){
cout<<'\n';
cout<<"1.字符型(char).\n";
cout<<"2.有符号字符型(signed char).\n";
cout<<"3.无符号字符型(unsigned char).\n";
cout<<"4.短整型(short int).\n";
cout<<"5.有符号短整型(signed short int).\n";
cout<<"6.无符号短整型(unsigned short int).\n";
cout<<"7.整型(int).\n";
cout<<"8.有符号整型(signed int).\n";
cout<<"9.无符号整型(unsigned int).\n";
cout<<"10.长整型(long int).\n";
cout<<"11.有符号长整型(signed long int).\n";
cout<<"12.无符号长整型(unsigned long int).\n";
cout<<"13.实型(float).\n";
cout<<"14.双精度型(double).\n";
cout<<"15.长双精度型(long double).\n";
}
do{
cout<<'\n';
cout<<"请选择数据类型(1~15)(输入0结束!):";
cin>>k;
cout<<'\n';
s++;
if(k==0)return;
if(s%4==0){
cout<<"1.字符型(char).\n";
cout<<"2.有符号字符型(signed char).\n";
cout<<"3.无符号字符型(unsigned char).\n";
cout<<"4.短整型(short int).\n";
cout<<"5.有符号短整型(signed short int).\n";
cout<<"6.无符号短整型(unsigned short int).\n";
cout<<"7.整型(int).\n";
cout<<"8.有符号整型(signed int).\n";
cout<<"9.无符号整型(unsigned int).\n";
cout<<"10.长整型(long int).\n";
cout<<"11.有符号长整型(signed long int).\n";
cout<<"12.无符号长整型(unsigned long int).\n";
cout<<"13.实型(float).\n";
cout<<"14.双精度型(double).\n";
cout<<"15.长双精度型(long double).\n";
}
}while(k<1||k>15);


switch(k){
case 1:cout<<"sizeof(char)="<<sizeof(char)<<"byte(s)"<<'\n';
s++;break;
case 2:cout<<"sizeof(signed char)="<<sizeof(signed char)<<"byte(s)"<<'\n';
s++;break;
case 3:cout<<"sizeof(unsigned char)="<<sizeof(unsigned char)<<"byte(s)"<<'\n';
s++; break;
case 4:cout<<"sizeof(short int)="<<sizeof(short int)<<"byte(s)"<<'\n';
s++;break;
case 5:cout<<"sizeof(signed short int)="<<sizeof(signed short int)<<"byte(s)"<<'\n';
s++;break;
case 6:cout<<"sizeof(unsigned short int)="<<sizeof(unsigned short int)<<"byte(s)"<<'\n';
s++; break;
case 7:cout<<"sizeof(int)="<<sizeof(int)<<"byte(s)"<<'\n';
s++;break;
case 8:cout<<"sizeof(signed int)="<<sizeof(signed int)<<"byte(s)"<<'\n';
s++;break;
case 9:cout<<"sizeof(unsigned int)="<<sizeof(unsigned int)<<"byte(s)"<<'\n';
s++;break;
case 10:cout<<"sizeof(long int)="<<sizeof(long int)<<"byte(s)"<<'\n';
s++;break;
case 11:cout<<"sizeof(signed long int)="<<sizeof(signed long int)<<"byte(s)"<<'\n';
s++;break;
case 12:cout<<"sizeof(unsigned long int)="<<sizeof(unsigned long int)<<"byte(s)"<<'\n';
s++;break;
case 13:cout<<"sizeof(float)="<<sizeof(float)<<"byte(s)"<<'\n';
s++; break;
case 14:cout<<"sizeof(double)="<<sizeof(double)<<"byte(s)"<<'\n';
s++;break;
case 15:cout<<"sizeof(long double)="<<sizeof(long double)<<"byte(s)"<<'\n';
s++;break;
}
if(k==0)break;
}
}
3.参考程序:
#include <iostream.h>
void main(){
int a,b,c,x;
cout<<"Input(a,b,c)=";
cin>>a>>b>>c;
if(a>b&&b<c)x=b;
else if(a>c)x=c;
else x=a;
cout<<"min("<<a<<","<<b<<","<<c<<")="<<x<<endl;
}
实验二 简单的程序设计一、实验目的
1.进一步熟悉VC++的使用环境;
2.学习简单的程序设计方法。
二、实验内容:
1.编写一个程序,实现根据输入的x值,可求出y的值,并输出x和y的值。计算y值的数学公式为:

2.设计一个程序,输入实型变量x和y的值。若x>y,则输出x-y的值;否则,输出y-x的值。
三、实验过程:
(包括源程序)
四、实验结果:
(包括测试数据、操作结果)
五、实验总结:
(包括体会)
参考程序:
1.#include <iostream.h>
void main(){
float x,y;
cout<<"请输入一个实数:";
cin>>x;
if(x<=2.5)y=1.5*x+7.5;
else y=9.32*x-34.2;
cout<<”x=”<<x<<'\t'<<”y=”<<y<<'\n';
}
2.
#include <iostream.h>
void main(){
float x,y;
cout<<"请输入两个实数:";
cin>>x;
cin>>y;
if(x>y)cout<<"x-y="<<x-y<<'\n';
else cout<<"y-x="<<y-x<<'\n';
}
实验三 选择结构设计一、实验目的学习使用if语句和switch语句实现选择结构;
二、实验内容:
1.编写一个程序判定某年是否为闰年。
2.设计一个程序,将从键盘上输入的百分制成绩转换成对应的五分制成绩并输出。90分以上为A,80~89分为B,70~79分为C,60~69分为D,60分以下为E。用开关语句实现。
三、实验过程:
(包括源程序)
四、实验结果:
(包括测试数据、操作结果)
五、实验总结:
(包括体会)
参考程序:
1.#include <iostream.h>
void main(){
int year,leap;
cout<<"输入一年号:";
cin>>year;
if(year%400==0)leap=1;
else if(year%4==0&&year%100!=0)leap=1;
else leap=0;
if(leap)cout<<year<<"是闰年\n";
else cout<<year<<"不是闰年\n";
}
2.#include <iostream.h>
void main(){
int s;
while(1){
cout<<"请输入百分制分数:";
cin>>s;
if(s<=0)break;
switch(s/10){
case 10:
case 9:cout<<"五分制分数为A\n";break;
case 8:cout<<"五分制分数为B\n";break;
case 7:cout<<"五分制分数为C\n";break;
case 6:cout<<"五分制分数为D\n";break;
default:cout<<"五分制分数为E\n";break;
}
}
}
实验四 循环结构设计一、实验目的学习使用while语句、for语句和do-while语句实现循环结构。
二、实验内容:
1.从键盘上输入10个整数,分别计算出其中所有正整数之和和负整数之和,0不计算,编写程序,显示求和结果。
2.分别用while语句和for语句编写程序,求(即求1!+2!+3!+…+10!)。
3.编写程序,程序的功能为显示如下图案:
*
* * *
* * * * *
* * * * * * *
* * * * *
* * *
*
三、实验过程:
(包括源程序)
四、实验结果:
(包括测试数据、操作结果)
五、实验总结:
(包括体会)
参考程序:
1.#include <iostream.h>
void main(){
int num,sum1=0,sum2=0;
cout<<"请输入十个数:";
for(int i=1;i<=10;i++){
cin>>num;
if(num>0)sum1+=num;
else if(num<0)sum2+=num;
}
cout<<"所有正整数之和为:"<<sum1<<'\n';
cout<<"所有负整数之和为:"<<sum2<<'\n';
}
2.(1)#include <iostream.h>
void main(){
double sum=0,t=1;
int i=1;
while(i<=10){
t*=i;
sum+=t;
i++;
}
cout<<"1!+2!+3!+…+10!="<<sum<<'\n';
}
(2)#include <iostream.h>
void main(){
double sum=0,t=1;
int i=1;
for(i=1;i<=10;i++){
t*=i;
sum+=t;
}
cout<<"1!+2!+3!+…+10!="<<sum<<'\n';
}
3.#include <iostream.h>
#include <math.h>
void main(){
int i,j;
for(i=-3;i<=3;i++){
for(j=1;j<=abs(i);j++)cout<<" ";
for(j=1;j<=(4-abs(i))*2-1;j++)cout<<'*';
cout<<'\n';
}
}
法二:
#include <iostream.h>
#include <math.h>
void main(){
int i,j;
for(i=1;i<=4;i++){
for(j=1;j<=4-i;j++)cout<<" ";
for(j=1;j<=2*i-1;j++)cout<<'*';
cout<<'\n';
}
for(;i<=7;i++){
for(j=1;j<=i-4;j++)cout<<" ";
for(j=1;j<=15-2*i;j++)cout<<'*';
cout<<'\n';
}
}
实验五 函数的使用一、实验目的
1.学习函数定义、调用和声明的方法。
1.学习函数的嵌套调用和递归调用的方法;
2.学习函数重载的方法;
3.学习全局变量、局部变量、动态变量和静态变量的概念和使用方法;
4.学习内部函数和外部函数的定义和使用方法;
5.学习编译预处理命令。
二、实验内容
1.猴子吃桃问题。有一批桃,某猴第一天吃去其中的一半再加一个,第二天在第一天吃剩下的桃中又吃去其中的一半再加一个,以后天天如此。到第十天发现,经过前九天的吃桃后,这批桃只剩下一个。问这批桃原先共有几个。
提示:先由第10天的桃子数可求出第9天的桃子数,再求出第8天的桃子数,……,最后求出第一天的桃子数。设第n天的桃子数为f(n),通过分析可得
f(n)= 1 (n=10)
2f(n+1)+2 (1<=n<10)
2.编写程序完成从键盘上输入整型变量n的值,调用函数fac ( ),求n!的值。
3.编写程序,由键盘输入两个整数,分别调用两个函数,求出这两个数的最大公约数和最小公倍数,返回主函数后显示结果。
4.设计三个函数,函数名均为max,功能是求两个int型数、两个double型数和三个double型数中的最大数。设计主函数,对这三个函数的功能进行测试。
5*.编写程序,该程序由两个源文件组成,其中:
源文件f1.cpp的内容是输入两个正整数x、n,调用函数power并输入结果;
源文件f2.cpp的内容是power函数的定义,power函数用于求xn。
6*.编写程序,由键盘输入a和b的值,用宏定义op来控制对a和b所作的操作:
(1)当#define op 1时,输出a和b中的较大者;
(2)当op定义为其余值时,输出a和b中的较小者。
三、实验过程:
(包括源程序)
四、实验结果:
(包括测试数据、操作结果)
五、实验总结:
(包括体会)
参考程序:
1.
#include <iostream.h>
int f(int n);
void main(){
cout<<"这批桃子原先共有"<<f(1)<<"个\n";
}
int f(int n){
if(n==10)return 1;
else return 2*f(n+1)+2;
}
2.
#include <iostream.h>
int fac(int a);
void main(){
int n;
cout<<"请输入n的值:";
cin>>n;
cout<<n<<"!="<<fac(n)<<'\n';
}
int fac(int a){
return(a==0)?1:a*fac(a-1);
}
3.
#include <iostream.h>
int gcd(int a,int b);
int lcm(int a,int b,int h);
void main(){
cout<<"请输入两个正整数:";
int x,y,h,l;
cin>>x>>y;
h=gcd(x,y);
l=lcm(x,y,h);
cout<<x<<"和"<<y<<"的最大公约数是:"<<h<<'\n';
cout<<x<<"和"<<y<<"的最小公倍数是:"<<l<<'\n';
}
int gcd(int a,int b){
int r,temp;
if(a<b){
int temp=a;
a=b;
b=temp;
}
while((r=a%b)!=0){
a=b;
b=r;
}
return b;
}
int lcm(int a,int b,int h){
return(a*b/h);
}
法二:
#include <iostream.h>
int gcd(int,int);
int lcm(int,int);
void main()
{
int a,b,g,l;
cout<<"请输入两个正整数:";
cin>>a>>b;
cout<<"a="<<a<<'\t'<<"b="<<b<<'\n';
g=gcd(a,b);
l=lcm(a,b);
cout<<a<<"和"<<b<<"的最大公约数为:"<<g<<'\n';
cout<<a<<"和"<<b<<"的最小公倍数为:"<<l<<'\n';
}
int gcd(int a,int b)
{
int i;
for(i=a;i>=1;i--)
if(!((a%i)||(b%i)))
return i;
return 1;
}
int lcm(int a,int b)
{
int i;
i=b;
while(i%a)i+=b;
return(i);
}
4.#include <iostream.h>
int max(int x,int y);
double max(double x,double y);
double max(double x,double y,double z);
void main(){
int a,b;
double x1,x2,x3;
cout<<"输入两个整数:";
cin>>a>>b;
cout<<"max("<<a<<","<<b<<")="<<max(a,b)<<'\n';
cout<<"输入两个实数:";
cin>>x1>>x2;
cout<<"max("<<x1<<","<<x2<<")="<<max(x1,x2)<<'\n';
cout<<"输入三个实数:";
cin>>x1>>x2>>x3;
cout<<"max("<<x1<<","<<x2<<","<<x3<<")="<<max(x1,x2,x3)<<'\n';
}
int max(int x,int y){
return x>=y?x:y;
}
double max(double x,double y){
return x>=y?x:y;
}
double max(double x,double y,double z){
double temp;
temp=(x>=y?x:y);
return temp>=z?temp:z;
}

5.f1.cpp的内容如下:
#include <iostream.h>
int x;
extern int power(int n);
void main(){
int n;
cout<<"请输入x的n次方中x和n的值:";
cin>>x>>n;
cout<<"power("<<x<<","<<n<<")="<<power(n)<<'\n';
}
f2.cpp的内容如下:
extern int x;
int power(int n){
int p=1;
for(int i=1;i<=n;i++)p*=x;
return p;
}
6.
#include <iostream.h>
#define op 1
void main(){
double a,b;
cout<<"请输入两个实数,";
cin>>a>>b;
#if op==1
cout<<"max("<<a<<","<<b<<")="<<(a>=b?a:b)<<'\n';
#else
cout<<"min("<<a<<","<<b<<")="<<(a<=b?a:b)<<'\n';
#endif
}
法二:
#include <iostream.h>
#define op 2
void main(){
double a,b;
cout<<"请输入两个实数,";
cin>>a>>b;
#if op==1
cout<<"max("<<a<<","<<b<<")="<<(a>=b?a:b)<<'\n';
#elif op==2
cout<<"min("<<a<<","<<b<<")="<<(a<=b?a:b)<<'\n';
#endif
}
实验六 数组的使用一、实验目的:
1.学习一维数组、二维数组和字符数组的概念和使用方法;
2.学习常用的标准字符串函数;
3.学习将数组作为函数参数的方法。
二、实验内容:
1.输入一组整数,找出其中最大元素值及其下标;
2.输入一批只含1、2、3的数据,以-1结束。分别统计其中1、2、3的个数;
3.编写程序,输入5*5阶矩阵各元素的值,求所有元素的平均值、下三角中的最大元素和最小元素。
4.编写程序,统计输入的字符串中大写英文字母、小写英文字母、数字和其它字符的个数。
三、实验过程:
(包括源程序)
四、实验结果:
(包括测试数据、操作结果)
五、实验总结:
(包括实验体会)
参考程序:
1.#include <iostream.h>
void main(){
int a[30],x,i=0,m=0;
cout<<"输入一组整数(以-999)结束:";
do{
cin>>x;
a[i++]=x;
}while(x>-999);
for(i=1;a[i]!=-999;i++)
if(a[i]>a[m])m=i;
cout<<"m="<<m<<"\ta[m]="<<a[m]<<endl;
}
法二:
#include <iostream.h>
void main(){
int a[300],x,i=0,n,k=0;
cout<<"输入整数的个数:";
cin>>n;
cout<<"输入"<<n<<"个整数:";
do{
cin>>x;
a[i++]=x;
}while(i<n);
for(i=1;i<n;i++)
if(a[i]>a[k])k=i;
cout<<"k="<<k+1<<"\ta["<<k+1<<"]="<<a[k]<<endl;
}
2.#include <iostream.h>
void main(){
int a[4],x;
for(int i=1;i<=3;i++)a[i]=0;
cout<<"每次输入一个数据,只能是1、2或3(以-1结束):";
cin>>x;
while(x!=-1){
a[x]+=1;
cin>>x;
}
for(i=1;i<=3;i++)
cout<<"a["<<i<<"]="<<a[i]<<'\t';
}
3.#include <iostream.h>
void main(){
double aver(double a[][5]);
double max(double a[][5]);
double min(double a[][5]);
double a[5][5];
cout<<"请输入5*5阶矩阵各元素的值:\n";
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)cin>>a[i][j];
cout<<"所有元素的平均值是:"<<aver(a)<<endl;
cout<<"下三角中的最大元素是:"<<max(a)<<endl;
cout<<"下三角中的最小元素是:"<<min(a)<<endl;
}
double aver(double a[][5]){
double sum=0.0;
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)sum+=a[i][j];
return sum/25;
}
double max(double a[][5]){
double m=a[0][0];
for(int i=0;i<5;i++)
for(int j=0;j<=i;j++)
if(m<a[i][j])m=a[i][j];
return m;
}
double min(double a[][5]){
double m=a[0][0];
for(int i=0;i<5;i++)
for(int j=0;j<=i;j++)
if(m>a[i][j])m=a[i][j];
return m;
}
4.#include <iostream.h>
void main(){
char a[100];
int i=0,uppers=0,lowers=0,digits=0,others=0;
cout<<"请输入字符串(含大、小写英文字符,数字以及其它各种字符:\n";
cin>>a;
while(a[i]!='\0'){
if(a[i]>='A'&&a[i]<='Z')uppers++;
else if(a[i]>='a'&&a[i]<='z')lowers++;
else if(a[i]>='0'&&a[i]<='9')digits++;
else others++;
i++;
}
cout<<"其中,大写英文字母有"<<uppers<<"个!\n";
cout<<"小写英文字母有"<<lowers<<"个!\n";
cout<<"数字有"<<digits<<"个!\n";
cout<<"其它字符有"<<others<<"个!\n";
}
法二:
#include <iostream.h>
void main(){
char a[100];
int i=0,uppers=0,lowers=0,digits=0,others=0;
cout<<"请输入字符串(含大、小写英文字符,数字以及其它各种字符:\n";
cin>>a;
while(a[i]!='\0'){
if(a[i]>='A'&&a[i]<='Z')uppers++;
else if(a[i]>='a'&&a[i]<='z')lowers++;
else if(a[i]>='0'&&a[i]<='9')digits++;
else others++;
i++;
}
cout<<"其中,大写英文字母有"<<uppers<<"个!\n";
cout<<"小写英文字母有"<<lowers<<"个!\n";
cout<<"数字有"<<digits<<"个!\n";
cout<<"其它字符有"<<others<<"个!\n";
}
实验七 结构体和指针的使用一、实验目的:
1.学习指针变量的定义和使用;
2.学习指向数组的指针变量的定义和使用;
3.学习指针数组的定义和使用。
二、实验内容:
1.有一个班4个学生,2门课。编写程序实现以下功能:
(1)调用函数input(),输入这4个学生的学号和成绩,放在一个4*3的二维数组中,每一行的第1个元素放学号,第2、第3个元素放成绩;
(2)调用函数aver(),返回这4个学生2门课的平均成绩,在主函数中输出;
(3)调用函数nopass(),返回所有有不及格成绩的学生的学号,在主函数中输出。
2.编写程序,从键盘读入若干个数,输出它们的最大值,最小值和平均值,要求:
(1)用一个数组存放各整数;
(2)在主函数中实现数据的输入和输出,用一个函数sub()求出它们的最大值、最小值和平均值;
(3)分别用传指针和传引用两种方式编写sub()函数。
3.编写程序,定义一个存放5名职工数据的结构数组(其结构类型包括工号、姓名、工资三个成员),在主函数中输入5名职工的数据,调用函数求出这5名职工的总工资和平均工资,在主函数中输出结果。
三、实验过程:
(包括源程序)
四、实验结果:
(包括测试数据、操作结果)
五、实验总结:
(包括实验体会)
参考程序:
1.#include <iostream.h>
void input(float (*p)[5]){
cout<<"请输入4个学生的学号和2门课程的成绩:\n";
for(int i=0;i<4;i++)
for(int j=0;j<3;j++)
cin>>*(*(p+i)+j);
}
void aver(float (*p)[5]){
for(int i=0;i<4;i++)
*(*(p+i)+3)=(*(*(p+i)+1)+(*(*(p+i)+2)))/2;
}
void nopass(float (*p)[5]){
for(int i=0;i<4;i++)
if(*(*(p+i)+1)<60||*(*(p+i)+2)<60)*(*(p+i)+4)=1;
}
void main(){
float stu[4][5];
input(stu);
aver(stu);
nopass(stu);
cout<<"\n这4个2门课的平均成绩是:\n";
for(int i=0;i<4;i++)
cout<<"学号:"<<stu[i][0]<<" 平均成绩:"<<stu[i][3]<<endl;
cout<<"\n所有有不及格成绩的学生的学号是:\n";
for(i=0;i<4;i++)
if(stu[i][4]==1)cout<<stu[i][0]<<" ";
cout<<'\n';
}
2.
#include <iostream.h>
void sub(int arr[],int n,double &rmax,double &rmin,double &raver){
rmax=rmin=raver=arr[0];
for(int i=0;i<n;i++){
if(rmax<arr[i])rmax=arr[i];
else if(rmin>arr[i])rmin=arr[i];
raver+=arr[i];
}
raver/=n;
}
void main(){
int a[10];
double max,min,aver;
cout<<"请输入10个数:";
for(int i=0;i<10;i++)cin>>a[i];
sub(a,10,max,min,aver);
cout<<"这10个数的最大值是"<<max<<"\n最小值是"<<min<<"\n平均值是"<<aver<<endl;
}
法二:传指针
#include <iostream.h>
void sub(int arr[],int n,double *rmax,double *rmin,double *raver){
*rmax=*rmin=*raver=arr[0];
for(int i=0;i<n;i++){
if(*rmax<arr[i])*rmax=arr[i];
else if(*rmin>arr[i])*rmin=arr[i];
*raver+=arr[i];
}
*raver/=n;
}
void main(){
int a[10];
double max,min,aver;
cout<<"请输入10个数:";
for(int i=0;i<10;i++)cin>>a[i];
sub(a,10,&max,&min,&aver);
cout<<"这10个数的最大值是"<<max<<"\n最小值是"<<min<<"\n平均值是"<<aver<<endl;
}
3.
#include <iostream.h>
struct employee{
int num;
char name[10];
int salary;
};
int total(employee *p,int n);
void main(){
employee emp[5];
cout<<"请输入5名职工的工号、姓名和\n";
for(int i=0;i<5;i++)
cin>>emp[i].num>>emp[i].name>>emp[i].salary;
int sum=total(emp,5);
cout<<"这5名职工的总工资是"<<sum<<",平均工资是"<<sum/5.0<<endl;
}
int total(employee *p,int n){
for(int sum=0,i=0;i<n;i++,p++)
sum+=p->salary;
return sum;
}
实验八 类和对象一、实验目的:
学习类和对象的定义和使用。
二、实验内容:
1.定义一个时间类Time,它能初始化、修改和显示由时、分、秒组成的时间。在主函数中先将时间设为18时42分30秒,然后显示过了8时25分32秒之后的时间。
2.编写一个程序输入3个学生的英语和计算机成绩,并按总分从高到低排序。要求设计一个学生类student,其定义如下:
class student{
int English,computer,total;
public:
void getscore(); //获取一个学生成绩
void display(); //显示一个学生成绩
};
三、实验过程:
(包括源程序)
四、实验结果:
(包括测试数据、操作结果)
五、实验总结:
(包括实验体会)
参考解答:
1.
#include <iostream.h>
class Time{
public:
Time(int h,int m,int s){
hour=h;
minute=m;
second=s;
}
void passed(int h,int m,int s);
void print(){
cout<<hour<<"时"<<minute<<"分"<<second<<"秒"<<endl;
}
private:
int hour,minute,second;
};
void Time::passed(int h,int m,int s){
second+=s;
if(second>=60){
second-=60;
minute++;
}
minute+=m;
if(minute>=60){
minute-=60;
hour++;
}
hour+=h;
if(hour>=24)hour-=24;
}
void main(){
Time t(18,42,30);
t.print();
t.passed(8,25,32);
t.print();
}
2.
#include <iostream.h>
class student{
int english,computer,total;
public:
void getscore(); //获取一个学生成绩
void display(); //显示一个学生成绩
int trtotal(){return total;}
};
void student::getscore(){
cout<<"输入英语成绩:";
cin>>english;
cout<<"输入计算机成绩:";
cin>>computer;
total=english+computer;
}
void student::display(){
cout<<"英语="<<english<<" 计算机="<<computer<<" 总分"<<total<<endl;
}
void main(){
void sort(student **,student **);
student *A[3];
for(int j=0;j<3;j++){
A[j]=new student;
cout<<"学生"<<j+1<<endl;
A[j]->getscore();
}
int i;
for(j=0;j<2;j++)
for(i=0;i<2;i++)
sort(A+i,A+i+1);
cout<<endl<<"排序结果如下:"<<endl;
for(i=0;i<3;i++)
A[i]->display();
}
void sort(student **p1,student **p2){
if((*p1)->trtotal()<(*p2)->trtotal()){
student *tmp=*p1;
*p1=*p2;
*p2=tmp;
}
}
实验九 构造函数、析构函数
一、实验目的:
1.学习构造函数、复制构造函数和析构函数的定义和使用;
2.学习静态数据成员和静态成员函数的定义和使用;
3.学习友元函数的定义和使用;
4.体会面向对象程序设计方法的特点。
二、实验内容:
1.定义一个学生类Student,其中包括姓名和成绩,姓名用动态分配的字符数组存放,要求在对象被撤消时,能将动态数组所占空间归还给堆内存。
主函数的内容为:
void main(){
Student s1(“卢小曼”,80),s2(s1);
s1.print();s2.print(); //显示学生对象s1和s2的姓名和年龄
}
2.定义一个人民币类RMB,其中包括元、角和分三个数据成员,除了要求定义类RMB的构造函数、复制构造函数和析构函数以外,还要求定义如下四个成员函数:
(1)显示人民币对象元、角和分值的成员函数disp();
(2)设置人民币对象元、角和分值的成员函数set();
(3)求两个人民币对象之和的成员函数addRMB();
(4)求两个人民币对象之差绝对值的成员函数subRMB()。
设计主函数main(),其内容是对上述成员函数的功能进行测试。
三、实验过程:
(包括源程序)
四、实验结果:
(包括测试数据、操作结果)
五、实验总结:
(包括实验体会)
参考程序:
1.
#include <iostream.h>
#include <string.h>
class Student{
public:
Student(char *pname,int s){
cout<<"调用构造函数,";name=new char[strlen(pname)+1];
strcpy(name,pname);
score=s;
cout<<"分配堆内存,首地址是:"<<hex<<(void *)name<<endl;
}
Student(const Student &s){
cout<<"调用复制构造函数,";
name=new char[strlen(s.name)+1];
strcpy(name,s.name);
score=s.score;
cout<<"分配堆内存,首地址是:"<<hex<<(void *)name<<endl;
}
~Student(){
cout<<"调用析构函数,被释放堆内存的首地址是:"<<hex<<(void *)name<<endl;
delete[]name;
}
void print(){
cout<<"姓名是:"<<name<<",成绩是:"<<score<<endl;
}
private:
char *name;
int score;
};
void main(){
Student s1("卢小曼",80),s2(s1);
s1.print();
s2.print();
}
2.
#include <iostream.h>
#include <math.h>
#include <string.h>
class RMB{
public:
RMB(int y=0,int j=0,int f=0){
yuan=y,jiao=j,fen=f;
cout<<"调用构造函数\n";
}
RMB(const RMB &r){
yuan=r.yuan,jiao=r.jiao,fen=r.fen;
cout<<"调用复制构造函数\n";
}
~RMB(){
cout<<"调用析构函数\n";
}
void disp(){
cout<<yuan<<"元"<<jiao<<"角"<<fen<<"分\n";
}
void set(int y=0,int j=0,int f=0){
yuan=y,jiao=j,fen=f;
}
void addRMB(RMB &r1,RMB &r2);
void subRMB(RMB &r1,RMB &r2);
private:
int yuan,jiao,fen;
};
void RMB::addRMB(RMB &r1,RMB &r2){
int fen1,fen2,fen3;
fen1=100*r1.yuan+10*r1.jiao+r1.fen;
fen2=100*r2.yuan+10*r2.jiao+r2.fen;
fen3=fen1+fen2;
yuan=fen3/100;
jiao=(fen3%100)/10;
fen=fen3%10;
}
void RMB::subRMB(RMB &r1,RMB &r2){
int fen1,fen2,fen3;
fen1=100*r1.yuan+10*r1.jiao+r1.fen;
fen2=100*r2.yuan+10*r2.jiao+r2.fen;
fen3=abs(fen1-fen2);
yuan=fen3/100;
jiao=(fen3%100)/10;
fen=fen3%10;
}
void main(){
RMB r1(32,5,6),r2=r1,r3,r4;
r1.disp();
r2.disp();
r3.disp();
r4.disp();
r2.set(14,8,3);
r3.addRMB(r1,r2);
r4.subRMB(r2,r1);
r1.disp();
r2.disp();
r3.disp();
r4.disp();
}
实验十 继承和派生一、实验目的:
1.学习从既有类派生出新类的方法;
2.方法学习虚函数和抽象类的使用方法。
二、实验内容:
编写一个学生和教师数据输入和显示程序,学生数据有编号、姓名、班号和成绩,教师数据有编号、姓名、职称和部门。要求将编号、姓名输入和显示设计成一个类person,并作为学生数据操作类student和教师数据操作类teacher的基类。
三、实验过程:
(包括源程序)
四、实验结果:
(包括测试数据、操作结果)
五、实验总结:
(包括实验体会)
参考程序:
1.
#include <iostream.h>
#include <iomanip.h>
class person{
int no;
char name[10];
public:
void input(){
cout<<"编号,";cin>>no;
cout<<"姓名:";cin>>name;
}
void disp(){
cout<<"编号"<<no<<endl;
cout<<"姓名"<<name<<endl;
}
};
class student:public person{
private:
char depart[6];
int degree;
public:
void input(){
person::input();
cout<<"班号:";cin>>depart;
cout<<"成绩:";cin>>degree;
}
void disp(){
person::disp();
cout<<"班号:"<<depart<<endl;
cout<<"成绩:"<<degree<<endl;
}
};
class teacher:public person{
private:
char prof[10];
char depart[10];
public:
void input(){
person::input();
cout<<"职称:";cin>>prof;
cout<<"部门:";cin>>depart;
}
void disp(){
person::disp();
cout<<"职称:"<<prof<<endl;
cout<<"部门:"<<depart<<endl;
}
};
void main(){
student s1;
teacher t1;
cout<<"输入一个学生数据:\n";s1.input();
cout<<"输入一个教师数据:\n";t1.input();
cout<<"显示一个学生数据:\n";s1.disp();
cout<<"显示一个教师数据:\n";t1.disp();
}
实验十一 友元函数一、实验目的:
学习友元函数的使用方法。
二、实验内容:
1.用友元函数的方法求圆柱体体积。
提示:圆柱体的体积涉及到两个变量,底面半径r和高h。定义一个类A,r和h为类A的私有成员数据,利用构造函数来对r和h赋初值。定义类A的两个公有成员函数Getr()和Geth(),分别提取私有数据r和h。定义一个友元函数Volum(),提取r和h,并计算圆柱体的体积。
2.设计一个程序,其中有三个类A,B,C,分别为中国银行类、工商银行类和农业银行类。每个类中都包含私有数据balance用于存放储户在该行的存款数,另有一个友元函数total()用于计算储户在这三家银行的总存款数。
三、实验过程:
(包括源程序)
四、实验结果:
(包括测试数据、操作结果)
五、实验总结:
(包括实验体会)
参考程序:
1.
#include <iostream.h>
#define PAI 3.1415927
class A{
float r,h;
public:
A(float x=0,float y=0)
{ r=x; h=y; }
float Getr(){ return r;}
float Geth(){ return h;}
friend void Volum(A b)
{ cout<<PAI*b.r*b.r*b.h<<'\n'; }
} ;
void main( )
{ float r1,h1;
cout<<"输入半径r和高h:";
cin>>r1>>h1;
A a(r1,h1);
cout<<"r="<<a.Getr()<<
"\th="<<a.Geth()<<'\n';
cout<<"Volum= ";
Volum(a);
}
2.
#include <iostream.h>
class A{
float balance;
public:
A(float x=0){ balance=x; }
friend float total(A a)
{ return a.balance; }
};
class B{
float balance;
public:
B(float x=0){ balance=x; }
friend float total(B b)
{ return b.balance; }
};
class C{
float balance;
public:
C(float x=0){ balance=x; }
friend float total(C c)
{ return c.balance; }
};
void main( )
{ A a(2e5);
B b(3.5e5);
C c(2.8e4);
cout<<"total="<<total(a)+total(b)
+total(c)<<'\n';
}

#include <iostream.h>
class A{
float balance;
public:
A(float x=0){ balance=x; }
friend void total(A a,float *s)
{ *s+=a.balance; }
};
class B{
float balance;
public:
B(float x=0){ balance=x; }
friend void total(B b,float *s)
{ *s+=b.balance; }
};
class C{
float balance;
public:
C(float x=0){ balance=x; }
friend void total(C c,float *s)
{ *s+=c.balance; }
};
void main( )
{ float sum=0,a1,b1,c1;
cout<<"分别输入存款数a,b,c:";
cin>>a1>>b1>>c1;
A a(a1);
B b(b1);
C c(c1);
total(a,&sum);
total(b,&sum);
total(c,&sum);
cout<<"total="<<sum<<'\n';
}
实验十二 运算符重载一、实验目的:
学习操作符重载的方法。
二、实验内容:
定义一个学生类,数据成员包括:姓名,学号,C++、数学和物理的成绩。重载运算符“<<”和“>>”,实现学生类对象的直接输入和输出。增加转换函数,实现姓名和总成绩的转换。设计一个完整的程序,验证成员函数和重载运算符的正确性。
三、实验过程:
(包括源程序)
四、实验结果:
(包括测试数据、操作结果)
五、实验总结:
(包括实验体会)
参考程序:
#include <iostream.h>
#include <string.h>
class student{
int no;
char name[20];
float c;
float math;
float pyh;
public:
friend istream &operator >>(istream &ins,student &t)
{ cout<<"input Data(No,name,c,math,pyh):\n";
ins>>t.no>>t.name>>t.c>>t.math>>t.pyh;
return ins;
}
friend ostream &operator<<(ostream &outs,student &t)
{
outs<<"No"<<'\t'<<"Name"<<'\t'<<"c"<<'\t'<<"math"<<'\t'<<"pyh"<<'\n';
outs<<t.no<<'\t'<<t.name<<'\t'<<t.c<<'\t'<<t.math<<'\t'<<t.pyh<<'\n';
return outs;
}
operator char *()
{ char *s=new char[strlen(name)+1];
strcpy(s,name);
return s;
}
operator float()
{return c+math+pyh;}
};
void main()
{ student st1;
char *p;
float s;
cin>>st1;
cout<<st1;
p=st1;
s=st1;
cout<<p<<'\t'<<s<<'\n';
delete []p;
}
实验五 指针、引用和结构类型一、实验目的:
1.学习引用的声明和使用;
2.学习指向函数的指针变量的定义和使用;
3.学习结构类型、变量的定义和使用;
4.学习结构数组的定义和使用。
二、实验内容:
1.编写程序,从键盘读入若干个数,输出它们的最大值,最小值和平均值,要求:
(1)用一个数组存放各整数;
(2)在主函数实现数据的输入和输出,用一个函数sub()求出它们的最大值、最小值和平均值;
(3)分别用传指针和传引用两种方式编写sub()函数。
2.编写程序,输入8个不等长的字符串,调用选择法排序函数对它们从小到大排序,并求出其中最长的字符串,然后在主函数中输出结果。
3.编写程序,建立一个键表,每个结点包括一个职工的数据:工号、姓名和工资,要求:
(1)输入若干个职工的数据,当输入的工号为-1时结束输入;
(2)输入一个工号,将键表中结点所包含工号等于此工号的结点删去;
(3)输出链表的全部数据。
三、实验过程:
(包括源程序)
四、实验结果:
(包括测试数据、操作结果)
五、实验总结:
(包括实验体会)
参考解答:
1.
用传指针的方式:
#include <iostream.h>
void sub(int *p,int n,double *pmax,double *pmin,double *paver);
void main(){
int a[10];
double max,min,aver;
cout<<"请输入10个数:";
for(int i=0;i<10;i++)cin>>a[i];
sub(a,10,&max,&min,&aver);
cout<<"这10个数的最大值是"<<max<<",最小值是"<<min<<",平均值是"<<aver<<endl;
}
void sub(int *p,int n,double *pmax,double *pmin,double *paver){
*pmax=*pmin=*paver=*p;
p++;
for(int i=1;i<n;i++,p++){
if(*pmax<*p)*pmax=*p;
else if(*pmin>*p)*pmin=*p;
*paver+=*p;
}
*paver/=n;
}
用传引用的方式:
#include <iostream.h>
void sub(int arr[],int n,double &rmax,double &rmin,double &raver);
void main(){
int a[10];
double max,min,aver;
cout<<"请输入10个数:";
for(int i=0;i<10;i++)cin>>a[i];
sub(a,10,max,min,aver);
cout<<"这10个数的最大值是"<<max<<",最小值是"<<min<<",平均值是"<<aver<<endl;
}
void sub(int arr[],int n,double &rmax,double &rmin,double &raver){
rmax=rmin=raver=arr[0];
for(int i=1;i<n;i++){
if(rmax<arr[i])rmax=arr[i];
else if(rmin>arr[i])rmin=arr[i];
raver+=arr[i];
}
raver/=n;
}
2.
#include <iostream.h>
#include <string.h>
#define N 8
int sort(char **p,int n);
void main(){
char a[30],*s[N];
cout<<"请输入8个字符串:\n";
for(int i=0;i<N;i++){
cin>>a;
s[i]=new char[strlen(a)+1];
strcpy(s[i],a);
}
int max=sort(s,N);
cout<<"\n经从小到大排序后,这8个字符串是:\n";
for(i=0;i<N;i++)cout<<s[i]<<endl;
cout<<"其中最长的字符串是:"<<s[max]<<endl;
}
int sort(char **p,int n){
int k,m=0;
for(int i=0;i<n-1;i++){
k=i;
for(int j=i+1;j<n;j++)
if(strcmp(*(p+k),*(p+j))>0)k=j;
if(k!=i){
char *temp=*(p+i);
*(p+i)=*(p+k);
*(p+k)=temp;
}
}
for(i=1;i<n;i++)
if(strlen(*(p+m))<strlen(*(p+i)))m=i;
return m;
}
3.
#include <iostream.h>
#include <stdlib.h>
struct Employee{
int num;
char name[20];
float salary;
Employee *next;
};
Employee *head;
Employee *create(){
Employee *p,*pend;
pend=p=new Employee;
if(p==NULL){
cout<<"内存不足,程序退出";
exit(0);
}
cout<<"请输入职工的工号、姓名和工资:\n";
cin>>p->num>>p->name>>p->salary;
head=NULL;
while(p->num!=-1){
if(head==NULL)head=p;
else pend->next=p;
pend=p;
p=new Employee;
if(p==NULL){
cout<<"内存不足,程序退出";exit(0);
}
cout<<"请输入职工的工号、姓名和工资:\n";
cin>>p->num>>p->name>>p->salary;
}
pend->next=NULL;
delete p;
return head;
}
void dele(Employee *head,int id){
if(head){
Employee *p1=head,*p2,*q;
while(p1->next!=NULL){
while(id!=p1->num&&p1->next!=NULL){
p2=p1;
p1=p1->next;
}
if(id==p1->num){
if(p1==head)head=head->next;
else p2->next=p1->next;
q=p1;p1=p1->next;
delete q;
}
}
}
}
void print(Employee *head){
Employee *p;
cout<<"该链表的各个结点依次是:\n";
p=head;
while(p){
cout<<p->num<<','<<p->name<<','<<p->salary<<'\n';
p=p->next;
}
}
void main(){
Employee *h=create();
int id;
print(h);
cout<<"请输入要删除结点的工号:";
cin>>id;
dele(h,id);
print(h);
}