C语言博客作业--数据类型
一、PTA实验作业
题目1:打印菱形图案
1. 本题PTA提交列表
2. 设计思路
定义整型变量n存放输入总行数,i控制部分行数,j控制空格数量,k控制'*'数量,half存放中间行数,划分上下部分
输入一个奇数n
half=(n+1)/2;//half存放中间行数,用来划分上下部分
如果(n!=1)
上半部分:
i=1;i<=half;i++
j=n-2*i+1;j>=1;j--,输出空格
k=1;k<=2*i-1;k++,输出‘*’
换行
下半部分:
i=1;i<=(n-1)/2;i++
j=1;j<=2*i;j++,输出空格
k=n-2*i;k>=1;k--),输出‘*’
如果(i!=(n-1)/2)则换行,最后一行不再换行
否则 输出"* "
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明。
部分正确:这题上半部分规律很快就找到图形也输出正确了,但是下半部分调试了好久才做出来。比照了上次做的那道不完全相同的菱形题,但是上次那题的下半部分也没有完全理解清楚,一直找不到下半部分空格数和行数的规律。想接着上面的行数按对称找规律结果一直输出成,后来下半部分i从1开始结果输出成
少了一个空格,j改成从1开始答案对。
题目2:掉入陷阱的数字
1. 本题PTA提交列表
2. 设计思路
定义变量one存放个位数的数值,N为输入数据,sum为各位数之和,a存放前一个数,i存放第几个数,number存放运算后结果
输入N
i=1;i!=0;i++
a=N备份N
while(N)
one=N%10;先取出个位
N=N/10;再划掉个位
sum+=one;最后求各位累加和,循环直到N为0
number=sum*3+1;操作产生的新数字number
输出第几个数和运算后结果
if(number==a),退出循环
N=number;//新一轮N为number
sum=0使其初始化
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明。
一开始这样写输出结果不对,调试发现大循环这样判断有问题,询问同学后改成for语句的循环,先判断完两数是否相同,相同则退出循环,不同则给N赋新值的思路。
题目3:切分表达式——写个tokenizer吧
1. 本题PTA提交列表
2. 设计思路
定义数组长度,为41!
定义i,j控制循环
定义item存放下标i的值
gets(ch); //输入字符串
for(i=0;ch[i]!='\0';i++){
if(ch[i]>='0'&&ch[i]<='9'){ //是数字时
tem=i; //储存下标i的值
while('0'<=ch[i]&&ch[i]<='9'||ch[i]=='.')i++;
for(j=item;j<i;j++)printf("%c",ch[j]);//可连续输出数字!
i--;
输出完最后一个数字后换行
else if(ch[i]=='-'){//'-'时
if('0'<=ch[i-1]&&ch[i-1]<='9'||ch[i+1]=='('){
printf("%c\n",ch[i]);} //减号
else printf("%c",ch[i]);} //负号
else if(ch[i]=='+') { //'+'时
if(i==0)printf("%c",ch[i]); //第一个符号为‘+’,一定为正号
else printf("%c\n",ch[i]); } //加号
else{printf("%c\n",ch[i]);//输出括号
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明。
写了好几个小时的这个代码(错误)在检验的时候换行还是有问题,PTA总是显示多种错误很崩溃,实在是不太会,最后上网找了答案。一开始只知道这个循环(如下图)大概的目的是实现多个数字的连续输出,一步步调试发现i++在统计有几个数字并输出,方法特别巧妙。提交代码最后一个测试点还是不过,问了班级大佬直到问题在数组长度的定义上,长度上界要到41否则ch[i+1]就无法判断,越界很危险,上界定义应该要大些。(注意!),修改后终于通过。
二、截图本周题目集的PTA最后排名。
三、本周学习总结
1.你学会了什么?
1.1 一维数组如何定义、初始化?
- 定义:数组类型 数组名[数组长度];数组长度是一个常量
- 初始化:类型名 数组名 [数组长度]={初值表},例如inta a[10]={1,2,3,4,5,6,7,8,9,10};特别的,静态存储的数组如果没有初始化,系统自动给所有的数组元素赋0
1.2 一维数组在内存中结构?可画图说明。数组名表示什么?
- 数组名是一个地址常量,存放数组内存空间的首地址
1.3 为什么用数组?
- 在程序中使用数组,可以让一批相同类型的变量使用同一个数组变量名,用下标来互相区分,他的优点是表达简洁,可读性好,便于数据的重用。
1.4 介绍选择法、冒泡法、直接插入排序如何排序?伪代码展示.
-
选择法:
1.int a[n];//先给数组赋值,数组长度为n
2.for(k=0;k<n-1;k++) index=k;最小值下标为k循环第三步
3.for(i=k++;i<n;i++)循环第四步
4.如果a[i]小于最小值,则最小值与下标为k的值交换
5.输出数组 -
冒泡法:两两比较待排序的数,发现两个次序相反即进行交换,直到没有反序为止。
1.定义变量int a[10],i,j,k
2.for(i=0;i<10;i++) 依次输入数据存入数组
3.for(i=0;i<9;i++) 循环第四步
4.for(j=0;j<10-i;j++)循环
5.if(a[j]>a[j+1]) 则交换这两个数即k=a[j];a[j]=a[j+1];a[j+1]=k;
6.for(i=0;i<10;i++) 依次输出a[10]中每个数 -
直接插入法:
1.先给数组赋值,n为数组长度
2.for(k=0;k<n-1;k++) index=k;最小值下标为k循环第三步
3.for(i=k++;i<n;i++)循环第四步
4.如果a[i]小于最小值,则最小值与下标为k的值交换
5.输出数组
1.5 介绍什么是二分查找法?它和顺序查找法区别?
-
二分法:
1.确定该区间的中点位置
2.将待查的K值与a[mid]比较
3.若相等,则查找成功
4.若a[mid]>K,则新的查找区间是a[1-(mid-1)]
5.若a[mid]<K,则新的查找区间是a[(mid+1)-n] -
顺序查找:从表的一端开始,顺序扫描线性表,依次将扫描到的结点关键宇和给定值K相比较。若当前扫描到的结点关键字与K相等,则查找成功;若扫描结束后,仍未找到关键字等于K的结点,则查找失败。
-
区别:当查找数列是有序的话,使用二分查找法可以极大的减少搜索时间,提高效率;顺序查找法可以查找无规律的数列,但是需要耗费大量的时间和内存逐个搜索关键词。
1.6 二维数组如何定义、初始化?
- 定义:二维数组定义的一般形式是: 类型说明符 数组名[常量表达式1][常量表达式2],其中常量表达式1表示第一维下标的长度,常量表达式2 表示第二维下标的长度。(行列)
- 初始化:二维数组初始化也是在类型说明时给各下标变量赋以初值。二维数组可按行分段赋值,也可按行连续赋值。
1.7 矩阵转置怎么实现?方阵中:下三角、上三角、对称矩阵的行标i列标j的关系?请说明。
矩阵转置:以主对角线为对称轴,将所有元素互换位置
-
//求a的转置矩阵,结果存于b中。
int i,j;
int a[c][d], int b[d][c];//c,d为任意值
for(i = 0; i <c; i ++)
for(j = 0; j < d; j ++)
b[j][i] = a[i][j];//转置运算。 -
下三角:i>=j
-
上三角:i<=j
-
对称矩阵:i==j
1.8 二维数组一般应用在哪里?
- 二维数组一般应用在二维表和矩阵中.
2.本周的内容,你还不会什么?
- 对输入一串字符,字符切分或者算字符个数的题不熟悉,这类型的题经常要写好几个小时,思路不清晰,可能还需要多写一些这类题来熟悉套路
- 数组运用还是不太熟练,这周的PTA题目有的开始想要用数组写,但是写着写着经常进入死循环又找不到错误,又换成不用数组的方式写
- 位运算符还不熟悉,每次都要看书参考
- 二维数组和函数的调用还不熟悉,课堂上的互动那题函数调用了过多变量,效率低
- 解题的时候速度很慢,思路不清晰,考试的时候时间掌握不好,写不完题目,并且对于选择基础题的很多知识点很模糊,需要好好熟悉掌握知识点
- 对于数组的三种排列方法还不是特别理解
- 刚接触不太会写伪代码