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)函数循环调用(递归方法)

posted @ 2019-11-17 22:43  泗汐  阅读(225)  评论(0编辑  收藏  举报