C语言嵌套循环
题目一:7-3 编程打印空心字符菱形
1.提交列表
2.设计思路:
- 1.定义整型变量循环控制变量i,j,k,x,y,z,e及菱形的高度height;
- 2.定义字符型变量letter;
- 3.输入字符型变量letter和高度height;.i=2;
- 4如果i<=(number+1)/2,则当i=2时,j=1,输出空格,重复本步骤,直到j<=number/2,退出 J 循环,输出letter,换行;
- 5.k=1,如果i!=(number+1)/2,则输出空格,重复本步骤,直到k<=(number+1)/2-i,退出K循环,输出letter;
- 6.x=2*i-3,输出空格,重复本步骤,直到x>0,退出X循环,输出letter,换行;
- 7.重复步骤4.5.6.直到i>(number+1)/2;
- 8.如果i>(number+1)/2,令y=i-(number+1)/2,如果i!=number,输出空格,直到y>0,退出Y循环;
- 9.如果i!=number,输出letter;;
- 10.令z=2number-2i-1,如果i!=number,输出空格,直到z>0,退出Z循环;
- 11.如果i!=number,输出letter并换行;
- 12.如果i==number,令e=1,输出空格,直到e<=number/2,退出E循环,输出letter;
- 13.重复步骤8.9.10.11.12.,直到i<=number,退出I循环;
3.本题调试过程碰到问题及解决办法:
- 1.这题是调试时间最长的题,一开始看题时没有思路,觉得不论怎么做都很复杂,后来百度了一下,发现一行一行处理可以简化步骤,然后将空格也看成字符,这样一来才有了思路,可是做到后面发现要找到行数和字符个数的关联和规律也是难题,通过不断调试不断修正,费了不少时间才使得菱形得以成型,不过要让字母按一定顺序对称排列又是一大问题,百度后发现可以让字母加减,如letter++(letter--)来做,但是并不理解字母加减是叠加还是只在原来字母的基础上加减,直到听老师讲了之后才明白是在原字母的基础上加减;
- 2.老师说以后像这样较为复杂的题目都应该写伪代码来帮助理清思路,才不会在调试时出现这样那样的问题;
- 3.需要经过运算且在代码中反复出现的式子可将其定义成一个变量;
题目二:7-4 换硬币:
1.提交列表:
设计思路:
- 1.定义累加变量count,个数总和变量total,循环控制变量i,j,k,硬币总值n,每种硬币对应总值;
- 2.输入n,
- 3.5分钱:k=n,k--;
- 4.2分钱:j=n,j--;
- 5.1分钱:i=n,i--;
- 6.重复步骤3.4.5.,直到k>0;j>0;i>0;
-
- 令y=5k; m=1i;x=2*j;
- 8.如果m+x+y==n&&k!=0&&i!=0&&j!=0,count=count+1,total=k+i+j;
- 9.输出fen5:%d, fen2:%d, fen1:%d, total:%d\n;
- 10.输出count的值;
3.本题调试过程碰到问题及解决办法:
- 1.一开始把条件语句设置为k!=n;j!=n;i!=n,后来经过调试发现错误,改成k!=0;j!=0;i!=0;
- 2.把k--,j--,i--写成k++,j++,i++,百思不得其解,后来在同学的提醒下该过来,仔细读题后发现“要求按5分、2分和1分硬币的数量依次从大到小的顺序,输出各种换法”,顿恍然悟;
题目三:7-7 歌唱比赛评分系统:
1.提交列表:
2.设计思路:
- 1.定义整型变量最大值max,最小值mini,循环控制变量i,k,评委个数n;操作次数repeat,评分总和sum及浮点型变量score;
- 2.输入repeat;
- 3.k=1;k++;
- 4.输入n;
- 5.sum=0;
- 6.i=1;i++;
- 7.如果i==1,max=score;mini=score;
- 8.如果max<score,max=score;
- 9.如果mini>score,mini=score;
-
- sum=score+sum;
- 11.如果i==n,则输出score:%.2f\n",(sum-max-mini)*1.0/(n-2);
- 12.重复步骤3--11.直到k>repeat,i>n,退出循环;
3.本题调试过程碰到问题及解决办法:
-
1.一开始把浮点型变量score对应的格式控制字符串写成%d,答案无法出来;
-
2.把scanf("%lf",&score)放在I的for循环语句外面,使成绩只能输入一次,将其移入for循环语句就行;
-
3.继步骤2.后,max=score和mini=score也要随着改动而改动,它们一定得放置在scanf语句之后,但如果放入循环则会对后来的max和mini值产生影响,后来用了一个if语句if(i==1)将其放入循环,解决了问题;
-
4.格式错误是因为把代码从DAVC上复制过来时少复制了花括号;
二、同学代码结对互评:
1.互评同学名称
李琴
2.我的代码、互评同学代码截图
- 1.同学的代码
- 2.我的代码
3.我和同学代码不同在哪里?有哪些各自优势?你更喜欢哪种代码风格?如果同学代码有错的也请帮忙指出来哪里出问题。
- 1.同学的grade和score其实可以合并成一个数,变量尽量减少;
- 2.同学代码里的max=grade和min=max应当只在第一次循环即i=1的时候赋值,因此应当在其前加上条件语句if(i==1){};
- 3.if() else{}语句在这里不适用,应当用两个if语句如if(max<grade)和if(mini>grade),大括号里的式子不变;
- 4.第11行的sum等于0就行了;
- 5.同学做得比我好的地方是没有犯定义和格式类型不对应的错误,很多基本功也很扎实,如很好地实现了一次输入多个数值;而且加上了if(n>3&&n<10)这样的限制条件,考虑得很周到;
三、本周学习总结:
1.你学会了什么?
- 1.学会了调用函数,函数首部由函数类型,函数名,形式参数表组成,最后要加分号作为结尾;
- 2.形参的值改变后不影响实参赋值;
- 3.局部变量的return语句只能返还一个值;
- 4.做了菱形的题目后,对代码的运行逻辑和原理有了更深的了解,尤其是在和数学的结合方面,假如没有用数学方法查找规律便很难做出来;
对逻辑思维也是一大挑战,究竟怎么做才能简化问题?答案是一行一行去完成; - 5.学会了同时输入多个数值的做法,就是把scanf语句放入循环中;
- 6.调试代码更加得心应手,知道了一般应该把断点设置在scanf后面,假如循环代码在某个地方卡住,要看是否是\n在捣乱,有时换行符也起着关键作用,使用不当会让整段代码无法运行;
- 7.学会了比较最大值和最小值,基本思路是先将初值赋给max和mini,然后用if语句判断,根据每次判断结果来决定最大最小值是否更换;
- 8.学会了i++和i--的区别,当循环的执行与i的大小无关,而与其最终运行次数有关时,两个无区别,只有当与i的值有关时,才要加以区分,i++是从小到大的值,i--是从大到小值;
- 9.九九口诀表看似简单,但是要把代码写出并不容易,要用嵌套循环,且左边的值从左至右是变化的,所以是内循环,右边的则是外循环,格式控制符向左对齐用%-4表示,且内循环执行后要换行;
- 10.认识了缩进符%-4d,它表示要向左对齐,然后包括字符在内一共占用4个格子,后面多出来的用空格代替;
- 11.学会了字母的递增递减可以用letter+1(或者2,3)和letter-1(或2,3);
2.本周的内容,你还不会什么?
- 1.实参与形参如何占用空间;
- 2.为什么有的代码被调用的函数中有那么多return,有时不知道要到底要return哪一个;
- 3.有时不懂得如何取合适的变量名;