写文原因:因为10月3号之前需要上交C++头歌作业,提交格式是md格式,故而直接在CSDN中记录博客,也以便后续复习使用。
自我要求:三道编程题全部写完,同时附上做题思路+代码注释,以及运行截图展示
1、输出八行的杨辉三角
输出格式:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
...
杨辉三角的特点是:①等腰三角形 ②两个最外边都是1
其算法为:每个数等于它上方两数之和
- 将数据保存在二维数组中,便于赋值以及输出
- 先对第一列以及对角线进行处理
- 再对中间需要用算法进行变化的值进行处理
- 最后依次输出即可
#include <iostream>
#include <iomanip>
using namespace std;
/*
杨辉三角 - 等腰三角形,两个最外边都是1
算法:每个数等于它上方两数之和
*/
int main(){
// 为了行数从1开始,就设置n为9
const int n=9;
int i,j,a[n][n];
//设置第一列和对角线元素的值为1
for (i=1;i<n;i++){
a[i][i]=1;//使最右侧边全为1
a[i][1]=1;//使最左侧边全为1
}
//从第三行开始
for (i=3;i<n;i++)
for (j=2;j<=i-1;j++) //j始终慢i一步
//每个数等于它上方两数之和
a[i][j]=a[i-1][j-1]+a[i-1][j]; //如a32=a21+a22[a32代表第三行第二个]
//输出数组各元素的值
for (i=1;i<n;i++){ //从第一行开始
for (j=1;j<=i;j++) //利用j将每一行的数据全部输出
cout<<a[i][j]<< " "; //前元素末尾与后元素末尾之间有空格位
cout<<endl; // 换行
}
cout<<endl;
return 0;
}
改进:输出n行的杨辉三角,n由用户输入
只需要修改一下输入部分即可。
#include <iostream>
#include <iomanip>
using namespace std;
/*
杨辉三角 - 等腰三角形,两个最外边都是1
算法:每个数等于它上方两数之和
*/
int main(){
// 为了行数从1开始,就设置n为9
int n_temp = 1;
cout << "请输入杨辉三角行数(整数):" << endl;
cin >> n_temp;
int n = n_temp+1;
int i,j,a[n][n];
//设置第一列和对角线元素的值为1
for (i=1;i<n;i++){
a[i][i]=1;//使最右侧边全为1
a[i][1]=1;//使最左侧边全为1
}
//从第三行开始
for (i=3;i<n;i++)
for (j=2;j<=i-1;j++) //j始终慢i一步
//每个数等于它上方两数之和
a[i][j]=a[i-1][j-1]+a[i-1][j]; //如a32=a21+a22[a32代表第三行第二个]
//输出数组各元素的值
for (i=1;i<n;i++){ //从第一行开始
for (j=1;j<=i;j++) //利用j将每一行的数据全部输出
cout<<a[i][j]<< " "; //前元素末尾与后元素末尾之间有空格位
cout<<endl; // 换行
}
cout<<endl;
return 0;
}
2、找出二维数组中的鞍点
设计一个算法找出二维数组中的鞍点,即该位置上的元素在该行最大、在该列最小,数组也有可能没有鞍点
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
bool flag; //声明一个布尔变量;
const int n=3,m=3; //定义常变量行和列
int i,j;
int a[n][m];
int k,max,maxj; //maxj为该行最大值的列标
cout<<"请输入一个3乘3的二维数组:"<< endl;
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
{
cin>>a[i][j];
}
}
for(i=0; i<n; i++) //求出该行的最大值的列下标;
{
k=a[i][0];
max=0;
for(j=0; j<m; j++)
{
if(a[i][j]>k)
{
max=a[i][j];
maxj=j;
}
}
flag=true; //默认flag为真
for(k=0; k<n; k++) //判断该行是否是其所在列的最小值;
{
if(max>a[k][maxj])
{
flag=false; //如果不是最小,继续下一行(i=1)的内循环
}
}
if(flag) //如果是最小,则输出
{
cout<<"a["<<i<<"]["<<maxj<<"]="<<max;
cout<<endl;
break;
}
}
if(!flag)
{
cout<<"没有鞍点!";
}
return 0;
}
3、字符串b中的字符复制到数组a当中
编写一个函数void strcpy(char a[],char b[]);将字符串b中的字符复制到数组a当中。(要求不使用C++函数库中的strcpy()函数)
#include<iostream>
using namespace std;
#define size 200 //字符串的最大长度
void strcopy(char * pa , char * pb)
{
int i;
for( i=0;pa[i]!='\0';i++ )
pb[i] = pa[i];
pb[i] = '\0';
}
int main()
{
int i;
char a[15] = "Hello World";
char b[] = "Hi World";
strcopy(b,a);
// b中的元素进入a中
for(i=0;a[i]!='\0';i++){
printf("%c",a[i]);
}
printf("\n");
}
改进:b由用户输入
#include<iostream>
using namespace std;
#define size 200 //字符串的最大长度
void strcopy(char * pa , char * pb)
{
int i;
for( i=0;pa[i]!='\0';i++ )
pb[i] = pa[i];
pb[i] = '\0';
}
int main()
{
int i;
char a[size],b[size];
// 控制行输入
printf("请输入数组b:");
gets(b);
// 调用函数
strcopy(b,a);
// b中的元素进入a中
printf("复制后的数组a:");
for(i=0;a[i]!='\0';i++){
printf("%c",a[i]);
}
printf("\n");
}