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--)的写法更值得学习,简洁巧妙。

posted @ 2019-10-07 20:50  郑梦露  阅读(413)  评论(3编辑  收藏  举报