问题描述

利用字母可以组成一些美丽的图形,下面给出了一个例子:

ABCDEFG

BABCDEF

CBABCDE

DCBABCD

EDCBABC

这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。

输入格式
输入一行,包含两个整数n和m,分别表示你要输出的图形的行数的列数。
输出格式
输出n行,每个m个字符,为你的图形。
样例输入
5 7
样例输出
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
数据规模与约定

1 <= n, m <= 26。

方法一:寻找简单规律。(使用二维数组)

#include<iostream>

using namespace std;

int main()

int n,m,i,j;
cin>>n>>m;                          /根据需求c++动态建立数组
char **p=new char *[n];             //p[n][m];
for(i=0;i<n;i++)
p[i]=new char[m];
for(i=0,p[i][0]='A';i<n;i++,p[i][0]=p[i-1][0]+1) ///数组下标越界(有左边界和右边界越界两种),解决做法:
{                                    ///1:给数组建立多几个元素(右边界越界)2:在条件里面仔细的控制
for(j=0;j<m;j++)
{  
if(p[i][0]>'A')
{  
while(p[i][j]>'A'&&j<m)   /不加 &&j<m的话,就是另一种下标越界了,会多输出其他的字符。 
{                                    /下面的j++产生的下标越界。
cout<<p[i][j];
p[i][j+1]=p[i][j]-1;
                j++;
}
        p[i][0]='0';
}
if(j<m)
{
cout<<p[i][j];
p[i][j+1]=p[i][j]+1;
   }
}
    cout<<endl;
  p[i][0]='A'+i;
  if(i+1==n)
break;
}
for( i=0;i<n;i++)
   {

delete []  p[i];         // 要在指针前加[] , 否则的话 只释放p[i]所指的第一个单元所占的空间
   }

return 0;
}

///下面对第一种方法进行补充/

1:c++如何动态建立数组:

(1)建立数组:

很多情况下,在预编译过程阶段,数组的长度是不能预先知道的,必须在程序运行时动态的给出
  但是问题是,c++要求定义数组时,必须明确给定数组的大小,要不然编译通不过 
 
  如: int Array[5];正确

int i=5;
       int Array[i]; 错误 因为在编译阶段,编译器并不知道 i 的值是多少

那么,我们该如何解决定义长度未知的数组呢?
   答案是:new 动态定义数组

因为new 就是用来动态开辟空间的,所以当然可以用来开辟一个数组空间
   
   这样,下面的语句:
    int size=50;
    int *p=new int[size]; 是正确的
 
   但是二维动态数组能不能也这样定义呢
   
  int size=50,Column=50;
  int (*p)[Column]=new int [size][Column]

这样的语句,编译器通不过,为什么呢?
  首先 new int[size][Column] 就是动态生成时确定的,所以它没有错
  那么就是 int(*p)[Column],这句有问题了,这句为什么不对呢, 那是因为,这是一个定义语句,而定义语句先经过编译器进行编译,当编译器运行到此处时,发现Column 不是常数,因此不能通过编译。 而之所以编译器认为Column 不是常数,是因为编译阶段,编译器起的作用是查语法错误,和预分配空间,它并不执行程序,因此,没有执行那个赋值语句(只是对这个语句检查错误,和分配空间),因此编译阶段,它将认为column 是个变量。所以上面的二维数组定义是错误的, 它不能通过编译。

改成这样:
  int size=50
  int (*p)[50]=new int [size][50]
  便正确了。

由此可见,这种动态分配数组,仅对一维数组空间是真正动态分配的。
   但是如何真正的动态分配二维数组呢,即如果Column 也不能预先知道的话,该如何处理呢?
   
   上面的动态分配已经不能满足我们的要求,因为上面动态分配只对一维数组是真正动态的,对二维数组的话,必须编译之前预先知道二维数组每一列的长度,而这个长度在很多情况下是不能预先知道的,所以我们得结合其他方法来解决这个问题。
   
   既然一维是真正的动态分配的话,那我们利用这一特性定义一个指针数组。
   
   int **p= new int*[size];//定义指针数组 
   int *p[5];//  假若知道二维数组的行数为5

然后对指针数组中的每一个指针分配一个一维数组空间,这样便动态定义了二维数组
  
   事实上,我认为指针数组的主要用途,就在于动态定义多维数组
    
    for(int i=0;i<size;i++)
   {
     p[i]=new int[Column];
   }
   
   运行完毕后,一个二维数组便被动态的成功建立

(2)delete动态建立的数组

for(int i=0;i<size;i++)
   {

delete []  p[i];   // 要在指针前加[] , 否则的话 只释放p[i]所指的第一个单元所占的空间
   }

delete [] p;     //最后不要忘掉 释放掉开辟的指针数组

2.数组下标越界

在此程序中第一次遇到了数组下标越界的问题:

数组下标越界(有左边界和右边界越界两种),解决做法:1:给数组建立多几个元素(右边界越界)2:在条件里面仔细的控制。

3.本程序的算法选择的不合理,程序看起来杂乱。对程序修改如下:

#include<iostream>
using namespace std;
int main()

int n,m,i,j;
cin>>n>>m;
char **p=new char *[n];                //数组p[n][m];
for(i=0;i<n;i++)
p[i]=new char[m];
for(i=0;i<n;i++)                
{   
  for(j=0,p[i][j]='A'+i;p[i][j]>'A'&&j<m;j++)
       {
        cout<<p[i][j];
        p[i][j+1]=p[i][j]-1;
  }
  for(p[i][j]='A';p[i][j]<'z'&&j<m;j++)
  {
  cout<<p[i][j];
  p[i][j+1]=1+p[i][j];
  }
    cout<<endl;
 
}
for( i=0;i<n;i++)
   {

delete []  p[i];   // 要在指针前加[] , 否则的话 只释放p[i]所指的第一个单元所占的空间
   }
delete [] p; 
return 0;
}

方法二:不难看出每行数据都是由都是有两部分构成的,前面部分是降序,后面部分是升序。(未使用数组)

#include<iostream>
using namespace std;
int main()
{
  int n; //输出的行数
  int m; //输出的列数
  cin>>n>>m;
  for(int i=0;i<n;i++)  /里面包含了两个内循环,程序执行内循环进去之后再判断应该选择哪一条循环。  
  {
    int j=0;
    for(char a='A'+i;a>'A'&&j<m;a--)  //第一个for循环,控制输出前面部分,字符的值在增加。
    {
      cout<<a;
      j++; 
    }
    for(char a='A';a<='Z'&&j<m;a++)   第二个for循环,控制输出后面的部分,字符的值在减少。 
    {
      cout<<a;
      j++;
    }                       ///for循环同时也担负起了判断的作用,程序简介高效。 
    cout<<endl;
  } 
  return 0;
}

....................

蓝桥杯--基础练习--BASIC-3 字母图形相关推荐

  1. 蓝桥杯基础练习 Python实现字母图形

    蓝桥杯基础练习 Python实现字母图形 问题描述 利用字母可以组成一些美丽的图形,下面给出了一个例子: ABCDEFG BABCDEF CBABCDE DCBABCD EDCBABC 这是一个5行7 ...

  2. 蓝桥杯:C语言实现字母图形

    问题描述 利用字母可以组成一些美丽的图形,下面给出了一个例子: ABCDEFG BABCDEF CBABCDE DCBABCD EDCBABC 这是一个5行7列的图形,请找出这个图形的规律,并输出一个 ...

  3. 蓝桥杯 基础练习 字母图形 JAVA

    蓝桥杯 基础练习 字母图形 JAVA 问题描述 利用字母可以组成一些美丽的图形,下面给出了一个例子: ABCDEFG BABCDEF CBABCDE DCBABCD EDCBABC 这是一个5行7列的 ...

  4. 蓝桥杯 基础练习全解 答案+解析 共17题 python

    关键字 A+B问题,数列排序,十六进制转八进制,十六进制转十进制,十进制转十六进制,特殊回文数,回文数,特殊的数字,杨辉三角形,查找整数,数列特征,字母图形,01字串,闰年判断,斐波那契数列,圆的面积 ...

  5. 蓝桥杯基础练习合集一(C语言) 1.A+B问题2.数列排序3.十六进制转八进制4.十六进制转十进制5.十进制转十六进制

    目录 1.A+B问题 2.数列排序 3.十六进制转八进制 4.十六进制转十进制 5.十进制转十六进制 1.A+B问题 问题描述 输入A.B,输出A+B. 输入格式 输入的第一行包括两个整数,由空格分隔 ...

  6. 蓝桥杯基础试题练习小结(vip)(二)

    试题 基础练习 矩形面积交 问题描述 平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴.对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积. 输入格式 输入仅包含两行, ...

  7. 蓝桥杯基础视频 笔记

    学习地址:哔哩哔哩网站--蓝桥杯基础视频         博主整理--源码下载--百度网盘链接 蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 注意:部 ...

  8. 蓝桥杯——基础练习——十六进制转十进制

    package com.study.蓝桥杯.基础练习;/* 问题描述从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出.注:十六进制数中的10~15分别用大写的英文字母A.B ...

  9. 蓝桥杯基础练习-数的读法

    蓝桥杯基础练习-数的读法 问题描述 Tom教授正在给研究生讲授一门关于基因的课程,有一件事情让他颇为头疼:一条染色体上有成千上万个碱基对,它们从0开始编号,到几百万,几千万,甚至上亿. 比如说,在对学 ...

  10. 蓝桥杯基础-【切面条】不用画图的解题思路

    我们先来看[切面条]的题目: 一根高筋拉面,中间切一刀,可以得到2根面条. 如果先对折1次,中间切一刀,可以得到3根面条. 如果连续对折2次,中间切一刀,可以得到5根面条. 那么,连续对折10次,中间 ...

最新文章

  1. 【相机标定】四个坐标系之间的变换关系
  2. 分享Silverlight/WPF/Windows Phone一周学习导读(10月30日-11月6日)
  3. 从零实现一个自定义 HTML5 播放器
  4. android listview和simpleadapter 给itme 中的控件添加事件
  5. C 文件读写 容易疏忽的一个问题
  6. 《大数据》2015年第3期“专题”——网络表示学习(上)
  7. 机器学习优化算法中梯度下降,牛顿法和拟牛顿法的优缺点详细介绍
  8. Cowboy 源码分析(二十六)
  9. 第三季-第11课-进程控制理论
  10. 软考中级数据库系统工程师备考经验分享
  11. 关于《error: 函数“int main(void)”已有主体》的错误
  12. 第20届上海大学程序设计联赛春季赛(同步赛)
  13. Excel VBA 编程的常用代码
  14. 排列组合相关公式讲解(Anm,Cnm等)
  15. VM虚拟机 .vmdk文件,拆分多个文件,合并单个文件
  16. 软件流程图及功能节点图
  17. Win7 的70个使用技巧
  18. 《安富莱嵌入式周报》第227期:2021.08.23--2021.08.29
  19. python dll注入监听_注入方式,劫持dll注入的实现
  20. win7摄像头软件_菜鸟记400旧手机当摄像头,网课直播设备不用愁

热门文章

  1. Axure无法同时打开多个.rp文件
  2. [附源码]SSM计算机毕业设计疫情环境下的酒店管理系统JAVA
  3. 云管边端架构图_边缘云平台架构与应用案例分析
  4. 18.查询好友动态和推荐动态
  5. field xinx required a bean of type x that could not be found
  6. 查找书籍(20 分)
  7. 音视频大合集最终篇;学废了
  8. 无痕刷新token-无需提供刷新token接口方式
  9. 解决java.net.UnknownHostException: XXXX: 未知的名称或服务 at java.net.Inet6AddressI
  10. Java基础算法题(07):输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。