这个作业属于哪个班级 | C语言--网络2011/2012 |
---|---|
这个作业的地址 | C博客作业00--顺序分支结构 |
这个作业的目标 | 初步认识C语法,掌握数据表达、printf、scanf语法及分支结构内容 |
0.展示PTA总分
1.本章学习总结
1.1本章内容总结
1.1.1关于rand与srand
- srand()用来设置rand()产生随机数时的随机数种子。
- srand()是种子生成器,常用时间作为随机数生成器的种子所以在头文件加入#include<time.h>
- 调用srand固定要#include<stdlib.h>头文件
- rand()%100,rand()是一个整型数,整数对100的余数,因此rand()%100的取值范围是[1,99]。
错误 第一次使用时发现结果永远是41,其实是因为我没提供随机种子,在我们没有定义初始值的情况下,系统默认给出seed值为1
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a = rand()%100;
printf("%d", a);
}
正确
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main()
{
srand(time(0));
int a=rand()%100;
printf("%d", a);
}
1.1.2数学函数
函数类型 | 函数名 | 使用方法 | 注释 |
---|---|---|---|
开根号 | sqrt | sqrt(x) | x为开根号的数 |
开方 | pow | pow(x,n) | x的n次方 |
绝对值 | fabs | fabs(x) | x的绝对值 |
注意:调用这些数学函数需要添加头文件#include<math.h>
1.1.3交换数字
常用temp作为中间量来实现两个数字的交换
如以下代码:
temp = num1; num1 = num2; num2 = temp;
补充:如何不使用temp实现两个数的交换
- 加减法
a = a + b;//
b = a - b;//b = a+b-b,所以b已经得到a的值
a = a - b;//a =(a+b)-(a),a得到b的值
- 乘除法
a = a * b;
b = a / b;//经过一乘一除,b得到a的值
a = a / b;//a=(a*b)/(a),a得到b的值
1.1.4关于%md
它可以运用在scanf和printf语句中
-
scanf:超出m位只读m位.
-
printf:如果是%md,不足位数在左边用空格补充
如图所示:
-
printf:如果是%-md,不足位数在右边用空格补充
1.1.5flag
flag可以用来帮助程序做复杂条件的判断。
flag只有1和0两个数值,例子如下。
题目:计算交错序列 1-2/3+3/5-4/7+5/9-6/11+... 的前N项之和。
代码:
#include<stdio.h>
int main()
{
int N;
scanf("%d", &N);
int flag = 1;
double temp;
double sum = 0;
for (int i = 1; i <= N;i++)
{
temp = 1.0 * flag*i / (2.0 * i - 1);
sum = sum + temp;
flag = -flag; //1和-1反复横跳
}
printf("%.3f", sum);
}
1.1.6数据类型总结
数据类型 | scanf("") | printf("") |
---|---|---|
int | %d | %d |
double | %lf | %f |
float | %f | %f |
char | %c | %c |
注意字符要用单引号('')
1.2 编程技巧总结
- 判断整除做法
#include<stdio.h>
int main()
{
int a;
scanf("%d", &a);
if (a % 10 == 0) //判断整除
{
printf("您输入的%d能被十整除",a);
}
else
{
printf("您输入的%d不能被十整除", a);
}
}
取某一位数个位做法 | 去某一位数个位做法 | 取已知位数的最高位数(例如四位数) | 去已知位数的最高位数(例如四位数) |
---|---|---|---|
a=a%10 | a=a/10 | a=a/1000 | a=a%1000 |
- 代码中比较难理解的部分,最好有注释
//我是单行注释
/*我是多行注释
emmmmmmmmmmmmmmmm*/
- 英文来当变量名
- 为了美观,我们还用驼峰命名法
- 常用temp作为中间量来实现两个数字的交换
- flag只有1和0两个数值,因此可以用来帮助程序做复杂条件的判断
1.3 本章学习体会
- 本章学习了分支和顺序结构的相关语法,和一些编程技巧
不理解的地方:!x和!!x不是很懂,还有while(1) - 这两周把分支和顺序结构刷了,大概600行代码量吧。
2.PTA实验作业
2.1 前天是哪天
2.1.1 数据处理
数据表达:
1.常量:无
2.变量:
现在年月日三个变量
两天前的年月日三个变量
数据处理:
1.前天是哪天?需要考虑是否是上个月
2.上个月是否是去年的12月(跨年)
2.1.2 代码截图
2.1.3 PTA提交列表及说明
代码是来自智凯学长的,自己理解的比较清楚,没有出现问题。
2.2
2.2.1 数据处理
数据表达:
1.常量:3,9,30
2.变量:
兔子跑的距离rabbitDis
乌龟跑的距离turtDis
跑的时间time
跑的总时间TotalTime
数据处理:
1.每跑十分钟回头看一下乌龟用time%10=0
2.计算兔子跑的距离rabbitDis,乌龟跑的距离turtleDis
3.在回头看的前提下,如果rabbit>turtleDis,则兔子不动,乌龟继续跑30分钟
4.在兔子不动时,还要考虑乌龟是否能跑满30分钟
5.time从1到TotalTime
6.因为循环次数确定,所以用for循环
2.2.2 代码截图
2.2.3 PTA提交列表及说明
Q1:部分正确说明大体是正确的
A1:经过单步调试后,发现time到了它依然在循环内,原来是我少了break;跳出
Q2:在vs改完后复制到PTA依旧错误(一脸懵逼)
A2:原来是scanf_s的问题
2.3 自选一题,介绍单步调试如何检查错误
2.3.1 单步调试截图
2.3.2 代码截图
2.3.3 PTA提交列表及说明
-
第一个错误,同时也是第一种方法
错误原因a,b,c三个变量没有初始化 -
第二种方法是用的交换数字的方法
#include <stdio.h>
int main()
{
int a, b, c, t;
scanf("%d %d %d", &a, &b, &c);
if (a > b)//改变为 b>a
{
t = a; a = b; b = t;
}
if (a > c)//改变为c>a
{
t = a; a = c; c = t;
}
if(b > c)//改变为c>b
{
t = b; b = c; c = t;
}
//经过三个if后 变为 c>b>a
printf("%d", b);
}
错误原因t未初始化
- 第三种方法与第一种类似,把第一种的六种情况合并为三种情况
#include<stdio.h>
int main()
{
int a, b, c;
int middle;
scanf("%d %d %d", &a, &b, &c);
if (a >= b && b >= c || c >= b && b >= a)//b在中间
{
middle = b;
}
if (b >= a && a >= c || c >= a && a >= b)//a在中间
{
middle = a;
}
if (a >= c && c >= b || b >= c && c >= a)//c在中间
{
middle = c;
}
printf("%d", middle); //单一出口
}