C语言博客作业--数据类型
7-4 打印菱形图案
1. 本题PTA提交列表(要提交列表,不是结果)
2. 设计思路(用代码表示扣分)
- 定义循环变量i,j,k,n,打印行数number,
输入要打印的行数number
for(i=1;i<=循环条件;i++)用于控制输出的行数
for(j=1;j<=循环条件;j++)用于控制输出空格数
先输出上半个菱形,输出(number+1)/2行
输出每行前的空格个数,再输出 * ,换行。
输出下半个菱形
for(i=1;i<=循环条件;i++)
for(j=1;j<=循环条件;j++)
输出((number+1)/2-1))行, 输出每行前的空格个数,再输出 * 。
3.代码截图(注意,截图,截图,截图。不要粘贴博客上。不用用···语法去渲染)
- 这是之前的错误代码
4.本题调试过程碰到问题及PTA提交列表情况说明。
-
1.一开始输出的上三角与输入的数字number一样多,不符合题目要求。
-
解决办法:这个问题,,,用两个数字运行了两遍以后就发现是我的循环条件有错,我有试着找他们的规律,可是我找到的规律不具有普遍性,所以前面输出的空格个数用小数据测试还对,用大数据测试因为前面空格不够就都挤到后面,整个无法构成菱形,最后实在找不出来就求助了同学。
-
2.本来我的设计思路是先输出上半个菱形后再输出下半个菱形,可是我,,,,,,又找不出循环条件。
-
解决办法:这样的循环条件对我来说太难找了,所以室友建议我换个思路,在一开始就用条件来限制,当i小于(number+1)/2时进入第一个循环输出上三角,否则输出下三角。
7-6 掉入陷阱的数字
1. 本题PTA提交列表(要提交列表,不是结果)
2. 设计思路(用代码表示扣分)
- 定义输入的数字number,sum存放经过计算后的和,flag用于存放上一个产生的新数,digit用于存放取余得到的数,循环变量i,j。
for(i=1;i>0;i++){
将number的值赋给flag
for(j=1;j>0;j++){
对number取余,取出number的每一位数后进行运算sum=sum+digit;sum=sum*3+1;
输出i:sum的值。
将sum的值赋给number,将sum再次赋值为0。
进行判断 if(flag==number)及当前运算所得数与上一个数相等时退出循环。}
3.代码截图(注意,截图,截图,截图。不要粘贴博客上。不用用···语法去渲染)
4.本题调试过程碰到问题及PTA提交列表情况说明。
-
1这题一开始将输入数字是个位数还是更多位数进行分开讨论导致代码十分长。
-
解决办法:就是觉得代码怪怪的,就调试当中突然想到这两种情况能不能放在一起做,一开始我分成了两组来讨论一组一个循环,后来我直接将判断个位数那个循环删掉发现不可以做,后来换成嵌套循环就好了。
-
2.当数字已经掉入陷阱,程序却无法退出循环。
-
解决办法:一开始我本来想用数组来存放上一次产生的新数,可是我数组还不够熟练老是调不出来,后来同学建议在增加一个变量来存放上一次产生的数字,就可以正常退出循环了。
7-10 简单计算器
1. 本题PTA提交列表(要提交列表,不是结果)
2. 设计思路(用代码表示扣分)
- 定义两个变量value1,value2表示输入的操作数,定义ch为输入运算符,flag=0;
输入value1输入一个运算符op
for(i=1;i>0;I++){
输入另一个操作数
if(ch'=') break;
if(ch'+'): value1=value1+value2
if(ch'-'): value1=value1-value2;
if(ch''):value1=value1value2;
if(ch'/'): value1=value1*1.0/value2;{
如果value20输出ERROR}
if(ch!='+'&&ch!='-'&&ch!='*'&&ch!='/'):flag=1;
if(flag=0)输出value1的值
3.代码截图(注意,截图,截图,截图。不要粘贴博客上。不用用···语法去渲染)
4.本题调试过程碰到问题及PTA提交列表情况说明。
- 1.我一开始用了另一个变量result来存放value1和value2的运算结果,输出时就连1+2=都不对。
- 解决办法:再次检查代码发现我的操作数和运算符是分开输入的,那么我的前两个运算数所得的结果应该也要参加下一次运算,可是我的程序没有做到这一点,所以我就放弃了result改用value来存放两个运算数的运算成果。
- 2.除法分母为0或有非法运算符时我的程序就不正确了。
- 解决办法:后来改用了if-else语句来讨论上面的情况并且借用了flag来帮助判断,当运算符不是“+ - * /”中的任意一个时让flag=1,其余情况=0,最后用由flag的情况决定输出。
二、截图本周题目集的PTA最后排名。
三、本周学习总结
1.你学会了什么?
1.1 一维数组如何定义、初始化?
- 数组定义形式一般为 类型名 数组名[数组长度],初始化形式一般为 类型名 数组名[数组长度]={初值表},初始化可以只针对部分元素,没有初始化系统默认初始值为0
1.2 一维数组在内存中结构?可画图说明。数组名表示什么?
- 数组名是一个地址常量,存放数组内存空间的首地址。知道了首地址,假设int型占用两个字节,首地址为4010,就可以知道其他数的地址为4012 ,4014.。。。递增。
1.3 为什么用数组?
- 数组可以定义一些具有相同类型的变量并存放他们的值,运用数组可以使表达更简洁,可读性好,便于运用于循环结构。
1.4 介绍选择法、冒泡法、直接插入排序如何排序?伪代码展示.
- 选择法:定义输入数字个数number,i,j,中间变量temp,最小值下标min.定义数组a[i]
for(i=1;i<=number;i++){
min=i;min用于存放最小值所在下标
for(j=1;j<=i;j++){
如果a[i]<a[min] 将a[i]与a[min]中的元素进行交换
输出数组中的元素。 - 冒泡法:定义输入的数字个数number,i,j,中间变量temp,数组a[i]
for(int i=0;i<;i++){
for (int j = array.length - 1; j > i; j--) {
如果a[i]<a[i-1] 交换a[i]和a[i-1]中的元素 - 直接插入排序:定义输入的数字个数number,i,中间变量temp,数组a[i]
for(int i =1;i<number;i++){
temp=a[i];
while(temp<a[i+1]){
判断a[i+1]与a[i+2]是否相等,不相等时结束循环}
temp+a[ia=2];
输出temp.
1.5 介绍什么是二分查找法?它和顺序查找法区别?
- 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。二分查找要求数据从一开始就排好顺序,顺序查找法则是后来排序,而且二分查找法因为是折半查找所以查找次数会比顺序查找少。
1.6 二维数组如何定义、初始化?
- 二维数组的定义形式为 类型名 数组名[行长度] [列长度]。 初始化形式: 类型名 数组名[行长度] [列长度]={{初值表0}'''{初值表k},'''};
1.7 矩阵转置怎么实现?方阵中:下三角、上三角、对称矩阵的行标i列标j的关系?请说明。
- 转置时需设置一个中间变量x,x=a[i][j],a[i][j]=a[j][i];a[j][i]=temp转置即可实现。
对角线上i=j,方阵中下三角:i>=j,上三角:i<=j
对称矩阵:i=j
1.8 二维数组一般应用在哪里?
- 像矩阵这样需要两个参数的问题上吧
2.本周的内容,你还不会什么?
- 对于三种排序方法到底是怎么运用的还是一知半解,选择法还好,其他两种不是特别明白该怎么应用。
- 对于数组的运用也是不熟练,这次的题目就有几题想用数组来做,但是因为变量的定义还有传参问题无法调试正确最终只能放弃这种做法另找出路。
- 老师一直说分析题目时不要只是看着题目给的那几个数据,应该多拿几组数据来分析,就像打印菱形那题,就不可以只看重题目给的数据7而应该再找几个做分析,然后找出他们的排列规律,这个是我目前比较欠缺也积蓄加强的能力。