分支.顺序结构
| 这个作业属于哪个班级 | C语言--网络2011/2012 |
| ---- | ---- | ---- |
| 这个作业的地址 | C博客作业00--顺序分支结构 |
| 这个作业的目标 | 初步认识C语法,掌握数据表达、printf、scanf语法及分支结构内容 |
0.展示PTA总分
1.本章学习总结
1.1学习内容总结
本部分内容主要是对分支结构和顺序结构的知识点及易错点的总结分析
1.1.1顺序结构
⭐注意事项:
- 变量使用前必须定义,初始化;
printf
的使用格式为printf("...");
- 末尾注意要
return 0
。
⭐简单案例:
#include <stdio.h>
#include <math.h>
int main()
{
int money, year;//定义变量
double rate,sum;
scanf("%d %d %lf", &money, &year, &rate);//调用函数scanf()输入变量的初值
sum = 1.0*money * pow(1 + rate, year);
printf("sum = %.2lf", sum);//输出所求值
return 0;//结束main()函数的运行,返回一个整数0,作为程序的结束状态
}
1.1.2分支结构
⭐if-else
- 形如
if
else if
else if
else
的程序,若进入前一个条件,后面就不再进入
错误示范
#include <stdio.h>
int main()
{
int x, y, z;//定义三个整数
int temp;
scanf("%d %d %d", &x, &y, &z);//调用函数scanf()输入变量的初值
if (x > z)
{
temp = x;
x = z;
z = temp;
}
else if (y > z)// 此处错误运用了`else if`语句,当输入数字满足`if`条件时,即退出分支结构,不再判断后方的`else if`是否满足
{
temp = y;
y = z;
z = temp;
}
else if (x > y)
{
temp = y;
y = x;
x = temp;
}
printf("x=%d,y=%d,z=%d", x, y, z);
return 0;
}
正确示范
#include <stdio.h>
int main()
{
int x, y, z;//定义三个整数
int temp;
scanf("%d %d %d", &x, &y, &z);
if (x > z)
{
temp = x;
x = z;
z = temp;
}
if (y > z)//使用if,而非else if,每个条件都要判断,每次满足都要执行。
{
temp = y;
y = z;
z = temp;
}
if (x > y)
{
temp = y;
y = x;
x = temp;
}
printf("x=%d,y=%d,z=%d", x, y, z);
return 0;
}
⭐switch
switch
语句使用时,每个case
后必须先加空格再加数字
错误示范
#include <stdio.h>
int main()
{
int grade;//定义变量
int firstNumber;
scanf("%d", &grade);//调用scanf()函数输入变量初始值
firstNumber = grade / 10;
switch (firstNumber)//计算机无法识别case10(case后不加空格),导致无论输入什么数都只能进入default,最终输出E。
{
case10:
case9:printf("A"); break;
case8:printf("B"); break;
case7:printf("C"); break;
case6:printf("D"); break;
default:printf("E"); break;
}
return 0;
}
正确示范
#include <stdio.h>
int main()
{
int grade;//定义变量
int firstNumber;
scanf("%d", &grade);//调用scanf()函数输入变量初始值
firstNumber = grade / 10;
switch (firstNumber)//case后一定要加空格!!!
{
case 10:
case 9:printf("A"); break;
case 8:printf("B"); break;
case 7:printf("C"); break;
case 6:printf("D"); break;
default:printf("E"); break;
}
return 0;
}
switch
语句使用时,每个case
下的语句中只有存在break才能退出switch
,否则会一直往下执行
没有break
#include <stdio.h>
int main()
{
int grade;//定义变量
int firstNumber;
scanf("%d", &grade);//调用scanf()函数输入变量初始值
firstNumber = grade / 10;
switch (firstNumber)//没有break导致程序一直往下执行,若输入90,最终输出ABCDE。
{
case 10:
case 9:printf("A");
case 8:printf("B");
case 7:printf("C");
case 6:printf("D");
default:printf("E");
}
return 0;
}
有break
#include <stdio.h>
int main()
{
int grade;//定义变量
int firstNumber;
scanf("%d", &grade);//调用scanf()函数输入变量初始值
firstNumber = grade / 10;
switch (firstNumber)//遇到break即退出switch,若输入90,则输出A。
{
case 10:
case 9:printf("A"); break;
case 8:printf("B"); break;
case 7:printf("C"); break;
case 6:printf("D"); break;
default:printf("E"); break;
}
return 0;
}
1.1.3随机函数的使用
#include <stdlib.h>
int myNumber=rand()%100//生成从1-100的随机数
int myNumber=10+rand()%90//生成从10-100的随机数
- 随机种子
srand(time())//srand()函数是提供初始化种子的函数,而rand()函数是可以生成随机数的函数。
1.2 编程技巧总结
- 取某一位数num的个位
int digits;
digits=num%10;
- 判断整除
if(num%10==0)//此时为整除
if(num%10!=0)//此时无法整除
- 判断偶数
if(num%2==0)//此时为偶数
if(num%2!=0)//此时为奇数
- 平方根及次幂的使用
#include <math.h>//使用数学函数时,需加上这个头文件。
int num;
int square root;
int power;
square root=sqrt(num);//计算num的平方根,注意:括号内只能为非负实数。
power=pow(num,x);//计算num的x次幂
- 判断位数/判断一个数各个位数上的数字
int count=0;
for(;num>0;)
{
temp=num%10;//输出最后一位数
num/=10;//删去最后一位数后的结果,如原来num=1234,c则除10后,num=123。
count++;
printf("%d",temp);//可从最后一位开始输出每位数的具体值
}
printf("%d",count);//可计算该数的总位数
- 三个数的大小排序
int num1,num2,num3;
if(num2>num3)
{
temp=num2;
num2=num3;
num3=temp;
}
if(num1>num2)
{
temp=num1;
num1=num2;
num2=temp;
}
if(num1>num3)
{
temp=num1;
num1=num3;
num3=temp;
}
1.3 本章学习体会
- 对于
if
条件的分类有时仍易有缺漏,应多加练习,提高自身逻辑思维能力。 - 希望老师能够在课堂与作业的布置上更重视夯实基础,当然也可以有难题思考。
- 这两周可能还未适应大学学习节奏,导致学习时间的安排混乱,所以在代码上的时间没有想象中的多,除了老师课堂上的写代码时间及完成老师布置的写代码作业外,没有很多时间用于自己私下的自我提升,希望接下来能够继续改进。
2.PTA实验作业
2.1 前天是哪天
⭐2.1.1 数据处理
数据表达
int year,month,day;//定义 年year 月month 日day
scanf("%d-%d-%d",&year,&month,&day);//输入给定日期
数据处理
先将day-=2,虚拟前天的天数
如果减完后day>0,那么说明,前天仍在那个月,则直接输出year-month-(day-2)
如果减完后day<=0,那么说明,前天在上一个月,
此时需分类讨论:
①若month=3,则month-1=2,而对于2月,我们需讨论其为平年或闰年。
if((year%100!=0&&year%40)||(year%1000&&year%400==0))此时为闰年,则
该年2月有29天,所以前天的实际天数应为day+=29,所以应输出year-(month-1)-day
若不为闰年,则
该年2月有28天,day+=28
②若month=1,则month-1=12,可知其前天需回退一年,则
day+=31其前天实际的日期应为(year-1)-month-day
③若month的前一个月为偶数月,那么
day+=31,month-=1
④若month的前一个月为基数月,那么
day+=30,month-=1
⭐2.1.2 代码截图
⭐2.1.3 PTA提交列表及说明
- 若未注意month=1时可能出现年份减一的情况,易导致错误
- 若未注意2月要分平闰年,易导致错误
- 若未注意大月与小月天数不同,也易导致错误
2.2 单词长度
⭐2.2.1 数据处理
数据表达
int flag=0;
char word;
int num = 0;
数据处理
通过循环结构进行多次输入,当输入字符不为空格,句号及换行符时,单词长度++
当退出循环后,通过flag使输出时行末不会出现空格
退出循环后,遇句号则结束整个程序。
⭐2.2.2 代码截图
⭐2.2.3 PTA提交列表及说明
- 若未使用flag容易使输出时末尾错误出现空格
- 注意字符的输入与输出均是使用%c
2.3 求幂级数展开的部分和
⭐2.3.1 单步调试截图
由单步调试可知,num的数据读入不正确,num的值本应为输入的1.2,监视数据却显示num为858993459.
⭐2.3.2 代码截图
⭐2.3.3 PTA提交列表及说明
经过pta及vs的错误提示,发现是变量类型错设导致的错误
改正后的代码
通过逐步调试,发现将变量的类型从int改为double后,num的值读入正确