ENS0531 – 华 中 科 技 大 学 Solved

$ 20.99
Category:

Description

《计算机基础与程序设计(C++)》实 验 报 告
一、实验目的
⚫ 掌握一维数组的定义、输入、输出和基本操作。
⚫ 掌握二维数组的定义、输入、输出和基本操作。
⚫ 掌握字符串的存储和访问。
⚫ 使用数组处理解决实际问题的能力。
二、实验内容
1.阅读程序
1) #include <iostream> #include<cmath> using namespace std; int main() { const int n=5; int i,a[n]; for(i=0;i<n;i++) { cin>>a[i]; cout<<a[i]; } return 0;
}运行上述的程序,改正其中的错误,并解释错误原因。定义数组时只能使用常量。

2) #include <iostream>
#include<cmath> using namespace std; int main() { int i; int a[6]={0,1,2,3,4,5}; for(i=0;i<=5;i++) cout<<a[i]; return 0;
} 运行上述的程序,其结果是否正确,如不确请修改正确,并解释原因。
定义数组元素个数过少,越界访问。5—>6

3) #include <iostream> using namespace std; int main( )
{ char rstr[10 ]=”abcdefgh”,dstr[10]; int i;
for(i=0; rstr[i]!=”; i++) //循环条件可以写成 rstr1[i]!=0; 或 rstr1 dstr[i]=rstr[i]; dstr[i]=”;
cout<<“输出字符串 dstr:”<<dstr<<endl;
return 0;
}
上述程序的功能是将字符串 rstr 复制到目标串 dstr 中,运行该程序结果是否正确,如不正确请修改正确,并解释原因。

4)#include <iostream> using namespace std;
int main( )
{
char name1[ ]={‘a’,’b’,’c’,’d’,”}; char name2[ ]=”abcd”; for(int i=0;i<4;i++) cout<<name1[i]; cout<<endl; cout<<name1<<endl; cout<<name2<<endl; return 0;
} 运行上述程序,比较三种输出的异同,并解释原因。

5)#include<iostream> using namespace std; int main()
{
int a[5]={1,2,3,4,5}; int *p=a;
for(int i=0;i<5;i++) //1
cout<<a[i]; cout<<endl; cout<<a[0]<<a[1]<<a[2]<<a[3]<<a[4]<<endl; //2
cout<<*p<<*(p+1)<<*(p+2)<<*(p+3)<<*(p+4)<<endl; //3
for(i=0;i<5;i++) //4
cout<<*(p+i);
cout<<endl;
for(i=0;i<5;i++) //5
{
cout<<*p; p++;
}
cout<<endl;
}
在上述语句的基础上,请用 5 种方式输出数组 a 的编程题
1)定义包含 10 个元素的一维数组,输入、输出各元素的值,并求出最大值和最小值及其下标。
要求:
1) 程序原代码。(直接粘贴再此)
#include<iostream> using namespace std;
int main()
{ int a[10]; int i;
int min,max,minn,maxn;
cout<<“请输入各元素的值”<<endl;
for(i=0;i<=9;i++) cin>>a[i]; min=a[0]; max=a[0]; minn=maxn=0;
for(i=0;i<=9;i++)
{ if(a[i]<min)
min=a[i]; if(a[i]>max)
max=a[i];
}
for(i=0;i<=9;i++)
{ cout<<“a[“<<i+1<<“]的值为”<<a[i]<<” “;
} cout<<endl;
cout<<“最小值为:”<<min<<endl; cout<<“数字编号为:”;
for(i=0;i<10;i++) if(a[i]==min) cout<<i+1<<” “;
cout<<endl;
cout<<“最大值为:”<<max<<endl; cout<<“数字编号为:”;
for(i=0;i<10;i++) if(a[i]==max) cout<<i+1<<” “;
cout<<endl;

}
2) 解决本题的算法思路描述
定义数组,输入数据,求最大最小并输出,最后判断下标(这样做可以解决当存在多个最小值时下标的输出问题)
3) 调试过程的记载(包括出现的错误,以及修改过程)未出现错误在调试过程中增加了制表符(为了使数据看起来更整齐)

4) 归纳本题应用的知识点或算法数组,判断,循环

2)编写一个程序,定义 5 行 4 列二维数组,并对前 4 行 4 列的元素赋值,计算二维数组前 4 行各列之和,且将每列之和放于各列最后一行的位置,然后输出该二维数组(按行列的格式输出)。要求:
1) 程序原代码。(直接粘贴再此)
#include<iostream> using namespace std;
int main()
{ int i,j; int a[4][5];
for(i=0;i<=3;i++)
for(j=0;j<=3;j++) cin>>a[i][j]; for(i=0;i<=3;i++) for(j=0,a[i][4]=0;j<=3;j++) a[i][4]+=a[i][j]; for(i=0;i<=3;i++)
{
for(j=0;j<=4;j++) cout<<a[i][j]<<‘ ‘;
cout<<endl;
}
}

2) 解决本题的算法思路描述定义二维数组,输入,求和,输出。
3) 调试过程的记载(包括出现的错误,以及修改?)未出错,无修改;
4) 归纳本题应用的知识点或算法

3)编程输出 10 行的杨辉三角形。(使用二维数组并利用每个系数等于其上两系数之和,要求按等腰三角形的格式输出)要求:
1) 程序原代码。(直接粘贴再此)
#include<iostream> #include<iomanip> using namespace std; int main()
{ int a[11][11]={0}; int i,j; a[1][1]=1; for(i=2;i<=10;i++) for(j=1;j<=i;j++) a[i][j]=a[i-1][j-1]+a[i-1][j]; for(i=1;i<=10;i++)
{
for(int k=0;k<=9-i;k++) cout<<” “; for(j=1;j<=i;j++) cout<<setw(6)<<a[i][j]; cout<<endl;
}
}

2) 解决本题的算法思路描述定义数组,找到递推式,输出并控制格式
3) 调试过程的记载(包括出现的错误,以及修改) 无错误
修改时改变了输出的行首空格个数
4) 归纳本题应用的知识点或算法循环,二维数组运算,输出格式控制;

4)编程将一个字符串插入另一个字符串的指定位置。
要求:
1) 程序原代码。 (直接粘贴再此)
#include<iostream> using namespace std;
int main()
{ char a[100],b[100],c[100]; int j,i;
cout<<“请输入原字符串:”;
cin>>a;
cout<<“请输入插入的字符串:”;
cin>>b;
cout<<“请输入要插入的位置”;
cin>>j; for(i=0;i<j;i++) c[i]=a[i]; for(;b[i-j];i++) c[i]=b[i-j]; for(;i<100;i++) c[i]=a[i-j];
cout<<“插入后的字符串为:”<<c<<endl;

}

2) 解决本题的算法思路描述 定义三个字符串,做三次循环的赋值即可;

3) 调试过程的记载(包括出现的错误,以及修改) 第三次赋值出错导致插入变为替换,更改下标后正常
4) 归纳本题应用的知识点或算法 数组,赋值,循环

5)在数列{12 45 67 78 89 90 234 789 900}中查找是否存在数据 89,若存在删除掉,否则显示不存在该数。要求:
1) 程序原代码。(直接粘贴再此)
#include<iostream> using namespace std; int main()
{ int flag=0;
int a[]={12,45,67,78,89,90,234,789,900}; for(int i=0;a[i]!=0&&a[i+1]!=0;i++) if(a[i]==89)
{
for(;a[i];i++) a[i]=a[i+1]; flag=1;}
if(flag==0)
cout<<“不存在该数字”<<endl;
for(int i=0;a[i];i++)
cout<<“a”<<i<<“=”<<a[i]<<” “;

}
2) 解决本题的算法思路描述
若存在则之后的数值均等于后一项的值,此时最后一个数变成零(数组外也默认为零),输出时输出
非零值即可
3) 调试过程的记载(包括出现的错误,以及修改?)无错误,未修改
4) 归纳本题应用的知识点或算法数组,判断

6)在一个有序的数列{12 45 67 78 89 90 234 789 900} 插入一个数 80,要求插入后该数列仍有序。
要求:
1) 程序原代码。(直接粘贴再此)
#include<iostream> using namespace std;
int main()
{ int *p,n,i,j,bulabula; int a[]={12,45,67,78,89,90,234,789,900}; for(i=0;a[i];i++); i–; p=new int[i]; for(j=0;j<=i;j++)
*(p+j)=a[j];
cout<<“原数列为:”<<endl;
for(j=0;j<=i;j++)
cout<<“a”<<j<<“=”<<*(p+j)<<‘ ‘; cout<<endl;
i++;
cout<<“请输入要插入的数字”<<endl;
cin>>n;
*(p+i)=n; for(j=i;j>=0;j–) if(*(p+j)<*(p+j-1))
{
bulabula=*(p+j); *(p+j)=*(p+j-1);
*(p+j-1)=bulabula;
}
else break;
cout<<“插入后的数列为:”<<endl;
for(j=0;j<=i;j++) cout<<“a”<<j<<“=”<<*(p+j)<<‘ ‘; cout<<endl;

}
2) 解决本题的算法思路描述先插入后通过调整法排序

3) 调试过程的记载(包括出现的错误,以及修改?)无错误,未修改
4) 归纳本题应用的知识点或算法数组,指针

7)改写教材例 5.23 (10 本书中查找某本书)要求先排序然后用折半查找的方法查找。
要求:
1) 程序原代码。(直接粘贴再此)
#include <iostream> #include<cstring> using namespace std; int main() { char t[20];
char name[10][200]={“微积分”,”程序设计基础”,”视听说教程”,”综合教程”,”新视野”,”学习
指导书”,”线性代数”,”高等数学”,”英语四级词汇”,”安全警示教育”};
int j,i,min;
for(j=0;j<10;j++)
{ min=j;
for(i=j+1;i<10;i++)
{
if(strcmp(name[min],name[i])>0)
{min=i;
strcpy(t,name[j]);
strcpy(name[j],name[min]);
strcpy(name[min],t);
}} } int high,low,mid; low=0; high=9;
char s[21];
cout<<“请输入要找的书名”<<endl;
cin.getline(s,21); mid=(low+high)/2; while(strcmp(name[mid],s)!=0&&low<=high)
{ if(strcmp(name[mid],s)<0) low=mid+1; else high=mid-1; mid=(high+low)/2;
}
if(strcmp(name[mid],s)==0)
cout<<“找到,且下标是”<<mid+1<<endl; else cout<<“没有找到!”<<endl;
return 0;
}

2) 解决本题的算法思路描述先排序,后查找
3) 调试过程的记载(包括出现的错误,以及修改?)因书名过长导致无法正常显示,报错(后来缩短了书名)
4) 归纳本题应用的知识点或算法字符型数组的整体赋值和排序
8) (选做题)现有 10 个学生,期末考试有 5 门课程。求每个学生总成绩、平均成绩,并按总成绩高分到低分输出。(参考教材例 5.25 装船问题)
要求:
1) 程序原代码。(直接粘贴再此)

2) 解决本题的算法思路描述

3) 调试过程的记载(包括出现的错误,以及修改?)

5) 归纳本题应用的知识点或算法

9) 分别编写已知 3 边求周长和面积的函数。然后再编写主程序,主程序要求能根据用户的选择决定求周长或面积,并输出结果。要求:
1) 程序原代码。(直接粘贴再此)
#include<iostream> #include<cmath> using namespace std; double l(double,double,double); double s(double,double,double); double l(double a,double b,double c)
{ int l=a+b+c; return l; } double s(double a,double b,double c)
{ int p,s;
p=a+b+c; p/=2; s=p*(p-a)*(p-b)*(p-c); s=sqrt(s); return s; } int main() { int chos;
double a,b,c;
cout<<“请输入三边长:”;
cin>>a>>b>>c;
if(a+b<=c||a+c<=b||b+c<=a)
cout<<“这三条边并不能构成三角形”; else
{
cout<<“您想要什么信息呢?”<<endl; cout<<“1—面积 2—周长 3—都需要”<<endl;
cin>>chos; if(chos==1)
cout<<“三角形的面积为”<<s(a,b,c)<<endl;
if(chos==2)
cout<<“三角形的周长为”<<l(a,b,c)<<endl;
if(chos==3)
cout<<“三角形的面积为”<<s(a,b,c)<<endl; cout<<“三角形的周长为”<<l(a,b,c)<<endl;
}
}

2) 解决本题的算法思路描述

判断,函数;
3) 调试过程的记载(包括出现的错误,以及修改?)无错误,无修改
4)归纳本题应用的知识点或算法 自定义函数
10)选做题 从键盘输入 2 个字符串,判断其中较短的串是否是另一个串的子字符串。
要求:
1) 程序原代码。(直接粘贴再此)
#include<iostream> using namespace std;
int main()
{
int la,lb; //a,b 长度 int flag=0; int i,j,k; char a[100],b[100]; //a,b. cout<<“请输入字符串 a”<<endl; cin.getline(a,100);
cout<<“请输入字符串 b”<<endl;
cin.getline(b,100); for(la=0;a[la];la++)
; for(lb=0;b[lb];lb++)
; if(la==lb)
for(i=0;i<=la;i++)
{ if(a[i]!=b[i]) break; if(i==la) flag=1;
}
if(la<lb)
{ for(j=0;j<=lb;j++) if(a[0]==b[j]) {for(k=0;k<=la;k++) {if(a[k]!=b[j+k]) break;} if(k==la)
flag=2;
}}
if(lb<la)
{ for(j=0;j<=la;j++) if(b[0]==a[j]) {for(k=0;k<=lb;k++) {if(b[k]!=a[j+k]) break;}
if(k==lb)
flag=3;
}} if(flag==0)
cout<<“字符串 a,b 不存在包含关系”<<endl; if(flag==1)
cout<<“字符串 a,b 完全相同”<<endl;
if(flag==2)
cout<<“字符串 a 是字符串 b 的子列”<<endl; if(flag==3)
cout<<“字符串 b 是字符串 a 的子列”<<endl;
}

2) 解决本题的算法思路描述定义并输入字符串,用循环求字符串长度,在较长的字符串中依次判断是否与较短字符串相同;

3) 调试过程的记载(包括出现的错误,以及修改?)未出错开始时只判断了短的是不是较长字符串的子列,后期加入了完全相同以及谁是谁的子列的信息;
4) 归纳本题应用的知识点或算法循环,标志变量;

三、对本次实验内容及方法、手段的改进建议,以及实验心得
实验心得包括:1)哪些知识点已掌握自定义函数,二元数组。
2) 哪些知识点有困难无
3) 对讲课的建议

4) 对没有掌握知识的补救建议

Reviews

There are no reviews yet.

Be the first to review “ENS0531 – 华 中 科 技 大 学 Solved”

Your email address will not be published. Required fields are marked *