大一上 c + +上机实验总结目录:返回目录
1、自学教材P140-P141有关随机数的知识,然后做P168编程题的第2题
参考程序:
#include<iostream>
#include<cmath>
#include <cstdlib>
#include<ctime>
using namespace std;
int main()
{
int a[10],i,j;
srand( int( time(0)) ); //为随机数生成器设置种子值
for( i=0; i<10; i++ )
{
a[i] = rand()%90+10; //产生随机数存放到数组中
for( j=0; j<i; j++ ) //排除相同数据
while( a[i]==a[j] )
a[i]=rand()%90+10;
}
for( i=0; i<10; i++ )
cout << a[i] << " ";
cout << endl;
for( i=0; i<10; i++ )
{
double m=sqrt( double (a[i]) );
for( j=2; j<=m; j++)
if( a[i] % j == 0 )break;
if( j>m )
cout << a[i] << " ";
}
cout << "是素数!" << endl;
}
2、输出杨辉三角前10行:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
题解题思路:
杨辉三角各行上的数有以下的规律:
各行第1个数都是1
各行最后一个数都是1
从第3行起,除上面指出的第1个数和最后一个数外,其余各数是上一行同列和前一列两个数之和。可以这样表示:a[i][j]=a[i-1][j]+a[i-1][j-1]
参考程序1:
#include <iostream>
#include<iomanip>
using namespace std;
int main()
{int i,j,a[10][10];
for(i=0;i<10;i++)
{a[i][i]=1; /*使对角线元素的值为1*/
a[i][0]=1; /*使第1列元素的值为1*/
}
for(i=2;i<10;i++) /*从第3行开始处理*/
for(j=1;j<=i-1;j++)
a[i][j]=a[i-1][j]+a[i-1][j-1];
for(i=0;i<10;i++)
{for(j=0;j<=i;j++)
cout<<setiosflags(ios::left)<<setw(6)<<a[i][j]; /*输出数组各元素的值*/
cout<<endl;
}
cout<<endl;
return 0;
}
参考程序2:
#include <iostream>
#include<iomanip>
using namespace std;
int main()
{int i,j,a[10][10]={0};
for(i=0;i<10;i++)
a[i][0]=1; /*使第1列元素的值为1*/
for(i=1;i<10;i++) /*从第2行开始处理*/
for(j=1;j<=i;j++)
a[i][j]=a[i-1][j]+a[i-1][j-1];
for(i=0;i<10;i++)
{for(j=0;j<=i;j++)
cout<<setiosflags(ios::left)<<setw(6)<<a[i][j]; /*输出数组各元素的值*/
cout<<endl;
}
cout<<endl;
return 0;
}
3、将二维数组(5行5列)的右上部分清0。
算法思想:扫描二维数组的上三角,在扫描的同时将上三角元素清0
参考程序:
#include <iostream>
#include<iomanip>
using namespace std;
int main()
{int a[5][5]={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20},{21,22,23,24,25}},i,j;
for(i=0;i<5;i++)
for(j=i+1;j<5;j++)
a[i][j]=0;
//输出改变后的数组
for(i=0;i<5;i++)
{for(j=0;j<5;j++)
cout<<setiosflags(ios::left)<<setw(3)<<a[i][j];
cout<<endl;
}
return 0;
}
4、教材P168 编程题第5题
参考程序:
#include<iostream>
using namespace std;
int main()
{
int a[4] = { 1, 2, 5, 7 };
int b[8] = { 3, 4, 8, 8, 9, 10, 11, 12 };
int c[12];
int i,j,k;
i = j = k = 0;
while( i<4 && j<8 )
{
if( a[i] > b[j] ) //当a[i]>b[j],把b[i]写入数组c
{ c[k] = b[j]; k++; j++; }
else //当a[i]<=b[j],把a[i]写入数组c
{ c[k] = a[i]; k++; i++; }
}
while( i<4 )
{
c[k] = a[i]; i++; k++; //把数组a的剩余元素写入数组c
}
while( j<8 )
{
c[k] = b[j]; k++; j++; //把数组b的剩余元素写入数组c
}
for( i=0; i<12; i++ )
cout << c[i] << " ";
cout << endl;
}
5、一个学习小组有5个人,每个人有三门课的考试成绩。求全组分科的平均成绩和各科总平均成绩。
提示:可设一个二维数组a[3][5]存放五个人三门课的成绩。再设一个一维数组grade[3]存放所求得各分科平均成绩,设变量average 为全组各科总平均成绩。
参考程序:
#include <iostream>
using namespace std;
int main()
{ int i,j,s=0, a[3][5];
float grade[3],average;
cout<<"input score"<<endl;
for(i=0;i<3;i++)
{ for(j=0;j<5;j++)
{ cin>>a[i][j];
s=s+a[i][j];
}
grade[i]=s/5.0;
s=0; //注意,在累加下一门课程成绩之和时,s要清0
}
average =(grade[0]+grade[1]+grade[2])/3.0; //求总平均成绩
cout<<"math:"<<grade[0]<<endl<<"English:"<<grade[1]<<"clanguag:"<<grade[2]<<endl;
cout<<"total:"<<average<<endl;
return 0;
}
6、求s=a+aa+aaa+……aa…a(最后一项有n个a),其中,a是一个数字,n表示a的位数。例如:2+22+222+2222+22222(此时n=5)
参考程序:
#include <iostream>
using namespace std;
int main()
{ int a,n,i=1,s=0,t=0;
cout<<"a,n=:"<<endl;
cin>>a>>n;
while (i<=n)
{t=t*10+a;
s=s+t; /*赋值后的s为多项式前i项之和*/
++i;
}
cout<<"a+aa+aaa+...="<<s<<endl;
return 0;
}
7、输入两个正整数m和n,求其最大公约数和最小公倍数
参考程序1:
#include <iostream>
using namespace std;
int main()
{ int p,r,u,v,temp;
cout<<"请输入两个正整数u,v:"<<endl;
cin>>u>>v;
if (u<v)
{temp=u;
u=v;
v=temp;
}
p=u*v;
r=u%v;
while(r!=0)
{u=v;
v=r;
r=u%v;
}
cout<<"它们的最大公约数为:"<<v<<endl;
cout<<"它们的最小公约数为:"<<p/v<<endl;
return 0;
}
参考程序2:
#include <iostream>
using namespace std;
int main()
{ int p,r,u,v,temp;
cout<<"请输入两个正整数u,v:"<<endl;
cin>>u>>v;
if (u<v)
{temp=u;
u=v;
v=temp;
}
p=u*v;
while((r=u%v)!=0)
{u=v;
v=r;
}
cout<<"它们的最大公约数为:"<<v<<endl;
cout<<"它们的最小公约数为:"<<p/v<<endl;
return 0;
}
8、输入3行字符串,每行最多有80个字符。要求分别统计出其每行中英文大写字母、小写字母、空格以及其他字符的个数。(提示:可以定义一个3行80列的二维字符数组,把此二维字符数组的每一行看成是一个一维的字符数组,每个一维字符数组中存放一个字符串)
参考程序:
#include <iostream>
using namespace std;
int main()
{char a[3][80];
int i,j,e,x,k,q;
//输入3行字符串
for(i=0;i<3;i++)
cin.getline(a[i],80);//gets(a[i]);
for(i=0;i<3;i++)
puts(a[i]);
for(i=0;i<3;i++)
{ e=0;x=0;k=0;q=0;
for(j=0;a[i][j]!='\0';j++)
{if(a[i][j]>='A'&&a[i][j]<='Z')
e++; //统计大写字母个数
else if(a[i][j]>='a'&&a[i][j]<='z')
x++; //统计小写字母个数
else
if(a[i][j]==' ')
k++; //统计空格个数
else
q++;//统计其它字符个数
}
cout<<"第"<<i<<"行上大写字母、小写字母、空格、其它字符个数分别为"<<e<<","<<x<<","<<k<<","<<q<<endl;
}
return 0;
}
9、从键盘输入一行字符,将其中的大写变小写,小写变大写,其余不变,要求把变化前后的字符串分别输出。
参考程序:
#include<iostream>
using namespace std;
int main( )
{
char ch[50];
int i;
cin.getline(ch,50); //可输入一行包含空格的字符串,系统会自动加'\0'
cout<<ch<<endl;
for(i=0;ch[i]!='\0';i++)
if(ch[i]>='A'&&ch[i]<='Z')
ch[i]=ch[i]+32;
else
if(ch[i]>='a'&&ch[i]<='z')
ch[i]=ch[i]-32;
cout<<ch<<endl;
return 0;
}
10、输入任意两个字符串,实现字符串的连接。不能使用strcat函数。
参考程序:
#include <iostream>
#include<cstring>
using namespace std;
int main()
{int i,j;
char s1[200],s2[100];
cout<<"input string1:"<<endl;
//cin.getline(s1,100);
cin>>s1;
cout<<"input string2:"<<endl;
//cin.getline(s2,100);
cin>>s2;
for (i=0;s1[i]!='\0';i++);
for(j=0;s2[j]!='\0';j++)
s1[i+j]=s2[j];
s1[i+j]='\0';
cout<<"\nThe new string is: \n"<<s1<<endl;
return 0;
}