一.PTA实验作业
题目1: 最佳情侣身高
1.本题代码
#include<stdio.h>
int main ()
{
int N;
double you;
char sex;//字符型变量
scanf("%d",&N);
while(N-->0){
getchar();//从标准输入里读取下一个字符//
scanf("%c %lf",&sex,&you);
if(sex =='F'){
printf("%.2lf\n",you*1.09);
}
else if(sex =='M'){
printf("%.2lf\n",you/1.09);
}
} return 0;
}
2.设计思路
- 第一步:定义一个整型变量N,一个浮点型变量you用于存放身高,一个字符型变量sex
- 第二步:输入N的值
- 第三步:getchar(用)从标准输入里读取下一个字符
- 第四步:输入sex与you的量
- 第五步:若sex=M,则输出you/1.09,保留两位小数
- 第六步:若sex=F,则:输出you*1.09,保留两位小数
- 第八步:重复第四步,直到N=0
3.本题调试过程中碰到的问题以及解决方案
(1)
- 错误:由N值的变化,发现循环次数少了一次,导致第二次输入没有输出
- 解决方案:在循环前使N=N+1;
(2)后来发现结果部分错误:
- 错误:判断失误,使得,循环进行了三次,包括一次对回车键的判断
- 解决方案:是用getchar()语句,使得可以从标准输入里读取下一个字符。
4.本题PTA实验结果展示
题目2: 特殊a串数列求和
1.本题代码
#include<stdio.h>
#include<math.h>
int main ()
{
int a,n,big,item,sum,b,c,i;
scanf("%d %d",&a,&n);
i=n;//方便后一次while循环
while(i>=0){
item=a*pow(10,i-1);
big=big+item; //得到最高位数;
i--;
}
b=big;
sum=big;
while(n>0){
c=pow(10,n-1);
b=b % c; //取余
sum=sum+b;
n=n-1;
}
printf("s = %d",sum);
return 0;
}
2.设计思路
- 第一步:定义五个整型变量a,n,big用于存放最高位数,item用于储存第一次循环量,sum用于储存和,b用于储存第二次循环量,c用于储存函数pow(10,n-1),i用于控制第一次循环次数。
- 第二步:输入a,n的值
- 第三步:item=a*pow(10,i-1)
- 第四步:big=big+item
- 第五步:i--
- 第四步:重复步骤3,直到i大于0
- 第五步:b=big,sum=big
- 第六步:c=pow(10,n-1)
- 第七步:b=b % c
- 第八步:sum=sum+b
- 第九步:n=n-1
- 第十步:重复步骤六,直到n=0
- 第十一步:输出sum
3.本题调试过程中碰到的问题以及解决方案
(1)
- 错误:没有注意到n在上一次循环中已经进行了运算,发生了变化。
- 解决方案:在循环开始前将n的值赋给i,将i作为第一次循环的变量
(2)
- 错误:对pow函数求余:求余运算只能针对整形数,pow函数返回值应该是double型
- 解决方案:添加一个变量c,将pow函数返回值赋给c,用c进行接下来的运算
4.本题PTA实验结果展示
题目3: 找出最小值
1.本题代码
#include<stdio.h>
int main()
{
int n,m,min;
scanf("%d %d",&n,&m);
min=m;//将min赋值为m,以便进行后面的比较
while(n-->0){
scanf("%d",&m);
if(m<min){
min=m;
}
}printf("min = %d",min);
return 0;
}
2.设计思路
- 第一步:定义三个整型变量n,m用于存放输入的整数,min用于存放最小值
- 第二步:输入n,m的值
- 第三步:min=m
- 第四步:输入另一个m的值
- 第五步:若min>m,min=m
- 第六步:重复步骤四,直到n=0
- 第七步:输出min的值
3.本题调试过程中碰到的问题以及解决方案
- 错误:将输出语句放在while语句内,导致最小值输出了多次
- 解决方案:将输出语句放在return 0 前面
4.本题PTA实验结果展示
题目4: 猜数字游戏
1.本题代码
#include<stdio.h>
int main()
{
int N,A,B,time=0,i;
scanf("%d %d\n",&A,&N);
i=N;
while(i-->0){
time++;
scanf("%d",&B);
if(B<0){ /*若输入负数直接结束*/
printf("Game Over");
break;
}
else{
if(A!=B){
if(B>A){
printf("Too big\n");
}
else if(B<A){
printf("Too small\n");
}
}
else if(A=B){
if(time==1){
printf("Bingo!");
break;
}
else if(time==2||time==3){
printf("Lucky You!");
break;
}
else if(time>3&&time<=N){
printf("Good Guess!");
break;
}
else if(time>=N){
printf("Game Over");
break;
}
}
}
if(time>=N){
printf("Game Over");
break;
}
}return 0;
}
2.设计思路
- 第一步:定义N用于储存猜的次数,A用于储存随机给出的数,B用于储存猜的数,time用于储存猜对用的次数,i为循环变量
- 第二步:输入A,N
- 第三步:i=N
- 第四步:time++
- 第五步:输入B
- 第六步:如果B<0则停止运行,输出Game Over
- 第七步:如果A<B,则输出Too big
- 第八步:如果B<A,则输出Too small
- 第九步:如果A=B,则进入新的判断
- 第十步:如果time=1则输出Bingo
- 第十一步:如果time=2或time=3,则输出Lucky You
- 第十二步:如果3<time=<N,则输出Good Guess
- 第十三步:重复步骤五直到i=0
- 第十四步:如果time>=N,则输出Game Over
3.本题调试过程中碰到的问题以及解决方案
(1)部分错误
- 将&&与||的作用搞混
(2)部分错误
- 错误:没有读清题目中的边界问题
- 解决方案:多次尝试
4.本题PTA实验结果展示
二.截图本周题目集的PTA提交列表及最后排名
三,本周的学习总结
1.你学会了什么?
(1)用flag=-flag语句改变符号
(2)while语句:,
while(表达式)
循环体语句;
-
当表达式的值为真时,循环执行,直到表达式的值为假,循环终止并继续执行while的下一条语句
-
while语句只有一个表达式和一条循环体语句分别对应循环的两个核心要素循环条件和循环体
-
在循环前先判断条件只有条件为真时才进入循环
-
循环的时限一般包括四个部分即(初始化,条件控制,重复的操作,以及通过改变循环变量的值)最终改变条件的真假性,使循环能够正常结束。
这四个部分可以直接和for语句中的四个成分(表达式1,表达式2,循环体语句和表达式3)
使用while语句时,由于它只有2个成分(表达式和循环体语句),就需要另加初始化部分
至于第四个部分,while语句的循环体语句可包含for语句的(循环体语句和表达式3)
所以while语句的循环体语句中必须包含能够最终改变循环条件真假性的操作
(3)赋值初始化,初始化就是在循环前面对一些变量赋初值(注意初始化语句放置的位置)
(4)把for 语句改写为while语句:
表达式1;
while(表达式2){
for的循环体语句;
表达式3;
}
for循环和while语句都能实现循环
一般情况下如果题目中指定了循环次数,使用for语句更清晰,循环的四个组成部分一目了然,其他情况下多使用while语句
(5)do-while 语句
for语句和while 语句都是在循环前先判断条件,而do-while语句先执行循环体,后判断执行条件(所以无论循环条件的值如何,至少会执行一次循环体)
其一般形式为:
do{
循环体语句
}while(表达式);
(6)break语句:
当循环结构中出现多个循环条件时,可以由循环语句中的表达式和break语句共同控制。(break语句强制循环结束)
(7)continue语句
continue语句的作用是跳过循环体中continue后面的语句,继续下一次循环,一般与if语句配合使用
(8)break语句与continue语句的区别:
break语句结束循环,而continue语句只是跳过后面语句继续循环。break语句除了可以终止循环外,还用于switch语句,而continue只能用于循环。
(9)自定义函数
课本78页(阶乘运算)
(10)嵌套循环:
在大循环中再使用一个小循环:即大循环中嵌套了小循环
课本80(在计算阶乘的和时使用了嵌套循环)
部分代码如下:
for(i=1;i<=100;i++){
item=1;
for(j=1;j<=i;j++)
item=item*j;
sum=sum+item;
}
注意两个循环之间的缩进;(注意不要混淆外层循环与内层循环的初始化)
外循环一次,内循环一轮。
(11).i--与--i
i--先循环一次再把i减小,如果是--i就是先减小i再循环
(12).getchar
C语言中的函数,从stdio流中读字符,相当于getc(stdin),它从标准输入里读取下一个字符
(13)小总结:
一般说来如果事先给定的循环次数首选for语句,他看起来最清晰,循环的四个组成部分一目了然。
如果循环次数不明确需要通过其他条件控制循环通常选用while语句和do while语句。
如果必须先进入循环循环体运算,得到循环控制条件后再判断是否进行下一次循环使用do-while语句最合适。
2.本周的内容你还不会什么?
(1)逻辑思路问题:对一道题目的思考总是从最复杂的地方开始,或者是找不到切入点,导致无从下手。
(2)对于边界的范围有时候还是搞不清楚
(3)对程序出现的错误的判断及自我解决
(4)对switch语法的使用还不大熟练,总是会将回车键和空格也是字符这个细节忘记
3.你碰到什么困难,打算如何解决?
(1)
- 困难:对逻辑性较强的题目,不知道从何入手
- 解决方案:多做题目,培养自己的逻辑思维能力
(2)
- 困难:对问题的思考总是从最复杂的地方开始,导致代码很长很复杂
- 解决方案:在思考题目时学会换个方向思考,当发现自己的思路太过复杂时试着从另一方面开始
(3)
- 困难:对问题的判断能力有限,有时会对程序出现的问题作出错误的判断导致错误的解决方案,最后导致程序更加错误
- 解决方案:多做题目,就会多遇到问题,然后向同学或是助教或是老师提问,增加相关方面的知识,做好笔记。