C语言第三次博客作业---单层循环结构

一、PTA实验作业

题目1

(1).实验代码

	int n;
	double height1,height2;
	char sex,c;
	scanf("%d",&n); 
	while (n>0){                             //当n大于0时循环
	    scanf("%c%c%lf",&c,&sex,&height1);            //c用来获取输入n之后的回车键
		switch (sex){  //判断输入的sex是f还是m
			case 'F':height2=height1*1.09;n--;   //若是f,执行计算,n-1,跳出判断
			break;
			default :height2=height1/1.09;n--;    //若不是,执行另一计算,n-1,跳出判断
			break;
		}
		printf("%.2f\n",height2);//输出计算结果
	}

(2)设计思路

  • 定义循环变量n;实数变量height1,height2,分别存放用户输入的身高,以及要输出的数值;字符型变量sex,c,sex存放输入的字母,c存放“\n”
  • 输入n
  • 当n大于0,执行循环
  • 若sex==F,计算height2=height1*1.09,并n--,然后跳出
  • 若sex!=F,计算height2=height1/1.09,并n--,然后跳出
  • 输出height2,然后换行,循环体语句到此结束

(3)调试问题及解决方法

  • 第一次写时没有考虑到回车符对程序中sex的影响,导致出现了从再到的情况

  • 第一个想出的解决方案是将scanf("%c%lf",&sex,&height1);一句放在while的前面和while中的最后(因为当时我的Devc++还不能调试),输出的结果是

  • 所以后来去网上查找、和同学交流,又想了另一个方案,即把getchar();放在scanf("%d",&n);while(n>0){之间,然后就得到了结果,发现得到了一样的结果,后来调试,是在第二次输入的时候sex的值为“\n”了

  • 后来发现将getchar();放在while(n>0){后边就可以使回车符不记入sex里

  • 后来想到是不是能把“\n”用一个变量存放起来,以防止对sex产生影响,就有了上面这个代码的样子,最后用while语句替代了for语句

(4)本题PTA提交列表

题目2

(1).实验代码

	int i;    //循环变量 
	double a,b,n,sum;              //a,输入的数字;b,存放输入的数字;n,存放输入的n;sum,所有数之和
	sum=0;                     //对sum进行初始化
	scanf("%lf%lf",&a,&n);       //输入a,n
	b=a;                //赋值b,让b初始值为a
	for (i=1;i<=n;i++){                 //建立循环,当i<=n时
		sum=sum+a;          //先把a存到sum里
		a=a+b*pow(10,i);         //计算下一个要存放的数字
	}
	printf("s = %.0f",sum);         //以无小数点的形式输出sum

(2)设计思路

  • 定义循环变量i;实数变量a,b,n,sum,分别存放输入的数字及循环中单次计算的结果(a),输入的数字(b),循环次数(n),数值总和(sum)
  • sum=0
  • 输入a,n
  • b=a
  • 当i<=n时,进入循环
  • sum=sum+a
  • a=a+b*pow(10,i)
  • 循环结束后输出sum

(3)调试问题及解决方法

  • 这题遇到的问题是没有看懂题目要求,题目要求求的是a+aa+aaa+···的和,我看成求a+a2+a3+···的和,后来在重新审题后解决

(4)本题PTA提交列表

题目3

(1).实验代码

	int i,n,min,num;         //循环变量i,限制循环的次数的条件n,最小值min
	scanf("%d",&n);          //输入数据的个数
	scanf("%d",&num);         //先输入一个数作为min的值
	min=num;                           
	for (i=1;i<n;i++){              //当i<n时循环
		scanf("%d",&num);         //再读入一个数
		if (min<=num){         //若先前的min小于等于之后读入的num,则不变
		  min=min;}
		if (min>num){          //若先前的min大于之后读入的num,将num的值赋给min
		  min=num;}
	}
	printf("min = %d",min);        //输出这些数中的最小值

(2)设计思路

  • 定义循环变量i;整数变量n,min,num,n是数值的个数,min是数值中的最小值,num是单个数值
  • 输入n
  • 输入数据
  • 将第一个数值赋给min
  • 当i<n时循环,
  • 读入第二个数值,记为num
  • 若min<=num,则不用变换;若min>num,则把num的值赋给min
  • 循环结束。
  • 输出min

(3)调试问题及解决方法

  • 第一次做的时候,给了min一个初值(如min=0),然后在Devc++上测试一些数值时是成功的,但是并没有考虑到若输入的数据没有0的情况,于是就不正确了
  • 于是后来修改的时候尝试着把scanf("%d",&num);放在循环之前,并将这个数值赋给min,然后在循环里也加一条scanf("%d",&num);,让num记入第二个数值,运行程序之后发现可行,在pta上通过

(4)本题PTA提交列表

题目4

(1).实验代码

	int mynumber,yournumber,n,i=1;           //定义并赋值循环变量i为1,被猜数mynumber,能够猜的次数n,接下来输入的数yournumber
	scanf("%d%d",&mynumber,&n);            //先输入被猜数以及能够猜的次数
	while(i<=n){                                       //当i<=n时循环
		scanf("%d",&yournumber);                //输入yournumber
		if(yournumber==mynumber&&i==1){           //若yournumber等于mynumber且i为1,则输出Bingo!(一次猜对),并跳出循环
			printf("Bingo!\n");
			break;
		}
		else if(yournumber<0){                     //若yournumber<0,则输出Game Over,并跳出循环
			printf("Game Over\n");
			break;
		}
		else if(yournumber>mynumber){             //若yournumber大于mynumber,则输出Too big
			printf("Too big\n");
		}
		else if(yournumber<mynumber){               //若yournumber小于mynumber,则输出Too small
			printf("Too small\n");
		}
		else if(yournumber==mynumber&&i>1&&i<=3){            //若yournumber等于mynumber且i大于1小于等于3,则输出Lucky You!(三次内猜对),并跳出循环
			printf("Lucky You!\n");
			break;
		}
		else if(yournumber==mynumber&&i>3&&i<=n){               //若yournumber等于mynumber且i大于3小于等于n,则输出Good Guess!(n次内猜对),并跳出循环
			printf("Good Guess!\n");
			break;
		}
		i++;                                                             //除跳出循环的语句外,都执行i++
	}
	if(yournumber>=0&&yournumber!=mynumber)                //当循环结束时,若yournumber大于等于0且yournumber不等于mynumber,则输出Game Over
	   printf("Game Over\n");

(2)设计思路

  • 定义并赋值循环变量i为1;再定义整数变量被猜数mynumber,能够猜的次数n,接下来输入的数yournumber
  • 输入mynumber以及n
  • 当i<=n时循环
  • 输入yournumber
  • 若yournumber等于mynumber且i为1,则输出Bingo!(一次猜对),并跳出循环
  • 若yournumber<0,则输出Game Over,并跳出循环
  • 若yournumber大于mynumber,则输出Too big
  • 若yournumber小于mynumber,则输出Too small
  • 若yournumber等于mynumber且i大于1小于等于3,则输出Lucky You!(三次内猜对),并跳出循环
  • 若yournumber等于mynumber且i大于3小于等于n,则输出Good Guess!(n次内猜对),并跳出循环
  • i++
  • 循环结束。
  • 若yournumber大于等于0且yournumber不等于mynumber,则输出Game Over

(3)调试问题及解决方法

  • 第一次写是根据书本上的猜数字程序自己写的,因此没有写具体的思路,出错在,发现是,导致条件成立,同时输出了

  • 第二次把算法写了,再重新写程序。把flag变量删了,用了for语句,把yournumber和mynumber的判断以及循环次数的判断合到一起。出错的地方在于对循环的次数判断出错,多循环了一次

  • 最后一次出错是由于判断语句的先后问题,在写的时候把写在了前面,导致输入负数后会输出Too small而不是Game Over
    如图。调试中也发现了,,在输入负数后程序接着往下走,i从2加到3;于是就改正通过了。

(4)本题PTA提交列表

二、截图本周题目集的PTA提交列表及最后排名。

PTA排名

三、本周学习总结

1.你学会了什么?

  • 学到了一些将分支语句用在循环语句里的小技巧和小要点,如在判断数值时要优先判断某些数值是否成立,如可优先判断是否小于0等等题目特殊要求的边界等
  • 还学了如何用更简单的判断在一组数值中选出最小值和最大值
  • for语句的三个表达式的基本应用,深切体会了不同情况下三个循环语句的选择的重要性
  • 相当简单的嵌套循环的应用

2.本周的内容,你还不会什么?

  • 嵌套循环的循环条件的判断,如外循环变量和内循环变量的范围界定,以及内外循环所应该写的语句的选择,就是对嵌套循环不是很了解
  • 变量数量的选择,有的时候多一个变量可以节省一些步骤,但有时多变量又会影响到程序的纠错,以及对程序的解读难度
  • 如何简洁的用循环语句和分支语句去写程序,就是对问题的思路不是很清楚,以至于有时用较多的语句去解决一个别人用几个语句就解决的问题
posted @ 2017-11-02 20:07  那就这个名字  阅读(308)  评论(4编辑  收藏  举报