C语言博客作业--数据类型
一、PTA实验作业
题目1:7-6 掉入陷阱的数字
1. 本题PTA提交列表
2. 设计思路
Begin
int 整型变量N,number提取每个位的数字,sum计算和,i,n,j
输入N
for(i 1 to 10000;i加一){
sum=0; n=N;//引入n,来保留N的值
计算number=N/10;
if(number等于0)//位数为1
则 sum=N*3+1
否则{//位数不是1
for(j 1 to 5;j加一){
number=N%10;
sum=sum+number;
N=N/10;
}
sum=N*3+1
}
if(sum等于n)
输出i:sum
且跳出循环,结束程序
否则
输出i:sum
并使N=sum
}
End
3.本题调试过程碰到问题及PTA提交列表情况说明
- 错误代码
- 正确代码
看到PTA上的错误提示“正常范围多位数,带有0”,就知道不能用while(number!=0)来计算sum
所以就改为了for循环,因为题目是一个小于30000的数,所以最多循环5次
题目2:7-7 发红包
1. 本题PTA提交列表
2. 设计思路
Begin
int 整型变量money,thousand,fifty,twenty,ten,five,two,one
输入money
计算thousand=money/100;
money=money-thousand*100;
计算fifty=money/50;
money=money-fifty*50;
计算 twenty=money/20;
money=money-twenty*20;
计算ten=money/10;
money=money-ten*10;
计算five=money/5;
money=money-five*5;
计算two=money/2;
money=money-two*2;
计算one=money;
输出 100元:thousand张\n
50元:fifty张\n
20元:twenty张\n
10元:ten张\n
5元:five张\n
2元:two张\n
1元:one张
End
3.本题调试过程碰到问题及PTA提交列表情况说明
- 错误代码
- 正确代码
一开始题意没太懂,使用了多重循环的结构,导致了运行出来出来了好多好多结果;题目要求钱的张数最少,所以用表达式就可以解决题目了。
题目3:7-8 判断合法标识符
1. 本题PTA提交列表
2. 设计思路
Begin
int 整型变量num为运算次数,flag=1,count=0为判断条件,i,j,k
char 数组a[79],ch吸收输入num后的回车
输入num
ch吸收输入num后的回车
for(i 0 to num-1;i加一)
{
for(j 0 to 78;j加一)
{
输入数组a[j]
if(j等于回车)break跳出循环;}
if(a[0]是数字)则flag为0
for(k 1 to 78;k加一){
if(a[k]是字母、数字、下划线)则count加一
if(k等于j)则跳出循环}
if(flag不为0且count等于k-1)输出Yes //等于k-1是因为最后的空格也使count加一
if(flag等于0或者count不等于k-1)输出No
使count,flag变为初值,进行下一次循环//count=0;flag=1
}
End
3.本题调试过程碰到问题及PTA提交列表情况说明
- 错误代码
刚开始用的是getchar,但思路写着写着就没了,然后就换用刚学的一维数组来写,是想着数组可以存放多个数据。
刚学数组对它的应用还不熟悉,就一点点的改
改到这的时候就觉得差不多了,看调试窗发现一次循环后没有对判断条件回复初值
- 正确代码
最后说下在打这个题中影响我的地方
1.在输入运算次数num后要回车,但数组是字符型的,就会被数组吸收,用了许多方法才想到用一次getchar把回车吸收
2.在输出Yes,No时的条件也换了好多次,一个条件不够,就再定义一个新的条件来满足
二、截图本周题目集的PTA最后排名。
三、本周学习总结
1.你学会了什么?
- 1.1 一维数组如何定义、初始化?
定义的一般形式:类型名 数组名 [数组长度];
初始化一般形式:类型名 数组名 [数组长度]={初值表};如果是静态存储的数组static没有初始化,系统会自动给所有的数组元素赋0;如果是动态数组static没有初始化,所有的数组元素的值不确定。 - 1.2 一维数组在内存中结构?可画图说明。数组名表示什么?
数组名是一个地址常量,存放数组内存空间的首地址。 - 1.3 为什么用数组?
数组是最基本的构造类型,它是一组相同类型数据的有序集合。在程序中使用数组,可以让一批相同类型的变量使用同一个数组变量名,用下标来相互区分。它的优点是表达简洁,可读性好,便于使用循环结构。 - 1.4 介绍选择法、冒泡法、直接插入排序如何排序?伪代码展示.
- 选择法
Begin
int 整型变量i,k为循环次数,index存放最小值所在的下标,change作为交换变量
输入数组长度n
int 数组a[n]
for(i 0 to n-1;i加一 )
输入数依次赋给 数组a
for(k 0 to n-2;k加一 ){
index放最小值下标k
for(i k+1 to n-1;i加一)//在未排序的数中找到最小值与a[k]交换
if(a[i]<a[index])index等于1
a[k]与a[index]交换
}
依次输出数组a
End
- 冒泡法
Begin
int 整型变量i,k为循环次数,change作为交换变量
输入数组长度n
int 数组a[n]
for(i 0 to n-1;i加一 )
输入数依次赋给 数组a
for (i = 0; i < n-1; i++) {// n个数,n- 1轮冒泡,每一轮都将当前最大的数推到最后
for (j = 0; j < n-1 - i; j++) // n-1- i,意思是每当经过一轮冒泡后,就减少一次比较
if (a[j] > a[j+1])
交换a[j],a[j+1]
}
依次输出数组a
End
- 直接插入法
Begin
int 整型变量i,k,j为循环次数,change作为交换变量
输入数组长度n
int 数组a[n]
for(i 0 to n-1;i加一 )
输入数依次赋给 数组a
for(i 1 to n-1;i加一){
change=a[i]
for(j 0 to i-1;j加一){
if(change小于a[i]){
for(k i-1 to j;k减一){
a[k+1],a[k]交换}
a[j]=change;跳出循环
}
}
}
for(i 0 to n-1;i加一)
输出a[i]
End
- 1.5 介绍什么是二分查找法?它和顺序查找法区别?
二分查找法就是先寻找数组中间位置的数,判断其是否为要寻找的数,不是的话,大于要找的数,则往左继续二分,小于要找的数,则往右二分。
二分查找法适用于排序过的数组,速度快,顺序查找法要遍历数组,在数组很大时效率低,但对数组本身没有要求,适用于短数组 - 1.6 二维数组如何定义、初始化?
定义形式:类型名 数组名 [行长度] [列长度];
初始化有两种形式:
1.分行赋初值
类型名 数组名 [行长度] [列长度]={{初值表0},...,{初值表k},...};
若只对针对部分元素初始化,如果是静态数组,其余元素的初值为0;如果是动态数组,其余元素的初值不确定
2.顺序赋初值
类型名 数组名 [数组长度]={初值表};根据数组元素在内存中的存放顺序,把初值表的数据依次赋给元素
若只对针对部分元素初始化,要注意初值表中的数据的书写顺序 - 1.7 矩阵转置怎么实现?方阵中:下三角、上三角、对称矩阵的行标i列标j的关系?请说明。
for(i 0 to 行长度-1)
for(j 0 to 列长度-1)
if(i小于等于j)
a [i] [j] 和a [j] [i] 交换
主对角线 i==j
上三角 i<=j
下三角 i>=j
副对角线 i+j==N-1(N为行列长度)
- 1.8 二维数组一般应用在哪里?
主要用于表示二维表和矩阵有关的问题。
2.本周的内容,你还不会什么?
- 1.在使用函数引用数组的时候,不清楚怎么调用
- 2.对于排序的几种方法,思路还不太清晰
- 3.数组的下标从0开始,还是有时候没有意识到
- 4.PTA的第八题打了很久,一开始就遇见了很多问题
- 5.查找数字的代码具体还不是很清楚