数组
这个作业属于哪个班级 | C语言--网络2011/2012 |
---|---|
这个作业的地址 | C博客作业04--数组 |
这个作业的目标 | 学习数组相关内容 |
姓名 | 王小雨 |
目录 | |
0.PTA展示 | |
1.本章学习总结 | |
1.1学习内容总结 | |
1.1.1 数组总共如何查找数据 | |
1.1.2数组中如何插入数组 | |
1.1.3数组中如何删除数据 | |
1.1.4数组中目前学到的排序方法,主要思路 | |
1.1.5数组做枚举用法,有哪些案例 | |
1.1.6哈希数组用法,目前学过哪些案例,举例展示 | |
1.1.7字符数组、字符串特点及编程注意事项 | |
2PTA实验作业 | |
2.1 数组循环左移 | |
2.1.1伪代码 | |
2.1.2代码截图 | |
2.1.3代码对比 | |
2.2鞍点 | |
2.2.1伪代码 | |
2.2.2代码截图 | |
2.2.3和超星视频的区别,各自优缺点 | |
2.3切分表达式 | |
2.3.1伪代码 | |
2.3.2代码截图 |
0.展示PTA总分
1.本章学习总结
1.1学习内容总结
1.1.1查找数据用二分法
int mid;
int low,high; //low为左界,high为右界
while(high>low) //high一直减小,low一直增大,当high<low时,说明没找到
{
mid=(high+low)/2;
if(a[mid]>key) //key为要查找的数
high=mid-1; //把右界改成mid前的一个数
else if(a[mid]<key)
low=mid+1; //把左界改成mid后的一个数
else
return mid; //说明找到了 key=mid
}
if(high==low)
{
if(a[high]==key)
return high; //找到了
else
return 0; //没找到
}
1.1.2顺序查找
int flag=0;
for(i=0;i<N;i++)
{
scanf("%d",&a[i]);
if(a[i]==X)
{
printf("%d",i);
flag=1; //找到了
}
}
if(flag==0)
printf("Not Found"); //所有数都查完了都没相等的,所以没找到
1.1.3数组中插入数据
伪代码
/*先通过对比找到位置也就是下标*/
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;/* 最后把我们的数字插进去,这里本来的数字被我们往后面移了,数据就不会被覆盖*/
for(i=0;i<N;i++) //按从小到大排列的一组数据
{
if(X<a[i]) //找到恰好比X大的a[i]
{
for(j=N;j>i;j--)
{
a[j]=a[j-1]; //从a[j]最后一项到a[i]都向后移一位
}
break;
}
}
a[i]=X; //把X放在a[i]的位置
pta代码截图
1.1.4数组中删除数据
可以通过把不删除的数据放到另一个数组中
也可以通过每删除一个数据后把其他数据左移一位
for(i=0;i<k;i++)
{
scanf("%d",&x); //x为要删除的第几个数
loc=x-1; //loc记住这个位置(eg:x为3,则要删除的是a[2],所以数组的下标是x-1)
for(j=loc;j<n-1;j++)
{
a[j]=a[j+1]; //数据左移
}
}
pta代码截图
伪代码
//题目要求是把数组中不符合的空格删除
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.5排序方法有:
选择排序
(思路:在一组数中选出最大的数和第一个位置的数交换,再在剩下的数中选出最大的数和第二个位置的数交换,直到第n-1个数和第n个数比完为止)
for(i=0;i<n-1;i++)
{
max=i;
for(j=i;j<n;j++)
{
if(a[j]>a[max])
max=j;
}
temp=a[max];
a[max]=a[i];
a[i]=temp;
}
冒泡排序
(思路:按从小到大顺序排列的话,通过相邻两个元素比较交换,每扫描一次,当前数列的最大值就被存放到当前数列最后一位)
for(i=0;i<K;i++) //外层循环表示扫描次数
{
for(j=0;j<N-1;j++) //内层循环表示交换次数
{
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
1.1.6哈希数组
哈希数组就是把可能出现的所有的数字作为一个数组的名字,当出现这样的数据就让数组里面+1.到时候再看里面是否为单独数据。超过1就不输出。
1.1.7字符数组
字符串:一个特殊的一维字符数组
注:
·字符串结束符'\0'=0 字符串遇'\0'结束,'\0'之后的其他数组元素与该字符串无关,为随机值
·字符串需要用一维数组存储
·数组长度>=字符串的有效长度+1
·输出字符串的循环条件:s[i]!='\0'或si
·字符串的输入:
while((str[i]=getchar())!='\n')
i++;
str[i]='\0'; 加入输入结束符
fgets函数输入:
形式:fgets(a,10,stdin) (a为数组名,10为数组长度,stdin为标准输入流,固定)
循环条件须设置为:for(i=0;a[i]&&a[i]!='\n';i++)
2.0 PTA实验作业
2.1 数组循环左移
2.1.1伪代码
移动距离m,数组长度n,
数组下标i,j,
数组a[200],
for i 100 to 100+n输入到数组后半段
for i 100+m to 100+n do
i++,j++,a[i]-<a[j]
for i 100 to 100+m do
a[i]-<a[j]
输出
2.1.2代码截图
2.1.3代码对比
我的代码用了个偷机的办法,将一个数组当成两个用,省去了移动数组
同学的代码函数封装,思路清晰,页面简介明了
2.2找鞍点
2.2.1伪代码
输入: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跳出循环,节省时间
2.3切分表达式
2.3.1伪代码
for(i=0; str[i]!='\0';i++)
if str[i] 是数字或小数点
输出str[i]
if str[i+1]不是数字,不是小数点
输出换行符
else
if str[i]为'+'或'-'
if str[i-1]为'('或i=0
输出str[i]
else 输出str[i]和换行符
else 输出str[i]和换行符
end for
2.3.2代码截图
2.3.3代码对比
超星代码用函数封装,简洁清晰,用continue提前结束循环,节省时间