新手求助,关于嵌套循环的一段代码!

猫鸠 2018-05-03 03:32:50
题目需要用户输入大写字母,然后以金字塔型的格式打印字母,像这样

A
ABA
ABCBA
ABCDCBA
ABCDEDCBA

以下是答案的代码。


#include <stdio.h>

void p6_5(void)
{
char ch = 0;
printf("Please input an uppercase letter:");
scanf_s("%c", &ch);
getchar();

int length = ch - 'A' + 1;
for (size_t i = 0; i < length; i++)
{
char temp = 'A' - 1; //为什么要 写这句?
for (size_t j = 0; j < (4 - i); j++) //这里为什么用 4-i ?
{
printf(" ");
}
for (size_t j = 0; j <= i; j++)
{
printf("%c", ++temp);
}
for (size_t j = 0; j < i; j++) //金字塔的降序打印部分不理解
{
printf("%c", --temp);
}

printf("\n");
}
return;
}


不理解的部分我已经在代码中标注了, 希望各位大佬能帮助我,我只有50积分,全投注进去了。
...全文
868 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-05-07
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
猫鸠 2018-05-05
  • 打赏
  • 举报
回复
引用 6 楼 phenix2009 的回复:
不知道这么写你能不能看懂:

void p6_5(void)
{
	char ch = 0;
	printf("Please input an uppercase letter:");
	scanf_s("%c", &ch);
	getchar();

	int length = ch - 'A' + 1;
	for (size_t i = 0; i < length; i++)
	{
		char temp = 'A' - 1; //写这句是赋初值
		for (size_t j = 0; j < (4 - i); j++) //4表示金字塔的宽度为2*4 + 1,写4只能支持到E,也就是与A相差4,改成26可以支持全部字母
		{
			printf(" ");
		}
		for (size_t j = 0; j <= i; j++)//升序,打印金字塔左侧包含中间的字母  //仔细看升序与降序的坐标是不同的,i值表示当前层数序号
		{
			printf("%c", ++temp);//从A开始增加
		}
		for (size_t j = 0; j < i; j++) //降序,打印金字塔右侧不包含中间的字母
		{
			printf("%c", --temp);//从中间值减少到A
		}

		printf("\n");
	}
	return;
}
谢谢!!
猫鸠 2018-05-05
  • 打赏
  • 举报
回复
引用 8 楼 zhao4zhong1 的回复:
仅供参考:
//    A
//   ABA
//  ABCBA
// ABCDCBA
//ABCDEDCBA
#include <stdio.h>
#include <conio.h>
int n,h,s,i;
int main() {
    while (1) {
        printf("Please input a character(A-Z):");
        fflush(stdout);
        rewind(stdin);
        scanf("%c",&n);
        if ('A'<=n && n<='Z') {
            for (h=0;h<n-'A'+1;h++) {
                for (s=n-'A'-h;s>0    ;s--) printf(" "   );
                for (i='A'    ;i<'A'+h;i++) printf("%c",i);
                for (i='A'+h  ;i>='A' ;i--) printf("%c",i);
                                            printf("\n"  );
            }
            getch();
            break;
        }
    }
    return 0;
}
谢谢!!
猫鸠 2018-05-05
  • 打赏
  • 举报
回复
引用 2 楼 paschen 的回复:
如果还是理解不了,建议设置断点后单步跟踪程序运行,观察每一步变量变化结果
理解了,跟踪程序运行的方法很有效!谢谢!
赵4老师 2018-05-04
  • 打赏
  • 举报
回复
仅供参考:
//    A
//   ABA
//  ABCBA
// ABCDCBA
//ABCDEDCBA
#include <stdio.h>
#include <conio.h>
int n,h,s,i;
int main() {
    while (1) {
        printf("Please input a character(A-Z):");
        fflush(stdout);
        rewind(stdin);
        scanf("%c",&n);
        if ('A'<=n && n<='Z') {
            for (h=0;h<n-'A'+1;h++) {
                for (s=n-'A'-h;s>0    ;s--) printf(" "   );
                for (i='A'    ;i<'A'+h;i++) printf("%c",i);
                for (i='A'+h  ;i>='A' ;i--) printf("%c",i);
                                            printf("\n"  );
            }
            getch();
            break;
        }
    }
    return 0;
}
白色一大坨 2018-05-03
  • 打赏
  • 举报
回复
不知道这么写你能不能看懂:

void p6_5(void)
{
	char ch = 0;
	printf("Please input an uppercase letter:");
	scanf_s("%c", &ch);
	getchar();

	int length = ch - 'A' + 1;
	for (size_t i = 0; i < length; i++)
	{
		char temp = 'A' - 1; //写这句是赋初值
		for (size_t j = 0; j < (4 - i); j++) //4表示金字塔的宽度为2*4 + 1,写4只能支持到E,也就是与A相差4,改成26可以支持全部字母
		{
			printf(" ");
		}
		for (size_t j = 0; j <= i; j++)//升序,打印金字塔左侧包含中间的字母  //仔细看升序与降序的坐标是不同的,i值表示当前层数序号
		{
			printf("%c", ++temp);//从A开始增加
		}
		for (size_t j = 0; j < i; j++) //降序,打印金字塔右侧不包含中间的字母
		{
			printf("%c", --temp);//从中间值减少到A
		}

		printf("\n");
	}
	return;
}
qq_40162781 2018-05-03
  • 打赏
  • 举报
回复
因为后面用的是++temp先加后输出,所以'A'-1+1还是A
qq_40162781 2018-05-03
  • 打赏
  • 举报
回复
第二个问题,i是控制行的 第一行i是0,4-0就是4输出四个空格 第二行i是1,4-1是3输出三个空格
自信男孩 2018-05-03
  • 打赏
  • 举报
回复
建议在草稿纸上画一画流程,需要理解的是每次循环输出的是一行内容,只能一行一行的输出,并不能按列输出。
paschen 2018-05-03
  • 打赏
  • 举报
回复
如果还是理解不了,建议设置断点后单步跟踪程序运行,观察每一步变量变化结果
paschen 2018-05-03
  • 打赏
  • 举报
回复
1、初始为'比'A'小1的值,因为后面输出前会先递加1,这亲第一次输出贩是A,第二次是B... 2、因为前面最多输出4个空格(i为0时),随着i递增,需要的空格递减 3、降序部分也是一个循环,同升序,但此时temp递减

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧