C语言博客作业01--分支、顺序结构
0.展示PTA总分
1.本章学习总结
1.1 学习内容总结
1.数据类型
- 整型 int printf("%d") scanf("%d")
- 字符型 char printf("%c") scanf("%c") ( 也可用 变量=getchar() putchar(变量) )
- 单精度浮点型 float printf("%f") scanf("%f")
- 双精度浮点型 double printf("%f") scanf("%lf")
2.输入和输出
-
scanf: 输入多个数据时必须有间隔。而当输入字符型数据时,应注意空格和回车可能会被储存进变量。
-
printf: %md 指定了整型数据的输出宽度为m,不足m位时空格在左边补位。
%0md 则不足m位时,由0在左边补位。
%m.nf 则指定浮点型数据的输出宽带为m,且保留n为小数。 -
常用数学函数
sqrt(x) :x开二次根号
fabs(x) :x的绝对值
pow(x,n):x的n次幂
exp(x):以e为底数的x次幂
log(x):以e为底数对数
3.分支语句
- 多个if语句:判断多次,影响效率 。 if嵌套:嵌套过多容易出错。else-if:逻辑较清晰。
- switch-case:,只能用于整型和字符型,case后仅能跟整型常量或常量表达式。(注意每个case后都语句是否含break)
总得来说if语句可用于范围判断,而switch语句更适用于离散值得判断。
//一般if-else语句
if (表达式)
{
语句1;
}
else //else后不能跟条件
{
语句2;
}
//if语句的嵌套
if ()
{
if ()
{
;
}
else
{
;
}
}
else()
{
;
}
//else-if语句
if (表达式1)
{
语句1;
}
else if (表达式2)
{
语句2;
}
...
else if(表达式n-1)
{
语句n - 1;
}
else
{
语句n;
}
//switch-case语句
switch (表达式)
{
case 常量表达式1:语段1; break;
case 常量表达式2:语段2; break;
...
case 常量表达式n:语段n; break;
default: 语段n + 1; break;
}
4.循环语句
- for:适用于明确循环次数的循环。
- while:适用范围广
- do-while:至少循环一次。
//for语句
for (表达式1;表达式2;表达式3)
{
循环体语句;
}
//while语句
表达式1;
while (表达式2)
{
循环体语句;
表达式3;
}
//do-while语句
do
{
循环体语句;
} while (表达式);
}
5.拓展
- 常用ASCII码
'a':97
'A':65
'0':48 - 随机数
#include<stdlib.h>
#include<time,h>
srand(time(0));
number=rand();
- 浮点数与0的比较
由于存在浮点误差不能直接比较,只能取多位小数接近0来比较。
1.2.本章学习体会
- 必须要预习,学习必须超前,才不会太吃力。因为比如说老师上课的一些互动问题啊,还有pta的一些题目。
- 提前学习能更好的掌握,上课时候的再次重复加深记忆,同时还能发现一些新的细节。
- 希望老师也可以讲解一些pta的题目
- 两周代码量大概1000
2.PTA实验作业
2.1 c03-单循环结构7.7猜数字游戏
2.1.1 数据处理
数据表达
int randomNumber;//需要输入的随机数
int yournumber = 0;//用户所猜数,设初始值为0,为了进入下面while循环
int N;///允许的最大猜数次数
int i = 0;//已猜次数
先scanf输入随机数,在while循环中用scanf输入用户所猜数。
数据处理
先利用while结构,令在最大猜数次数范围并且猜不对的情况下,进入循环反复猜数。并且在while后添加if语句,超过猜数次数则输出game over。
在whlie内部输入用户所猜数后,先判断数字大小。若大于0,则进一步判断。小于0,依照题目要求,需要结束程序输出game over,因此令i=N+1;使得负数能够跳出循环并且满足输出game over条件。
最后在循环内部,用户猜数大于0情况下,对数的大小、相等及相等次数进行判断。
2.1.2 代码截图
2.1.3 本题可扩展功能
本题可将手动输入随机数部分改为电脑自动产生随机数,更具有随机性。利用
#include<stdlib.h>
#include<time.h>
srand(time(0));
randomnumber=rand()%100
2.1.4 PTA提交列表及说明
Q1:答案部分正确,是因为一开始编写代码时,仅考虑在结束while循环后直接输出game over。因此造成猜对了之后除了输出固有语句后,还多输出了game over。
A1:因此添加if(i>n)条件,并且while中负数情况令i=N+1,能同时令负数和超出猜数次数情况输出game over,而猜对情况仅输出固有语句。
2.2 c03-单循环结构7-11 简单计算器
2.2.1数据处理
数据表达
int number;
int sum;
char op;//运算符
int flag = 1;//用于判断sum还是error。flag=1表示可计算,为0则表示错误
数据处理
先输入第一个数,直接将第一个数值赋给总值sum,再输入运算符分情况,若为=,即形成最简单式(数字=),则直接输出总值,否则进入do-while循环进入后续计算。
do-while语句中,先输数字,必须先进入switch-case语句计算后,才能再次输入运算符。
最后输出sum值即可,但存在无法计算输出error情况,引入flag,并根据flag的值来判断最后是否输出sum值。
2.2.2 代码截图
2.2.3 本题可拓展功能
本题改进时可将简单式的判断if-else语句去掉,直接放入do-while中的switch-case中判断,添加case ’=‘的情况。
直接进入do-while语句,当为最简单式时,体现了do-while语句至少执行一次的价值,提高代码的简洁高效性。
2.2.4PTA提交列表及说明
Q1:部分正确是因为未考虑最简单式情况
A1:修改时直接在do-while语句外添加if-else条件语句,就直接先解决最简单式情况。
2.23c03-单循环结构7-8 念数字
2.3.1 数据处理
数据表达
int number;//输入的数字
int reverseOrder = 0;//该数字的倒序数
int i;//取每位数的次数
int x;//用于取数字的每一位
int n = 0;//该数字的位数
scanf输入number。
数据处理
先总的分为三种情况,number=0较为简单直接解决输出即可,number<0情况转化为number>0情况,接下来详细编写number>0的情况。
在number>0的情况下,先用while语句将number倒序:
while (number > 0)
{
x = number % 10;
number /= 10;
reverseOrder = reverseOrder * 10 + x;
n++;
}
接下来再用for语句再次倒序:
for (i = 1; i <= n; i++)
{
x = reverseOrder % 10;
reverseOrder /= 10;
}
并且在for语句中利用switch-case语句逐个输出拼音,每个拼音间输出空格满足题目要求。
2.3.2 代码截图
2.3.3 本题可扩展功能
题目要求输出数据间空格隔开,但最后不带空格。据上课老师所提到的解决方法可知有两种方法。
1.即对最后一项单独判断,如代码中所示,我利用的是循环次数来判断,最后不输出空格。
switch()
{......}
if (i < n)
{
printf(" ");
}
2.引入flag,即第一次只输出数字,此后每次都先输出空格再输数字,并且根据题目此时同时需要调整switvh-case语句位置。
int flag=1;
if(flag==1)
{
flag=0;
}
else
{
printf(" ");
}
switch()
{.....}
2.3.4 PTA提交列表及说明
虽然pta上提交列表一次就正确,但是其实是由于pta上的测试数据调试得不到正确答案,所以已经在vs中进行多次修改。
Q1:一开始苦恼,这次题目有所升级没有固定的位数,无法直接拆分。
A1:记得翁恺老师视频中有提过如何拆分整数,于是又回去重温了一遍。于是采取了两次倒序的方法解决不确定位数整数问题。
Q2:一开始用数据1234调试结果成功,但用-600调试就得不到正确答案了。是由于我利用了两次倒序,若是遇到末尾为0的数字,则倒序数的位数将减少,再次倒序就无法输出完整了。
A2:于是我引入了n(整数的位数)和i(循环执行次数),第一次倒序时记录整数的位数,在第二次倒序中,让循环执行次数达到整数位数,则就能解决问题了。
Q3:同样的由于末尾带0的数字,在数据间隔的问题上也出错了。一开始我编写的是
if(n>9)
{
printf(" ");
}
由于条件是与数字的位数有关,遇到末尾含0数,倒序后位数有所改变,空格输出也就有所影响。
A3:于是我同样利用了循环次数来解决。
if (i < n)
{
printf(" ");
}
3.阅读代码
ACM题库 zoj1037
该题解貌似是用C++语言编写的,cmath是C++的标准头文件,是一个数学函数库。#include<cstdio.h>就是C语言中的#include<stdio.h>。
优点:用while结构多次计算最短推销员旅行长度。其中while循环条件(T--)十分巧妙,即把v值作为表达式的值,然后将v值减1,直到已经计算了足够次数时,v=0为假,跳出while循环。
用while结构十分简洁的解决题目所要多次求解的问题,while循环条件(T--)的写法更值得学习,简洁巧妙。