171025—例题分析 & 思维拓展

一.
今日习题课。所谓习题,无非是出一些在实际操作中几乎用不到的东西来考察你对基础知识的掌握程度。
比如:
I think that that that that that boy writes is right
语法上玩得绝妙,但有脑子的人都不会这么说话。
读代码也是种必备的能力哇,所以…
看题:

inti,j;
for(i=0,j=5;i=j;)    //坑一  //疑一
{ cout<<i<<j<<endl;
i++;
j--;
}

//坑一:注意for的括号里三个语句只写了两个。第一个是逗号不是分号!!刚看的时候就搞错了。

//疑一:循环条件语句“i=j”怎么理解?刚开始的时候还是没能走出惯式思维,仅仅认为是“当i等于j”,还是忘记了Cpp里==才是等于的意思。这里仍旧只是赋值语句。表示的含义是,把j的值给i,读取i的逻辑值。即:i(=j),五次循环之后,j为0,在()中j把值给了i,i为0,即在逻辑上为假,循环结束。
这种其实从教材之前新课部分的描述上就有提及。无非是把条件语句先做计算,再做逻辑判断。
类似的还有题:

int i=5,sum=0;
while(i--)
{sum+=i%2;}

记住就好,灵活一点。

二.课上老师作了两个题的示范。他在很短的时间里理出了正确而简洁的思路。写出了代码。略吃惊。

  • 问题一:倒序输出任意一个用户输入的正整数的各位数字。
    拿到这个问题,你又会犯昨天那个错误,满脑子瞎胡寻思,怎么办?怎么把各位数字读出来?还倒着输出来?
    而老师想得就很“简洁”,我就取除以10的余数就好嘛。定义成整型,每次除以10,余数不就是我要的东西吗?
    第一次即得个位,小十倍之后再取,即得十位。。
#include<iostream>
using namespace std;
int main()
{
    int n,m;
    cin>>n;
    while(n>0)
    {
        m=n%10;
        cout<<m<<'\t';
        n=n/10;
    }
}

问题二:编写程序,当用户输入n的值时,输出一个边长为n的、以“*”为边框的空心正方形。
呃,上面那个好歹是个数吧?看起来还像个自己能写的“程序”,这tm是个啥???输个正方形出来??还空心??秒无脑。。

老师:这有什么啊,这个拿for语句就能做啊。两个for语句嘛。 这次就彻底懵圈了。。啥?啥啥???
其实结合老师写的那个结构(按照目前理解,大结构也就只有那样一种可能,当然,可能只有一种。。)想想,你犯得还是老毛病。你要知道,输出的时候并非是像位图一样输出(随便偷来的概念),它不会是你给它一个数,它按一个一个坐标去判断该输出什么。它只会做一些简单的事情,它的输出只会一行一行地进行。而你对它的了解目前也很简单,就不要把双方都考虑的那么复杂好吧?

其实看过老师的代码之后可以很自然地理解:为什么要两个for语句?
我们知道,它会一行一行地输出。
我们需要计算机判断哪里该输出“*”,哪里该空着(输出“ ”),而一切问题都只能转化为数学问题。你需要引入一个合理的量来帮助判断。
第二点,要输出的是个正方形,二维图形,每个位置都需要两个量来帮助确定,说人话就是:我跑到一行里了,这一行哪里要*哪里要空格?下一行呢?
很合理啊,二维不过是在某个一维数变化的每个状态下,再自我衍生。
这样的话就定下了大方向,而具体输出的内容,我们可以用if….else来搞定。
原码:

#include<iostream>
using namespace std;
int main()
{
    int n,x,y;
    cout<<"input n="<<endl;
    cin>>n;
    for(x=1;x<=n;x++)//系统按行输出,所以先有行再有列。。 
    {
        for(y=1;y<=n;y++)
        {
            if( x==1||x==n )
             {
                cout<<"* ";
                if( y==n ) cout<<endl;//用来换行的
             }
             if( x!=1&&x!=n )
             {
                if(y==1||y==n)
                {cout<<"* ";}
                else{ cout<<"  "; }
                if ( y==n ) cout<<endl;//用来换行的
             }
        }
    }
}

最初尝试的时候,用来换行的语句考虑不要在if语句里加if了吧。于是用了while。
写成

while( y==n ) cout<<endl;

运行出来的结果是,无穷无尽的空行,一直换一直换。
细考虑,这是个死循环。 y==n 一直成立,进去就出不来了。阿弥陀佛。。

P.S. 记住,计算机会做的事情很简单而纯粹,你的思维也该以此为导向,还是前天所说的。你不能带着你惯有的人类的杂乱的思维方式尝试设计一个解决问题的程序。可以复杂,但必须简洁。
“至繁归于至简”。
Simplicity is the ultimate sophistication.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值