第三次博客作业
PTA分数
本章学习总结
for循环语法
for 循环语句的一般形式为:
for (表达式1; 表达式2; 表达式3)
{
循环体语句;
}
- for语句中,用两个分号分隔三个表达式,但for的后面没有分号,因为for与其后面的循环体语句合起来作为一条完整的语句。
- 在for语句的执行过程中,表达式2,循环体语句和表达式3将重复执行,而表达式1只有进入循环前执行一次。
while、do while循环语法
while 循环执行顺序的格式是:
while (表达式)
{
循环体 语句;
}
- 当表达式的值为“真”时,循环执行,直到表达式的值为“假”,循环中止并继续执行while的下一条语句。
- while语句中的表达式可以是任意合法的表达式,循环语句只能是一条语句。
do while循环语法
do-while语句的一般形式为:
do
{
循环体语句
}
while(表达式);
- 它先执行循环体,后判断循环条件,所以无论循环条件的值如何,至少会执行一次循环体。
- 第一次进入循环时,首先执行循环体语句,然后再检查循环控制条件,即计算表达式,若值为“真”,继续循环,直到表达式的值为“假”,循环结束,执行do—while的下一条语句。
break语句
- break语句强制控制循环结束,一旦执行了break语句,循环提前结束,不再执行循环体中位于其后的其他语句。
- break语句应该和if语句配合使用,循环提前结束,不在执行循环体中位于其后的其他语句;否则,若break无条件执行,意味着永远不会执行循环体中break后面的其他语句。
continue语句
- continue语句的作用是跳过循环体中continue后面的语句,继续下一次循环,一般也需要与if语句配合使用。
- continue循环语句和break语句的区别在于,break结束循环,而continue只是跳过后面语句继续循环。break语句除了可以终止循环外,还用于switch语句,而continue只能用于循环。
循环嵌套
嵌套类型
在C语言中,if-else、while、do-while、for 都可以相互嵌套。所谓嵌套(Nest),就是一条语句里面还有另一条语句,例如 for 里面还有 for,while 里面还有 while,或者 for 里面有 while,while 里面有 if-else,这都是允许的。
嵌套错误
- 在c中可以嵌套调用函数,但不可以嵌套定义函数。
- 出现标识符未定义,重定义等错误。
学习体会·
- 代码的难度逐渐增加,越来越考验自己的思维逻辑能力,而且题目难度增大。
- 感觉自己在c语言学习方面仍有欠缺,很多时候看到一个题目,根本不知道该从哪里去做,从哪里开始。
- c语言学习应注意一些细节问题,像有时候一个嵌套错误,语法错误,甚至是符号错误,这条代码也无法运行。
编程技巧总结
判断是否为素数
- 即判断数m能否被2~m-1之间的整数整除,用%来判断。
- 设i取值[2,m-1],如果m不能被此区间上的任何一个数整除,即对每个i,m%i都不为0,则m是素数;若m被此区间的某个数整数,则m是素数。
通过循环打印图形
运用双重for的循环嵌套
max初值/min初值
先读入第一个数,将它赋给min和max,然后读余下的n-1个数,与它们比较
统计整数位数
只需要设计一个计时器,因为C语言中除法只留下整数部分,所以可以拿数字/10;数字位数即为循环次数,待n为个位时n/10=0,循环结束。
交错数列实现方式
使用sign来实现正负号转变
大小写字母的转化方式
小写转大写:ch-'a'+'A'
大写转小写:ch-'A'+'a'
字符转数字问题
让数字字符去减‘0’得到的就是数字的值
四则运算
用'+''-''*''/'符号进行运算。
数字逆序
每分离一位数,就把这位数变为个位,之前的乘以十升为高位,以此类推
PTA实验作业
数列求和问题
流程图或伪代码介绍思路
奇数列为正,偶数列为负,用%来判断是否为偶数列。用for循环结构进行运算。
代码截图
#include<stdio.h>
int main()
{
int i, n;
double x = 1;
double m = 1;
double sum;
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
if (i % 2 == 0)
{
x = -(i / m);
}
else
{
x = i / m;
}
sum = sum + x;
m = m + 2;
}
printf("%.3lf", sum);
return 0;
}
PTA提交列表及说明
刚开始是没有想到它的求和关系是什么,偶数列和奇数列如何进行符号转换运算。
图形打印问题
代码截图
#include<stdio.h>
int main()
{
char ch;
int n,i,j,k;
scanf("%c %d",&ch,&n);
char arr[10][10];
for(i=0;i<n;i++)
for(j=0;j<n;j++)arr[i][j]=' ';//初始化二维数组全为字符0
arr[0][(n-1)/2]=arr[n-1][(n-1)/2]=ch;//第一排和最后一排特殊处理
arr[0][(n-1)/2+1]=arr[n-1][(n-1)/2+1]='1';
arr[(n-1)/2][n]='1';//特殊处理用1来标志每一行的字符后面
ch++; //字符由整型存储固ch++可以是b变成c
for(i=1,j=1;i<=(n-1)/2;i++,j++){//由一行最中间来开始,每往下一行便分别加一减一
arr[i][(n-1)/2+j]=ch;
arr[i][(n-1)/2-j]=ch;
arr[i][(n-1)/2+j+1]='1';
ch++;
}//上半部分
ch-=2;j-=2;
for(;i<n;i++,j--){
arr[i][(n-1)/2+j]=ch;
arr[i][(n-1)/2-j]=ch;
arr[i][(n-1)/2+j+1]='1';
ch--;
}
for(i=0;i<n;i++){//输出处理好的二维数组,遇到1便换行否则行末会多多余空格pta会判格式错误
for(j=0;j<n;j++){
if(arr[i][j]=='1')break;
printf("%c",arr[i][j]);
}printf("\n");//一行结束后输出换行符。
}
}
PTA提交列表及说明
在网上进行了查询,也是在室友的帮助下完成的。
自选一题,介绍printf调试如何检查错误
单步调试截图
代码截图
#include<stdio.h>
int main()
{
int time;
int rabbitdis = 0;
int turtledis = 0;
int totaltime;
scanf("%d", &totaltime);
for (time = 1; time <= totaltime; time++)
{
rabbitdis = rabbitdis + 9;
turtledis = turtledis + 3;
if (time % 10 == 0)
{
if (turtledis < rabbitdis)
{
if (time + 30 > totaltime)
{
turtledis = turtledis + 3 * (totaltime - time);
break;
}
else
{
turtledis = turtledis + 3 * 30;
time = time + 30;
}
}
}
}
if (turtledis > rabbitdis)
{
printf("@_@ %d", turtledis);
}
else if (turtledis == rabbitdis)
{
printf("-_- %d", turtledis);
}
else
{
printf("^_^ %d", rabbitdis);
}
return 0;
}