C++第四章实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
西安交通大学实验报告
一.实验目的
1.熟练掌握一维、二维数组的使用;
2.熟练掌握字符数组、字符串的操作;
3.巩固循环语句的使用。
二.实验内容
(-)实验题目一:输入N(例如N为20)个整数,统计输出负数的个数、正整数的个数及0的个数;计算输出所有负数之和、所有正整数之和。
1.要点分析
利用一维数组进行循环判断。
2.程序源代码
#include<iostream>
using namespace std;
int main()
{
int n,negative=0,positive=0,zero=0,sumne=0,sumpo=0;//定义变量
cout<<"请输入需统计整数的个数(少于):";
cin>>n;
int number[300];
if(n>300)//判断是否超过数组总数
cout<<"无法统计多于个的整数"<<endl;
else
{
for(int i=0;i<n;i++)//循环输入数组元素
{
cout<<"请输入整数:";
cin>>number[i];
if(number[i]<0)//判断负数
{
negative++;
sumne+=number[i];
}
else if(number[i]>0)//判断正数
{
positive++;
sumpo+=number[i];
}
else//判断0
zero++;
}
cout<<"共输入"<<n<<"个整数,其中有"<<negative<<"个负数,"<<positive<<"个正数,"<<zero<<"个,"<<endl<<"所有负数之和为"<<sumne<<",所有正数之和为"<<sumpo<<endl;
}
return 0;
}
3.实验结果
(二)实验题目二:编写程序,将N(N<10)阶方阵转置。
注意,转置要使矩阵本身作转置运算,而不仅是在屏幕显示转置效果。
1.要点分析
(1)方阵元素a[i][j]转置后,相应位置变为a[j][i],利用数组循环依次做转置运算后输出;
(2)不是再声明一个B是A的转置,也不是按列输出;
(3)转置要以防转置两次后复原,因此以主对角线为界,扫描右上方的进行转置。
2.程序源代码
#include<iostream>
using namespace std;
int main()
{
double a[10][10];//定义方针,阶数最大为
int i,j,n;
cout<<"请输入方阵阶数(小于)";
cin>>n;
if(n>9)//判断阶数
cout<<"方阵阶数应小于,请重新输入"<<endl;
else
{
cout<<"请输入方阵"<<endl;
for(i=0;i<n;i++)//循环输入方阵
{
for(j=0;j<n;j++)
cin>>a[i][j];
cout << endl;
}
for(i=0;i<n;i++)//以对角线为轴进行转置
{
for(j=i+1;j<n;j++)//只转置一次,因此以对角线为界,转置其右上方
{
double tmp=a[i][j];
a[i][j]=a[j][i];
a[j][i]=tmp;
}
}
cout << "方阵的转置阵为:" << endl;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
cout<<a[i][j]<<'\t';//输出转置阵
cout << endl;
}
}
return 0;
}
3.实验结果
(三)实验题目三:设有一个有序的整型数组,数据元素从小到大排列,初始时数组中没有元素。
用户从键盘输入若干整数,将其插入到数组的合适位置,使数组保持有序,并打印插入后的数组元素。
程序要考虑对数组满时的情况的处理。
1.要点分析
数组为空时,输入元素将其放入a[0]即可。
若n个元素且有序排列时,
再输入一个x插入,方法是先将其与a[n-1]比较,如果x<a[n-1],就将
后移一个位置,再继续与前一个比较,循环至x不小于前面的元素,就
将x放在该元素后面,输出数组,直至数组满时提示。
2.程序源代码
#include<iostream>
using namespace std;
int main()
{
double a[10],x;//定义数组最多放入10个元素
int n=0,j;
while(1)//一直循环
{
cout<<endl<<"请输入数x:";
cin>>x;
if(n==10)//元素满时提示,并跳出循环
{
cout<<"数组已满"<<endl;
break;
}
for(j=n-1;j>=0;j--)//循环判断x应插入位置
{
if(x>a[j])//x大于数组中的数(从大到小)时跳出
break;
a[j+1]=a[j];//x小于时,现有位置的数后移一位
}
a[j+1]=x;//在插入位置处赋予x数值
n++;
cout<<"插入值后,有序数组为:"<<endl;//输出有序数组
for(j=0;j<n;j++)
cout<<a[j]<<'\t';
}
return 0;
}
3. 实验结果
(四)实验题目四:打印杨辉三角形,其中的行数由用户输入。
1.要点分析
除边界外,其元素算法为a[i][j]=a[i-1][j-1]+a[i-1][j],通过数组利用循环输出杨辉三角。
2.程序源代码
#include<iostream>
using namespace std;
int main()
{
int a[50][50],n,i,j;
cout<<"请输入行数(小于):";
cin>>n;
if(n>50)//判断行数是否超过界限
cout<<"请输入小于的行数"<<endl;
else if (n<1)
cout<<"请输入大于的行数"<<endl;//控制行数大于else
{
for(i=0;i<n;i++)
{
a[i][0]=1; //定义三角边界上的元素为
a[i][i]=1;
for(j=1;j<i;j++)
a[i][j]=a[i-1][j-1]+a[i-1][j];//计算三角中间元素}
cout<<"杨辉三角形前"<<n<<"行打印如下:"<<endl;
for(i=0;i<n;i++)//打印杨辉三角
{
for(j=0;j<=i;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
}
return 0;
}
3.实验结果
(五)实验题目五:请编程进行凯撒加密:任意输入明文字符串(不大于1000),将明文中字母或数字用其后第4个字母或数字代替,输出密文。
1.要点分析
(1)需要判断字符串范围,不同范围计算公式不同;
(2)使用cin.get控制字符串中空格也算入,并计算字符串长度n,用n控制数组循环进行加密。
2.程序源代码
#include<iostream>
using namespace std;
int main()
{
char str[1000];
cout<<"请输入明文字符串(不大于1000):";
cin.get(str,1000);//输入识别空格的字符串
int n=0;
for(n;str[n]!='\0';n++);//计算字符串除结束符号的字符数
for(int i=0;i<n;i++)//对字符依次判断并进行加密
{
if(str[i]>='0'&&str[i]<'6'||str[i]>='a'&&str[i]<'w'||str[i]>='A'&&str[i]<'W')//不需循环的str[i]=str[i]+4;
else if(str[i]>'5'&&str[i]<='9')//数字需循环的
str[i]=str[i]-6;
else if(str[i]>'v'&&str[i]<='z'||str[i]>'V'&&str[i]<='Z')//字母需循环的
str[i]=str[i]-22;
}
cout<<"密文为:"<<str<<endl;
system("pause");
return 0;
}
3.实验结果
(六)实验题目六:编写凯撒解密程序,即将上题凯撒加密的密文解密成明文。
1.要点分析
同上题逻辑,仅算法倒推。
2.程序源代码
#include<iostream>
using namespace std;
int main()
{
char str[1000];
cout<<"请输入密文字符串(不大于1000):";
cin.get(str,1000);
int n=0;
for(n;str[n]!='\0';n++);
for(int i=0;i<n;i++)
{
if(str[i]>'3'&&str[i]<='9'||str[i]>'d'&&str[i]<='z'||str[i]>='D'&&str[i]<'Z')
str[i]=str[i]-4;
else if(str[i]>='0'&&str[i]<'4')
str[i]=str[i]+6;
else if(str[i]>='a'&&str[i]<'e'||str[i]>='A'&&str[i]<='E')
str[i]=str[i]+22;
}
cout<<"明文为"<<str<<endl;
system("pause");
return 0;
}
3.实验结果
(七)实验题目七:编写程序完成如下功能:
①定义二维数组8 × 8;
②自动生成数组中每个数据元素值为(i+1)×(j+1),i和j分别为行列坐标,输出该数组所有元素;
③计算主对角线元素之和,计算次对角线元素之和,并输出;
④将主对角线元素之和加到第一行中每个元素中,然后输出第一行所有元素值。
1.要点分析
运用数组和循环控制达到题意,每个元素array[i][j]=(i+1)*(j+1),主对角线元素之和为array[i][i]求和,次对角线元素之和为array[i][7-i]求和。
2.程序源代码
#include<iostream>
using namespace std;
int main()
{
int array[8][8],i,j;
cout<<"该数组所有元素为:"<<endl;
for(i=0;i<8;i++)//循环计算数组中所有元素
{
for(j=0;j<8;j++)
{
array[i][j]=(i+1)*(j+1);
cout<<array[i][j]<<’\t’;
}
cout<<endl;
}
int sum1=0,sum2=0;
for(i=0;i<8;i++)
{
sum1+=array[i][i];//计算主对角线元素之和
sum2+=array[i][7-i];//计算次对角线元素之和
}
cout<<"主对角线元素之和为"<<sum1<<",次对角线元素之和为"<<sum2<<endl;
cout<<"将主对角线元素之和加到第一行中每个元素中,第一行所有元素值为:"<<endl;
for(j=0;j<8;j++)
{
array[0][j]+=sum1;//计算第一行改变之后元素数值
cout<<array[0][j]<<" ";
}
cout<<endl;
system("pause");
return 0;
}
3.实验结果
三. 个人小结。