今天继续少儿编程项目总结分析,上一篇概述了少儿编程领域情况,从整体上了解该领域的范围。从这一篇开始,将详细讲述我在这个项目中接触到的知识点和对应的总结。
从知识点来分,有三大类,分别是:
1.条件判断和while循环
2.循环嵌套打印图形
3.循环穷举
这一篇文章,主要讲条件判断和while循环。
条件判断和while循环
对于我们已经参加工作的程序员来说,说出条件判断和while循环,是一件很简单的事情。基本上,在工作上不会去解释这两个概念的含义。对于儿童,特别是从来没有接触过编程的儿童来说,就需要几个课时来说明这两个概念,且这些课时还只是浅薄地介绍。这就让我想起我当初学这一段知识的时候,花了不少课时。
今天,这篇文章不是讲这两个基础知识的概念,而是针对这两个知识点的实际应用。当然这里的应用不是指我们工作上的,而是青少年编程阶段的,具体点说,就是为青少年参加大赛而准备的应用。
具体到条件判断和while循环知识点,就有两种类型的试题。
【题一】任意输入一个三位整数,再把它的次序打乱重新组合一个新的三位整数,使其值最大。
这道题比较经典,在数学中有它自己的解题方法。然而今天需要使用编程的方式来求解。这里就有一个问题:数学的方法和编程的方法有哪些不同?在此之前,我还没有想过这个问题,后来想了想,还真有差异:前者是使用未知数x,以方程式来求解;后者是重复地执行。简单来说,就是一个接一个地重复计算。例如1 到100的加法。计算机是1+2+3,这样一个接一个地累加,直到100。当然,这也是计算机的强项。
话说回来,这个题怎么解呢?一个三位数,有个位、十位、百位三位.重新组合后数值最大。
这里,首先遇到的知识点就是如何拆解个、十、百位?这个知识点,我初一看,是懵的,因为现在的我基本上忘记了怎么拆分了,毕竟时间太久远了。还好,经过复习,了解了怎么拆分。
第二个问题,就是针对三个数字,如何组合才能使其最大值?这里就使用了一个技巧了:如果这些数按从小到大排好次序,那么倒序就是最大的数值。当然,还有方法二,就是把这三个数字所有的组合罗列出来,然后在循环找到最大的数值。
方法一 代码如下:
include
using namespace std;
int main() {
int n;
cin>>n;
int a = n /100 ; //百位
int b = n / 10 % 10; //十位
int c = n % 100 % 10 ; //个位
//方法一:
//按从小到大的次序排列
// 输入n = 395
int temp = 0;
if (a > b) {
temp = a;
a = b;
b = temp;
}
//3,9,5,0
cout<<a<<” ,”<<b<<” ,”<<c<<” ,”<<temp<<endl;
if (b > c) {
temp = b;
b = c;
c = temp;
}
//3,5,9,9
cout<<a<<” ,”<<b<<” ,”<<c<<” ,”<<temp<<endl;
if (a > b) {
temp = a;
a = b;
b = temp;
}
cout<<a<<” ,”<<b<<” ,”<<c<<” ,”<<temp<<endl;
//最大值:
cout<<c 100 + b10 +a<<endl;
}
确实,这种求解最大值,在工作中没有用到.重新学习吧.
方法二就简单,使用冒泡法进行排序.具体代码如下:
include
using namespace std;
int main() {
int n;
cin>>n;
int a = n /100 ; //百位
int b = n / 10 % 10; //十位
int c = n % 100 % 10 ; //个位
//方法二,使用冒泡排序
int arr[3] ;
arr[0] = a;
arr[1] = b;
arr[2] = c;
for(int i = 0;i< 3; i++) {
for(int j = 0; j < 3 – i; j++) {
if (arr[j] < arr[j + 1]) {
int t = arr[j];
arr[j] = arr[ j +1];
arr[j + 1] = t;
}
}
}
cout<<arr[0]<<arr[1]<<arr[2]<<endl;
}
在这里的重点就是如何拆解数字中的各个位数. 上述例子中提供了一种比较简单的方式.
题一还有一种变种,【判断三个数是否相邻】.即有a,b,c三个数,判断它们是否相邻.
分析:按我们的理解数的相邻就是相隔1,即 n,n+1,n+2的关系. 初次考虑就是c-b = 1,b -a =1,c-a=2,直接这么做,就出现一个驳论:一定是a<b<c吗? 显然题目中没有说这个关系.所以上述的做法是不对的. 做法是不对的,但是也给我打开了思路:先对a,b,c做从小到大的排序.排完序后再来相减,就正确了.
【题二】韩信点兵
韩信这人,我是知道的,韩信点兵这道编程题,我还真不知道内容.
题目大致如下: 韩信有一对士兵,它想知道有多少人? 他就让士兵报数,按照1到5来报数,最末一个士兵报的数是1; 若按1到6报数,最后一名士兵报的数是5;若按1到7报数,最后一名报的数是4;最后按1到11报数,最后一名报的数是10;问韩信的这支队伍有多少士兵?
若这段文字出现在文学书中,我倒会当做文学阅读了.而今出现在编程题上.初一看,不知道讲什么,再仔细看看,讲的是某数取模.具体来说,就是:设某数为x
x % 5 = 1;
x % 6 = 5;
x % 7 = 4;
x % 11 = 10;
问这x是多少?
基本的概要是出来了.但从哪里去找或循环呢?循环方向是正确的. 但是我在选择的时候,优先考虑了for循环,并且设置了100次,结果没有得出正确答案. 最后经过修正,使用while循环是正确的,因为不用设置循环结束条件.
include
using namespace std;
int main() {
int index = 0;
while(1) {
if (index % 5 == 1 &&
index % 6 == 5 &&
index % 7 == 4 &&
index % 11 == 10) {
cout<<” 最后结果: “<<index<<endl;
break;
}
index++;
cout<<” index :”<<index<<endl;
}
}
最后的结果是2111.
从结果来看,我刚开始使用for循环,且循环100次是得不到结果的.使用语句就错了.这题比较好是使用while来实现.
这个题,相对来说简单,我主要是好奇韩信点兵这个典故.而今熟知了,且还与编程有关.确实没有想到.
总结:
单独从if…else条件判断和for循环或while循环来说,是很简单的.但是当它套入一个场景中就复杂多了.例如判断是否相邻,要先排序,而排序有不能使用冒泡或其他排序算法.在没有接触过使用if语句来排序的情况下,大概率是输不出正确结果的.所以熟悉场景也是一个比较重要的事情。
从这里,还得到一个底层规律:将一个复杂的问题分解为若干步骤来求解,每一个步骤都要验证自身是否正确,只有每一步都正确了,最终结果才正确.
这让我想到了一部电影里说的:只有火箭系统里每一个部件都验证正确,才能保证火箭整体正确,并且能上天.
声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/416071.html