我の第二篇博客

| 这个作业属于哪个班级 | 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实现两个数的交换

  1. 加减法
a = a + b;//
b = a - b;//b = a+b-b,所以b已经得到a的值
a = a - b;//a =(a+b)-(a),a得到b的值
  1. 乘除法
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);          //单一出口
}
posted @ 2020-11-08 23:23  强扭的甜瓜  阅读(222)  评论(0编辑  收藏  举报