C语言入门书籍《C程序设计》第66页例2.6如何分析实现?

2026-04-17 00:271阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计963个文字,预计阅读时间需要4分钟。

C语言入门书籍《C程序设计》第66页例2.6如何分析实现?

题目描述:输入一个大写字母,输出由该字母与空格组成的字符阵。

输入格式:一个大写字母

输出格式:对应的字符阵

示例:输入:D输出:A B B B C C C C C D D D D D

例2.6

题目描述

根据输入的大写字母,输出一个由字母与空格组成的“字符阵”。

输入格式

一个大写字母。

输出格式

对应的“字符阵”。

样例输入

D

样例输出

A B B B C C C C C D D D D D D D C C C C C B B B A

题目分析

根据样例,我们其实很容易就发现了这个“字符阵”的规律。让我们先用数学表达式来描述一下~

字母的规律:整个“字符阵”可以看作一个菱形,从上到下每行依次为从A到输入字符ch。我们不妨设从A到ch共有num个字母。那么整个菱形共有2*num-1行,在前num行,第i行共有2*num-1个字母;在后num(或者或是 num-1 )行,倒数第i行也有2*num-1个字母。

空格的规律:易得,每两个字母间都有一个空格(这是废话)。关键在于每一行前面的空格数——

通过观察样例输出的“字符阵”可以发现,对于前num行而言,第i行前的空格数可以表示为(num-i)*2;对于后num行,我们也可以采用类似的表达式计算。

下面,再通过程序表述上述规律:

AC代码

#include<iostream> #include<cstdlib> #include<cstdio> #include<iomanip> #define put_blank(n) cout<<setw(n)<<‘ ‘//输出n个空格 using namespace std; int main() { //freopen("test.out","w",stdout);//测试查看输出格式 char ch;//定义:ch为输入的大写字母 cout<<"Please input a capital letter: "<<endl; cin>>ch; if(ch<‘A‘||ch>‘Z‘)//若输入非法字符 { cout<<"The character is invalid!"<<endl; system("pause"); return 0; } int num=int(ch-‘A‘+1);//定义num为字母数 //输出菱形字母阵的前num行,宽度为递增的等差数列 for(int i=1;i<=num;i++) { put_blank((num-i)*2);//输出本行字母串前的空格 for(int j=1;j<=2*i-1;j++) cout<<char(‘A‘+i-1)<<‘ ‘;//输出字母串 cout<<endl;//结束本行输出 } //输出后num-1行,宽度为递减的等差数列 for(int k=num-1;k>=1;k--) { put_blank((num-k)*2); for(int l=1;l<=2*k-1;l++) cout<<char(‘A‘+k-1)<<‘ ‘; cout<<endl; } system("pause"); return 0; }

<关于程序>

1、关于int num=ch-‘A‘+1:这种表述其实在字符处理中比较常见,其本质还是依赖强制转换的思想。num是整型,因此ch-‘A‘实际是在对输入的字符ch与‘A‘各自的ASCII码求差,很容易发现这个差值加1就表示ch是字母表中的第几个字母。了解了这个道理,那么后面的char(‘A‘+k-1)就不难理解了,反向将int型强制转换为char型而已。

2、关于空格的输出:为了避免使用过多的循环结构使程序过于冗杂,程序将空格的输出定义在了put_blank(n)这个宏中,put_blank(n)在程序中等价于cout<<setw(n)<<‘ ‘,相信大家对setw()这个家伙不会太陌生吧?什么?忘记了???赶快去温习一下~ [关于setw()]

C语言入门书籍《C程序设计》第66页例2.6如何分析实现?

3、关于第二组for循环中的for(int k=num-1;k>=1;k--):令k从num-1向1迭代的好处就是,每一行的空格数、字母数的表达式与此前的相同,不必再花费时间计算新的表达式。

本文共计963个文字,预计阅读时间需要4分钟。

C语言入门书籍《C程序设计》第66页例2.6如何分析实现?

题目描述:输入一个大写字母,输出由该字母与空格组成的字符阵。

输入格式:一个大写字母

输出格式:对应的字符阵

示例:输入:D输出:A B B B C C C C C D D D D D

例2.6

题目描述

根据输入的大写字母,输出一个由字母与空格组成的“字符阵”。

输入格式

一个大写字母。

输出格式

对应的“字符阵”。

样例输入

D

样例输出

A B B B C C C C C D D D D D D D C C C C C B B B A

题目分析

根据样例,我们其实很容易就发现了这个“字符阵”的规律。让我们先用数学表达式来描述一下~

字母的规律:整个“字符阵”可以看作一个菱形,从上到下每行依次为从A到输入字符ch。我们不妨设从A到ch共有num个字母。那么整个菱形共有2*num-1行,在前num行,第i行共有2*num-1个字母;在后num(或者或是 num-1 )行,倒数第i行也有2*num-1个字母。

空格的规律:易得,每两个字母间都有一个空格(这是废话)。关键在于每一行前面的空格数——

通过观察样例输出的“字符阵”可以发现,对于前num行而言,第i行前的空格数可以表示为(num-i)*2;对于后num行,我们也可以采用类似的表达式计算。

下面,再通过程序表述上述规律:

AC代码

#include<iostream> #include<cstdlib> #include<cstdio> #include<iomanip> #define put_blank(n) cout<<setw(n)<<‘ ‘//输出n个空格 using namespace std; int main() { //freopen("test.out","w",stdout);//测试查看输出格式 char ch;//定义:ch为输入的大写字母 cout<<"Please input a capital letter: "<<endl; cin>>ch; if(ch<‘A‘||ch>‘Z‘)//若输入非法字符 { cout<<"The character is invalid!"<<endl; system("pause"); return 0; } int num=int(ch-‘A‘+1);//定义num为字母数 //输出菱形字母阵的前num行,宽度为递增的等差数列 for(int i=1;i<=num;i++) { put_blank((num-i)*2);//输出本行字母串前的空格 for(int j=1;j<=2*i-1;j++) cout<<char(‘A‘+i-1)<<‘ ‘;//输出字母串 cout<<endl;//结束本行输出 } //输出后num-1行,宽度为递减的等差数列 for(int k=num-1;k>=1;k--) { put_blank((num-k)*2); for(int l=1;l<=2*k-1;l++) cout<<char(‘A‘+k-1)<<‘ ‘; cout<<endl; } system("pause"); return 0; }

<关于程序>

1、关于int num=ch-‘A‘+1:这种表述其实在字符处理中比较常见,其本质还是依赖强制转换的思想。num是整型,因此ch-‘A‘实际是在对输入的字符ch与‘A‘各自的ASCII码求差,很容易发现这个差值加1就表示ch是字母表中的第几个字母。了解了这个道理,那么后面的char(‘A‘+k-1)就不难理解了,反向将int型强制转换为char型而已。

2、关于空格的输出:为了避免使用过多的循环结构使程序过于冗杂,程序将空格的输出定义在了put_blank(n)这个宏中,put_blank(n)在程序中等价于cout<<setw(n)<<‘ ‘,相信大家对setw()这个家伙不会太陌生吧?什么?忘记了???赶快去温习一下~ [关于setw()]

C语言入门书籍《C程序设计》第66页例2.6如何分析实现?

3、关于第二组for循环中的for(int k=num-1;k>=1;k--):令k从num-1向1迭代的好处就是,每一行的空格数、字母数的表达式与此前的相同,不必再花费时间计算新的表达式。