1.PTA总分

  • 单循环结构

  • 嵌套循环


2.本章学习总结

2.1学习内容总结

for语句

  • 形式:for(表达式1;表达式2;表达式3)
    循环体语句
  • 适用于事先给定循环次数的情况,一目了然。

while语句

  • 形式:while(表达式)
    循环体语句 ;
  • 适用于循环次数不明确且无需先进行循环体运算的情况。

do-while语句

  • 形式:do{
    循环体语句
    }while(表达式);
  • 适用于循环次数不明确且需先进入循环体运算,再判断是否进入下一次循环的情况。

嵌套循环(多重循环):注意分清内外循环以及循环初始化语句的位置。


break语句和continue语句

  • break语句强制语句结束,不再执行循环体中位于其后的其他语句,且应和if语句配合使用,即条件满足时,才执行break跳出循环。
  • continue语句的作用是跳过循环体中continue后面的语句,继续下一次循环,一般也需要与if语句配合使用。
  • break结束循环,而continue只是跳过后面语句继续循环。break语句除了可以终止循环外,还用于switch语句,而continue只能用于循环。

2.2本章学习体会

2.2.1学习体会:很难培养所谓的循环思维,好多次知道要用什么循环语句,但不懂该如何用相关的变量表示出来。

2.2.2代码量

第七周 第八周
代码量 350 335

3.PTA实验作业

3.1 7-8 查询水果价格

3.1.1伪代码

printf()    //五次输出,打出菜单
while(最多查询5次)
scanf();  //用户输入选择
if (choice == 0)
{
结束循环
}
if (choice == 1)
{
输出苹果价格,次数加一
}
else if (choice == 2)
{
输出梨子价格,次数加一
}
else if (choice == 3)
{
输出桔子价格,次数加一
}
else if (choice == 4)
{
输出葡萄价格,次数加一
}
else
{		
输出价格为0.00,次数加一	
}
结束循环

3.1.2代码截图


3.1.3造测试数据

输入 输出 说明
3 -1 0 2 [1] apple \n [2] pear \n [3] orange \n [4] grape \n [0] exit \n price = 4.10 \n price = 0.00 sample
1 2 3 3 4 4 5 6 7 8 [1] apple \n [2] pear \n [3] orange \n [4] grape \n [0] exit \n price = 3.00 \n price = 2.50 \n price = 4.10 \n price = 4.10 \n price = 10.20 sample
1 0 [1] apple \n [2] pear \n [3] orange \n [4] grape \n [0] exit \n price = 3.00 第一个数据有效,第二次输入0时结束循环

3.1.4 PTA提交列表及说明

答案错误原因:菜单中的选项梨子pear错写成peaar。。


3.2 7-7 换硬币

3.2.1伪代码

for(number5=19;number5>=1;number5--)    //对5分硬币的数量进行控制,数量为1到19之间
{ 
   for(number2=49;number2>=1;number2--)      //对2分硬币的数量进行控制,数量为1到49之间

 { 
       for(number1=99;number1>=1;number1--)     //对1分硬币的数量进行控制,数量为1到99之间

        { 
           
            if(number5*5+number2*2+number1==x)    //判断三种硬币的数量是否满足题目要求
            {
            printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n",number5,number2,number1,number5+number2+number1);     //若满足,输出相应硬币的数量
       
            count++;     //次数加一,用来统计换法个数
            }
        }
  }
}
结束循环

3.2.2代码截图


3.2.3造测试数据

输入 输出 说明
13 fen5:2, fen2:1, fen1:1, total:4 \n fen5:1, fen2:3, fen1:2, total:6 \n fen5:1, fen2:2, fen1:4, total:7 \n fen5:1, fen2:1, fen1:6, total:8 \n count = 4 sample

3.2.4 PTA提交列表及说明

错误代码:

#include<stdio.h>
int main()
{


   int number5;
   int number2;
   int number1;
   int count;
   int x;
   scanf("%d",&x);
   count=0;
   for(number5=1;number5<=19;number5++)
   { 
       for(number2=1;number2<=49;number2++)
       { 
           for(number1=1;number1<=99;number1++)
           { 
           
           if(number5*5+number2*2+number1==x)
           {
           printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n",number5,number2,number1,number5+number2+number1);
       
           count++;
           }
           }
       }
   }
   printf("%d",count);
   return 0;
}

答案错误原因:没看清题目要求,题目要求按5分、2分和1分硬币的数量依次从大到小的顺序,输出各种换法,按照此代码的话会从小到大输出各种换法,不符合题目要求。


3.3 7-2 梅森数

3.3.1伪代码

for (i = 1; i <= n; i++)    
{
       number = pow(2, i) - 1;     //表示出梅森数的形式
   for (j = 2; j <= number; j++)   //进行number是否是素数的判断
   {
   	if (number % j == 0)
   	{
   		结束循环
   	}
   	if (j > number / 2 && number != 1)  
   	{
   		leap = 2;   //表示状态,说明number是梅森数
   		printf("%d\n", number);
   		break;
   	}
   }					
}	


3.3.2代码截图


3.3.3造测试数据

输入 输出 说明
6 3 \n 7 \n 31 sample
1 None 输入最小的正整数,则不存在这样的梅森数

3.3.4 PTA提交列表及说明

说明:注意一下素数的判断,代码中j的取值范围可以改为2到number的一半或者2到number的算术平方根。


3.代码互评

7-8 查询水果价格

同学代码1:

#include<stdio.h>
int main(void)
{
   printf("[1] apple\n[2] pear\n[3] orange\n[4] grape\n[0] exit\n");

   int a;
   int k;

   for (a = 0; a <= 4; a++)
   {
   	scanf("%d", &k);
   	if (k == 0)
   	{
   		break;
   	}
   	switch (k)
   	{
   	case 1:printf("price = 3.00\n");
   		break;
   	case 2:printf("price = 2.50\n");
   		break;
   	case 3:printf("price = 4.10\n");
   		break;
   	case 4:printf("price = 10.20\n");
   		break;
   	default:printf("price = 0.00\n");
   		break;
   	}
   }
   return 0;
}​


同学代码2:

#include<stdio.h>
int main()
{
   int num;
   int i;
   printf("[1] apple\n");
   printf("[2] pear\n");
   printf("[3] orange\n");
   printf("[4] grape\n");
   printf("[0] exit\n");
   for (i = 1; i <= 5; i++)
   {
   	scanf("%d", &num);
   	if (num == 0)
   		break;
   	switch (num)
   	{
   	case 1:
   		printf("price = 3.00\n"); break;
   	case 2:
   		printf("price = 2.50\n"); break;
   	case 3:
   		printf("price = 4.10\n"); break;
   	case 4:
   		printf("price = 10.20\n"); break;
   	default:
   		printf("price = 0.00\n"); break;
   	}
   }
   return 0;
}

我的代码:

#include<stdio.h>
int main()
{
   int choice;
   int count = 1;
   printf("[1] apple\n");
   printf("[2] pear\n");
   printf("[3] orange\n");
   printf("[4] grape\n");
   printf("[0] exit\n");
   while (count <=5)
   {
   	scanf("%d", &choice);
   	if (choice == 0)
   	{
   		break;
   	}
   	if (choice == 1)
   	{
   		printf("price = 3.00\n");
   		count++;
   	}
   	else if (choice == 2)
   	{
   		printf("price = 2.50\n");
   		count++;
   	}
   	else if (choice == 3)
   	{
   		printf("price = 4.10\n");
   		count++;
   	}
   	else if (choice == 4)
   	{
   		printf("price = 10.20\n");
   		count++;
   	}
   	else
   	{
   		printf("price = 0.00\n");
           count++;
   	}
   }
   return 0;
}

  • 两个同学都用了for语句来实现循环结构,并且都用了switch语句来实现多分支结构。而我用while语句来实现循环结构,用else-if语句来实现多分支结构。
  • 代码1把菜单的输出用一句printf()语句完成,其中加上换行符。我的代码和代码2都用5句printf()语句来输出菜单。代码1for语句中初值为0,最大值为4;代码2for语句中初值为1,所以最大值为5;我的代码中查询次数的初值为1,所以执行while语句的条件为查询次数小于等于5.