C语言--单层循环结构

一、PTA实验作业

题目1:最佳情侣身高

1.实验代码

	int      N, i;
	float    height;
	char        sex;
	printf("输入用户个数:\n");
	scanf("%d", &N);
	
	if(N>10||N<=0) 
	{
		printf("输入错误!\n");
	}
	else 
	{
	for(i=1; i<=N; i++)
	{
		scanf("\n%c%f",&sex,&height);
		switch(sex)
		{
			case 'F':printf("%.2f\n", height*1.09);break;
			case 'M':printf("%.2f\n", height/1.09);break;
			default: printf("输入错误!\n");break;
		}
	}
	
	}
   

2.设计思路

  • 1、定义2个整型变量N和i,一个浮点型变量height,一个字符型变量sex,N表示前来查询用户数、i计数、height身高、sex性别;
  • 2、输入N,初始化i=1;
  • 3、若N>10或N<=0,提示"输入错误!"并结束程序,否则继续下一步骤;
  • 4、i++;
  • 5、输入sex、height;
  • 6、若sex=‘F’,printf("%.2f\n", height*1.09),结束程序;若sex= 'M',printf("%.2f\n", height/1.09),结束程序;否则提示"输入错误!",结束程序;
  • 7、若 i<=N,返回步骤4,否则结束程序

3.本题调试过程碰到问题及解决办法

  • 问题1:结果错误

解决方法:调试程序,请教同学。开始不理解为什么会出现这样的错误,后来请教舍友,舍友提出可能是因为scanf()函数把结束语句的回车当成字符处理了。猜测中我们使用百度百科,发现确实会有这种可能,然后按照百度的方法,在程序中加入fflush(stdin)函数后,发现第一个输出结果仍有问题,但后面的输出全部正确了。调试发现第一次循环时sex的值仍是‘\n’,大家都不知道为什么会这样了。后来我凭着程序员的直觉(因为之前老师说过直接在scanf语句中写上符号的话,在运行输入时也要输进符号,如果是后面的scanf语句把前一个结束语句的回车当成字符处理了的话,那我先在scanf里面给它一个‘\n’,结果会不会不一样)😁我尝试性地删除了fflush(stdin)函数并且在scanf()语句中加入了‘\n’,意外发现程序正确了!!提交到PTA上也正确!关于这题我还不是很清楚,在百度上看得也不是很明白,也不知道我自己的猜想对不对,如果有大佬能帮我解答一下,那么小辈感激不尽~

后记:今天下午去上课,老师说错误的原因就是上一个scanf语句的回车被下一个scanf语句接收了,要解决这个问题,可以在下一个scanf语句前加一个getchar()函数,把回车吸收掉

  • 调试过程:
    发现语句在switch结构中没有正确地跳转

sex的值不是‘F’,而变成了'\n'

加入fflush(stdin)函数后,发现第一个输出结果仍有问题,但后面的输出全部正确

加入fflush(stdin)函数后,进行第一次循环时,sex的值仍是‘\n’

删除了fflush(stdin)函数并且在scanf()语句中加入了‘\n’,意外发现程序正确了

4.本题PTA提交列表

题目2:特殊a串数列求和

1.实验代码

    int  a, n, sum, i, j, f;
    scanf("%d%d",&a, &n);
    if(a<=0||a>9||n<=0||n>9)
    {
        printf("Error!\n");
    }
    else
	{
		sum=0;
        f=0;
        j=0;
        for(i=1; i<=n; i++)
        {
        	while(j<i)
            {
            	f=f+a*pow(10,j);
				j++;    
            }
            sum=sum+f;
        }
        printf("s = %d", sum);
    }

2.设计思路

  • 1、定义4个整型变量a, n项数, sum和, i循环计数, j循环计数, f每一项的值;
  • 2、输入a,n;
  • 3、若a<=0或a>9或n<=0或n>9,提示"Error!"并结束程序,否则继续下一步骤;
  • 4、初始化sum=0,f=0,j=0,i=1;
  • 5、i++;
  • 6、当j<i,f=f+a*pow(10,j),j++;
  • 7、sum=sum+f;
  • 8、若 i<=n,返回步骤5;
  • 9、printf("s = %d", sum)

3.本题调试过程碰到问题及解决办法

本题没有碰到问题

4.本题PTA提交列表

题目3:找出最小值

1.实验代码

    int  n, integer, i, min, flag;
	scanf("%d", &n);
	scanf("%d", &integer);
	min=integer;
	for(i=1; i<=n; i++)
	{
		flag=integer;
		if(flag<=min)
		{
			min=flag;
		}
		scanf("%d", &integer);
	}
	printf("min = %d", min);
    

2.设计思路

  • 1、定义5个整型变量 n输入数的个数, integer输入的整数, i计数, min最小值, flag中间替换值;
  • 2、输入n;
  • 3、输入integer;
  • 4、min=integer;
  • 5、初始化i=1;
  • 6、i++;
  • 7、flag=integer;
  • 8、若flag<=min,min=flag,否则直接执行下一步骤;
  • 9、输入integer;
  • 10、若 i<=n,返回步骤6,否则输出min

3.本题调试过程碰到问题及解决办法

  • 问题1:开始时候的有问题代码如下图

这个代码运行出来在n=1,integer>1的时候结果是不对的,经过调试(简单调试就不附图了)后我发现会不对是因为我开始的时候没有给min赋值,因此min一开始就会被系统随机赋值为1,若integer>1,则无论输入的integer是什么,输出的min结果都只会是1,找到问题后,我修改了程序,几经尝试,结果终于正确

解决方法:调试,阅读一遍程序,按照计算机的处理方式演算一遍过程

4.本题PTA提交列表

题目4:猜数字游戏

1.实验代码

    int  RandomNumber, N, integer, i=0;   //RandomNumber随机数, N最大猜测次数, integer所猜数, i计数 
	scanf("%d%d", &RandomNumber, &N);
	scanf("%d", &integer);
	if(integer<0)
	{
		printf("Game Over\n");
	}
	else
	{
        while(integer>=0)
        {
    	    i++;
    	    if(i>N)
		    {
			    printf("Game Over\n");
			    break;
		    }
    	    else if(integer>RandomNumber)
    	    {
    		    printf("Too big\n");
		    }
		    else if(integer<RandomNumber)
		    {
			    printf("Too small\n");
		    }
		    else if(integer=RandomNumber&&i==1)
		    {
			    printf("Bingo!\n");
			    break;
		    }
		    else if(integer=RandomNumber&&i>1&&i<=3)
		    {
			    printf("Lucky You!\n");
			    break;
		    }
		    else if(integer=RandomNumber&&i>3&&i<=N)
		    {
			    printf("Good Guess!\n");
			    break;
		    }		
    	    scanf("%d", &integer);
	   }
    }

2.设计思路

  • 1、定义4个整型变量RandomNumber随机数, N最大猜测次数, integer所猜数, i计数;
  • 2、输入RandomNumber、 N;
  • 3、输入integer;
  • 4、若integer<0,提示"Game Over"并结束程序,否则继续下一步骤;
  • 5、i++;
  • 6、若i>N, printf("Game Over\n")并结束程序,否则继续下一步骤;
  • 7、若integer>RandomNumber, printf("Too big\n"),否则继续下一步骤;
  • 8、若integer<RandomNumber, printf("Too small\n"),否则继续下一步骤;
  • 9、若integer=RandomNumber&&i==1, printf("Bingo!\n")并结束程序,否则继续下一步骤;
  • 10、若integer=RandomNumber&&i>1&&i<=3,printf("Lucky You!\n")并结束程序,否则继续下一步骤;
  • 11、若integer=RandomNumber&&i>3&&i<=N,printf("Good Guess!\n")并结束程序,否则继续下一步骤;
  • 12、返回步骤3;

3.本题调试过程碰到问题及解决办法

本题没有遇到问题

4.本题PTA提交列表

二、PTA排名

三、本周学习总结

1.你学会了什么?

学会了用while、do/while、for等循环结构编写C语言程序解决问题,也能够更加熟练地使用调试工具调试程序,知道scanf语句在输入字符型变量的时候有可能把前一个用于结束的回车吸收进去,因此在写程序的时候要格外注意这些

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

经过这一周的学习,我发现C语言中的scanf()函数和printf()函数其实还有很多用法,但是这些用法我都还没有掌握,另外对于getchar()、putchar()这两个函数的应用我还不是很熟,有时候看到会觉得陌生。

3.分支结构上机考试总结。

分支结构的上机考试我并没有拿到100分,我只拿了86分,没能拿全部分数的题目是分段函数和12-24小时制这两题。分段函数会失分主要是我忘记了怎么用C语言求对数,所以那一个测试点没有得分,考完试后看了书我懂得了如何写,问题便解决了,这也让我知道平时要多注意一下C语言中的数学函数的用法;而12-24小时制这道题目我失分是在

4.你碰到什么困难,打算如何解决?

困难:在循环结构这方面我碰到的困难也是和以前一样,对算法的制定能力太弱,拿到一个新题往往不知所措;还有一个困难就是,虽然学会了调试,但是还不能很快地推断出错误的原因,解决问题特别慢,效率不高

解决:通过敲代码,我发现慢慢地有了一些感觉,反应也比以前快了很多。我发现碰到一开始就不会的题目的话,可以先拿纸和笔在纸上演算一下,等明白了大概思路再打代码,这样解题的思路会很清晰,效率也会高些,所以我相信通过锻炼,我的解题速度会更快一些的。还有对于调试的时候不能很快的推断出原因这个短板,我现在能想到的解决办法就是多练习了,就像老师说的,如果遇到问题多了,到时候就会有程序员的直觉了,哈哈哈

posted @ 2017-11-02 08:51  八月秋高风怒号  阅读(527)  评论(1编辑  收藏  举报