C语言博客作业04--数组
0.展示PTA总分
一维数组
二维数组
字符数组
1.本章学习总结
1.1 学习内容总结
数据查找(顺序查找)
定义数组a
int i,j;
输入所需查找的数x
for i=0 to n-1 do
if(a[i]==x) return 1;//找到
end for
if(i==n)
return -1;//未找到
数据查找(二分法查找)
函数引用查找数据
定义数组a
int min,max,mid;
输入所需查找的数x
wile(min<=max)
取中间数a[mid]
if(x>a[mid])
min=mid+1;//左区间改变
if(x<a[mid])
max=mid-1;//右区间改变
if(x==a[min]
找到数return mid;
end while
return -1//找不到
数据插入
int index,loc,i,number,a[N];
for index=1 to n-1 do
number=a[index]//插入的数
for i=0 to index-1 do
查找插入位置loc
end for
for i=index to loc+1 do
右移a[i]=a[i-1]//移动数组
end for
a[loc]=number//插入数组
end for
数据删除
int a[N],i,j,deleteNumber,n,index;
for i=0 to n-1 do
if(deleteNumber==a[i])
index=i;
for j=index to n-1 do
a[j]=a[j+1];
end for
end for
数组排序(选择排序法(从小到大))
int i,j,minIndex,a[N],temp;
for i=0 to n-2 do
minIndex=i;
for j=i to n-2 do
if(a[j]<a[minIndex])
temp=a[minIndex];
a[minIndex]=a[j];
a[j]=temp;//交换
end for
end for
数组排序(冒泡法排序(从小到大))
引用函数void BubbleSort(int a[],int n)
int temp,i,j;
for i=0 to n-2 do
for j=0 to n-i-2 do
if(a[j]>a[j+1])
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;//交换
end for
end for
查找是否有重复数据(哈希数组)
int FindDuplicate(int n)
int i;
int data;
int static hash[N];
fori = 1 to n do
输入数据data
if(hash[data]==1)
return 1;//第二次出现数据,有重复
else
hash[data]=1;//第一次出现数据赋值1
end for
return 0;//没有重复数据
1.2 本章学习体会
这两周通过对数组的学习,对数组的用法有了大致了解,但对静态数组的应用(例如哈希数组)还是有一定的模糊感,感觉遇到同类问题可能会应用,但若转变题型可能只有一定的思路但不知道如何表达。
对数组移动,删除等了解了多种方法,希望能有具体例题,加深印象。
周 | 代码量 |
---|---|
11、12 | 1211 |
2.PTA实验作业
2.1 题目名1:7-6 阅览室
2.1.1 伪代码
定义二维数组储存三列数据
输入所要查询的天数
for i = 1 to day do
按行输出所要处理的数据
scanf("%d %c %d:%d", &bookNumber, &op, &hour, &minute);
调用函数处理数据
end for
分装函数处理
定义借阅次数count
定义平均借阅时间average
for i = 0 to k do
if (a[i][1] == 'S')//表示借书
forj = i + 1 to k do
if (a[j][0] == a[i][0] && a[j][1] == 'S')//判断是否有重复借同一本书
if ( a[j][0] == a[i][0] && a[j][1] == 'E' )//判断是否有还书记录
若有count自增,平均时间增加
end for
end for
if (count == 0)//无借书记录
else//有借书记录
2.1.2 代码截图
2.1.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
1 130 | 正常数据(同一本书被借多次,有不匹配) | |
正常数据 |
2.1.4 PTA提交列表及说明
1.运行超时: 未考虑输入时bookNumber==0时结束输入导致死循环
2.部分正确:忽略舍弃小数点输出(%.0f)
3.部分正确:未考虑同一本书借多次的情况(当检测到字符S时使用循环查找是否有同一书号再次被借的输入情况)
2.2 题目名2:7-7 jmu-c-大数加法
2.2.1 数据处理
定义一维字符数组存放待相加两数firstNumber,secondNumber
定义一维数组存放两数相加之和sum
while getchar!=’\n’输入firstNumber和secondNumber
len1、 len2=’\0’//表示字符串输入结束
if (len1 > len2)//若第一个字符串更长
j=len2;
differ = len1 - len2;//计算firstNumber和secondNumber相差位数differ
for i = len1 - 1 to 0 do
j=j-1;
if (i >= differ)
secondNumber[i] = secondNumber[j];//将最后一位对其
secondNumber[i] = '0';//补齐较短数列前面空值置为0
len = len1;//sum数组长度赋值
end for
if (len1 <= len2)
j=len1;
differ = len1 - len2;//计算firstNumber和secondNumber相差位数differ
if (i >= differ)//判断两数是否相等
for i = len1 - 1 to 0 do
firstNumber[i] = firstNumber[j];//将最后一位对其
firstNumber[i] = '0';//补齐较短数列前面空值置为0
len = len2;//sum数组长度赋值
end for
for i = 0 to len do//将a,b转为数值运算后存入c
sum[i] = (firstNumber[i] - '0') + (secondNumber[i] - '0');
end for
for i = len - 1 to >= 0 do//判断是否进位c[0]不进位
if(c[i]>9)
c[i]=c[i]-10;
c[i-1]=c[i-1]+1;
end for
输出c[i]
2.2.2 代码截图
2.2.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
两数据长度不同 | ||
长度相同进位 | ||
长度相同不进位 |
2.2.4 PTA提交列表及说明
1.多种错误:
(1)循环判断范围错误,范围小于数组长度(更改范围)
(2)两数组对应位置错误
(3)两数据长度相等时未考虑
2.部分正确:数组长度不同时未把空位赋值‘0’而赋值0导致错误(为字符数组)
3.部分正确:变量表达错误
2.3 题目名3:7-3 字符串转换成十进制整数
2.3.1 数据处理
定义字符数组str、str2
定义flag = 0;//判断十六进制前是否有负号
while 输入数组str[i]
str[i] = '\0';
for i = 0 str[i] != '\0' do//找出第一个第一个十六进制数的下标
Index2 = i;//记录下标
end for
for i = 0 str[i] != '\0' do//若有负号找出第一个负号的下标
Index1 = i;//记录下标
end for
if (Index1 < Index2)//判断负号是否在第一个十六进制数前
flag = 1;//在第一个十六进制数前
for i = 0 str[i] != '\0' do//筛选出符合十六进制的数存入str2中
str2[k++] = str[i];
end for
分装函数将十六进制转为十进制
for i = 0 to k do
if (str2[i] >= '0' && str2[i] <= '9')
sum = sum * 16 + str2[i] - '0';
if (str2[i] >= 'a' && str2[i] <= 'f')
sum = sum * 16 + str2[i] - 'a' + 10;
if (str2[i] >= 'A' && str2[i] <= 'F')
sum = sum * 16 + str2[i] - 'A' + 10;
end for
if (flag == 1)//为负数
sum = -sum;
return sum;
2.3.2 代码截图
2.3.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
+-P-xf4+-1!# | -3905 | 正常数据(两个负号) |
-zyzx-t# | 不输出 | 数据被过滤(不符合十六进制数) |
abFcD# | 704461 | 无符号有大小写数据 |
2.3.4 PTA提交列表及说明
1.部分正确:(中间过程错误挺多都在在vs中调试)
(1)没理解题意是在在第一个十六进制数前的负号才有效
(2)没考虑字符被全部过滤不输出的情况
(3)一开始对负数如何表达处理没思路(添加flag变量判断是否要负值)
3.阅读代码
值得学习之处:
(1)有预先验算想好思路找好规律后进行编程
(2)函数循环调用(递归方法)