C语言博客作业04--数组

| 这个作业属于哪个班级 |


| ---- | ---- | ---- |
| 这个作业的地址 |
|这个作业的目标 |学习数组相关内容|
|姓名|王鑫|

0.PTA展示


1.本章学习总结

1.1学习内容总结

1.1.1 数组总共如何查找数据

如果这个数组是按照顺序的我们可以使用二分法查找,这样效率比较高


for(int i=min;i>=0||i<=top;)
{
 min=(top+bott)/2;//每轮把中间值更新
//判断是否为我们需要的数值,并作出相应的变化
  if(date[min]==num)
{
printf("find it!");
break;
}
else if(date[min]<num)
bott=min+1;
else
top=min-1;
}

如果不是顺序排列我们可以用数组一个个找

//设一个循环来做这件事
for(int i=0;letter!='\0';i++)//字符型数组的结尾会自动带上一个'\0',ASCII码为0,所以字符型数组长度要多留一位
{
if(letter[i]==num)
printf("find it");
break;
}

1.1.2数组中如何插入数组

/*先通过对比找到位置也就是下标*/
for int i to n
if date[i]=num
then index=i;
end if
end for 
/* 再把后面的数字一个个往后面移空出一个位置给我们新来的数字*/
for int i=n to index i--//要从最后面开始挪,才能保留住数据不会被覆盖
date[i]=date[i+1];
end 
date[index]=num;/* 最后把我们的数字插进去,这里本来的数字被我们往后面移了,数据就不会被覆盖*/
  • 下面是PTA 上的截图代码

1.1.3数组中如何删除数据

数组中的元素删除和数组中插入数据很像。一个是整体左移,一个是整体右移。

  • 像数组中删除数据就是整体左移,让后面的数据把前面要删除的数据覆盖,就能实现删除。
  • 还有一种方法就是重构数组,这个方法来自老师发布的测试用两个下标控制数组,当我们不需要这个元素时就控制一个小标不动,而另一个变换并赋值给前面下标控制的数组数,来达到删除的方式。也可以再创建一个数组,来放新的数组。
//题目要求是把数组中不符合的空格删除
int i=0,j=0;
while(stri[i]!='\0')//字符型的往往是以'\0'作为结束的标志,也是我们平时很好用的工具
{
if(str[i]!=' ')//当数组中的字符符合不是空格的条件
{
str[j++]=str[i];//我们就把字符移到新的下标,也就是j下标所在的数组数
i++;//要让i++,来判断下一个字符
}
str[j]=0;//结束时要给最后的字符赋上结束标志
}

1.1.4数组中目前学到的排序方法,主要思路

  • 冒泡法小的往上交换,就会让小的像泡泡一样浮上去,就称之为冒泡法。
    主要思路:让数组中相邻的数字进行比较,小的往前移。(如果只是扫描一遍这个数组,只能把最大的放在了最后)我们要再多扫描几遍,扫描到所有数字都在自己的该呆的地方。所以这个交换的过程是一个循环,而每次最大的数字都在最后所以扫描的终点我们要再每次扫描时-1。控制扫描每次都在进行,且终点变化,这时我们就要在外面在设置一个循环来使扫描进行多次。
  • 选择排序法,多次扫描,把大的往后面放,来达到最终的排序
    主要思路:设置一个循环来做扫描的工作,在这个循环外面再套一个循环,使扫描我们想要的次数。

1.1.5数组做枚举用法,有哪些案例

  • 计算某个月的天数
    因为天数和月份有对应关系,可以用二维数组来存放天数,再根据不同的月份找到相应的数字。
int k,keep;
/*数组初始化,将每月的天数赋给数组*/
innt tab[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},
               ={0,31,29,31,30,31,30,31,31,30,31,30,31}};
/*判断闰年,判断year是否为闰年,如果是闰年就让leap=1;不是就让,leap=0*/
/*计算天数*/
for(k=1;k<month;k++)
day=day+tab[leap][k];

1.1.6哈希数组用法,目前学过哪些案例,举例展示

  • 哈希数组是用空间来换取时间,我们查找数据能提高效率。用来查找重复数据很方便。
    哈希数组就是把可能出现的所有的数字作为一个数组的名字,当出现这样的数据就让数组里面+1.到时候再看里面是否为单独数据。超过1就不输出。

1.1.7字符数组、字符串特点及编程注意事项

  • 字符型数组的结尾会加上'/0',所以我们要把字符型数组的长度要比原来的长度+1;
  • 因为结尾是'/0',所以我们字符型的数组做循环的结束条件,就可以把结束的条件设为不为0;
  • 数组的名字是数组的首地址,传地址时可以传数组名,这时的数组代表的数字是数组第一个,下标为0的。
  • 可以用不同的的输入和输出,scanf("%s",date),fges(date,n,stdin),(gets VS 不能通过);但scanf不能接受空格,已有空格就会停下。
  • fgets()读取到的换行符、文件尾或读完n-1个字符结束,包括换行符。

2PTA实验作业

2.1 数组循环左移

2.1.1伪代码

//先观察数据的类型需要什么样的变量,然后设置相关的变量
总数  n,
左移的位置的下标 m,
存放数组 a[100]
//我们把需要的数据输入进来
输入  n,m,a[];
for i to n  //先把数组我们要移动的移到后面去
a[n+i]=a[i];

for i=m(我们初始移动的) to n+m(移动后我们的总长度)//把整个数组往前移
a[i-m]=a[i];
//最后输出前面n个数组中的数据

2.1.2代码截图

2.1.3代码对比



我的代码:for循环有点多,没封装使得有点乱。想法会更直接,粗暴。这样在别的地方就要重新更改代码。我是先把要移动的次数往前移动数组,这样花费的空间会更大,所以使用时还要多留一些空间。
别人的代码:函数封装,界面简洁,这种可以用的范围更广,分成小的步骤,多次循环就可以让思路清晰,可以用到别的地方。

2.2鞍点

2.2.1伪代码

//先观察应该会有的变量
/*根据题目要求,我们要设置一个代表矩阵行列数的n,我们会运用到最大值,最小值还有两个下标*/
输入:n,num[6][6];
//判断行最大的数值,记住下标(因为下标有两个,所以设置两个循环来分别控制两个下标
for i to n 
for j to n//这个循环就可以找到我们这一行的最大值
如果num[i][j] 大于max
//记住下标
index1=i;
index2=j;
max=num[i][j];
end if
end for// 这时找到这一行的最大值,我们要去找最大值这一列的最小值是不是它自己
min=max;// 赋值给最小值
for p to n
如果 num[p][index2] 小于min
min附上num[p][index2]的值
end if
end for
如果 min=max
输出两个下标 index1 和index2 
end if
没有等于就输出 NONE;
end for// (最开始控制数组行下标的)

2.2.2代码截图

2.2.3和超星视频的区别,各自优缺点

我的代码:有的地方可以实行跳出,减少不必要的循环时间和资源浪费。变量比较多和复杂。
超星:代码简洁清晰,使用break来跳出循环,减少不必要的时间浪费。用循环全部完成时变量满足条件,来看是否找到鞍点,和前面使用break结合,可以判断是否能找到鞍点。

2.3切分表达式

这题我测试点有一个一直过不去,去看了视频。

2.3.1伪代码

if str[i]是'('')''*''/'
直接输出和换行
if str[i]是数字和小数点
if 后一位是数字和小数
输出,不换行
else:
输出+换行


if str[i]是'+''-'
if i==0或前一位是'(':
输出不换行
else:
输出换行

2.3.2代码截图

{{uploading-image-656361.png(uploading...)}}

posted @ 2020-12-13 22:29  兴亡  阅读(131)  评论(0编辑  收藏  举报