C博客作业04--数组
| 这个作业属于哪个班级 | C语言--网络2011/2012 |
| ---- | ---- | ---- | ---- |
| 这个作业的地址 | C博客作业04--数组 |
| 这个作业的目标 | 学习数组相关内容 |
| 姓名 | 梁桢 |
0.展示PTA总分(0----2)
1.本章学习总结(3分)
1.1 学习内容总结
数组中如何查找数据
- 遍历数组查找
- 特点:从第一个判断最后
#include<stdio.h>
int main() {
int n;
int i;
int m;
int k = 0;
int flag = 0;
scanf("%d", &n);
scanf("%d\n", &m);
int a[20];
for (i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
for (i = 0; i < n; i++)
{
if (a[i] == m)
{
k = i;
cnt++;
break;
}
}
if (k > 0 && flag)
{
printf("%d", k);
}
else if (flag)
{
printf("0");
}
else
{
printf("Not Found");
}
return 0;
}
- 二分查找
- 特点:在一组从小到大的数组中从中间进行比较比一次数据少一半,数据比较大时更能体现好处。
例子:二分查找
int BinSearch(int* a, int n, int key, int* count)
{
int loca = 0;
int top = n - 1;
int bot = 0;
int min;
while (loca == 0 && top >= bot)
{
*count = *count + 1;
min = (top + bot) / 2;
if (*(a + min) == key)
{
loca = min;
return loca;
}
else if (key < *(a + min))
{
top = min - 1;
}
else bot = min + 1;
}
if (bot >= top)
{
loca = -1;
return loca;
}
}
3.哈希查找
- 建立一个哈希数组按ASCII码表排序的。都赋值为0。
- 读取数组的时候把数据对应哈希数组的标识符修改
- 输出的时候按哈希数组的标识符进行输出
举例:A-B
int haxi[256];
if(和哈希中相同)
haxi[a[]]++;
/*这题可以用但是我没用,我太废物了*/
1.2 数组中如何插入数据
- 插入数据前要可以把数据全后移一位。
- 或者把插入的数据放最后在与前面的交换
例子:简化的插入排序
#include <stdio.h>
int main()
{
int n;
int k;
int i;
int temp;
int a[11];
scanf("%d\n", &n);
for (i = 0; i < n; i++)
{
scanf("%d ", &a[i]);
}
scanf("\n");
scanf("%d", &a[i]);
for (i = 0; i < n ; i++)
{
if (a[n] < a[i])
{
temp = a[n];
a[n] = a[i];
a[i] = temp;
}
}
for (i = 0; i <= n; i++)
{
printf("%d ", a[i]);
}
return 0;
}
1.4 数组中如何删除数据
- 删除数组之后将数组左移,重排列一次数组。再进行下一次删除
- 另一种可以用标识符来标记是否输出。
#include <stdio.h>
int main() {
int i;
int j;
int n;
int k;
int flag = 0;
int a[100] = { 0 };
int del;
scanf("%d\n", &n);
for (i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
scanf("\n");
scanf("%d\n", &k);
for (i = 0; i < k; i++)
{
scanf("%d", &del);
for (j = del - 1; j < n; j++)
{
a[j] = a[j + 1];
}
}
for (i = 0; i < n - k; i++)
{
if (!flag)
{
printf("%d", a[i]);
flag++;
}
else
{
printf(" %d", a[i]);
}
}
return 0;
}
1.5数组中目前学到排序方法
- 冒泡法排序
- 思路:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们。
- 也就是只需处理两个元素,就完成了对N个数的排序。
例子:冒泡法排序
#include <stdio.h>
int main()
{
int n;
int k;
int i;
int j;
int flag = 0;
int temp;
int a[100];
scanf("%d %d\n", &n, &k);
for (i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
for (j = 0; j < k; j++)
{
for (i = 0; i < n - 1 - j; i++)
{
if (a[i] > a[i + 1])
{
temp = a[i];
a[i] = a[i + 1];
a[i + 1] = temp;
}
}
}
for (i = 0; i < n; i++)
{
if (!flag)
{
printf("%d", a[i]);
flag++;
}
else
{
printf(" %d", a[i]);
}
}
return 0;
}
- 选择法排序
- 把一堆数据从小到大排序。
例子:选择法排序
#include<stdio.h>
main()
{
int a[10], n,i,j,k,temp;
scanf("%d",&n);
for (i = 0; i < n; i++)
{
scanf("%d",&a[i]);
}
for (i = 0; i < n - 1; i++)
{
k = i;
for (j = i + 1; j < n; j++)
{
if (a[j] > a[k])
{
k = j;
}
}
if (k != i)
{
temp = a[k];
a[k] = a[i];
a[i] = temp;
}
}printf("%d",a[0]);
for (i = 1; i < n; i++)
{
printf(" %d",a[i]);
}return 0;
}
1.6数组做枚举用法
查找整数
选择排序法
找鞍点
删除重复数据
1.7字符数组、字符串特点及编程注意事项。
读取字符串
- scanf("%s",&a);
- 其结尾为'\0'。
- fgets函数能接收带空格的字符串。
- 其结尾为'\n''\0',若不够则没有'\n'
2.PTA实验作业(7分)
2.1 7-7 数组循环左移(3分)
题目:
2.1.1 伪代码
我的:
m = m % n;
scanf(整个数据);
int一个数组;
for(i = m;i < n ;i++)
printf数组;
for(i = 0;i < m ;i++)
printf数组;
/*实际上我没改变数组的顺序,值改变了输出的顺序*/
同学的:
m = m % n;
int两个数组;
scanf(m个数据到第一个数组);
scanf(剩下的到数组b);
把第一个数组输到b中;
for(i = 0;i < n ;i++)
printf数组;
2.1.2 代码截图
我的:
2.1.3 找一份同学代码(尽量找思路和自己差距较大同学代码)比较,说明各自代码特点。
同学的:
2.2 找鞍点(2分)
题目:
代码截图
鞍点这介绍二维数组。并说明和超星视频做法区别。
- 区别:思路有些相似,都是找行列符合条件的并记录。
- 超新星中的代码用函数把代码进行了分装,增强了代码的可读性,并且使主函数更加易懂整洁。
2.2.1 伪代码
定义二维数组;
读入n和数组;
for找出第一行的最大值
for判断是否为每列最小值
符合条件就修改标识符令其鞍点输出
若都不符合啧标识符没修改即无鞍点就输出NONE
2.3 切分表达式——写个tokenizer吧(2分)
2.3.1 伪代码
for+if判断是否为数字或.是则直接输出并判断下一位来是否printf("'\n'");
否则判断是否为加减,加减需判断是否printf("'\n'");
若是首个或者上一个括号则不printf("'\n'");
2.3.2 代码截图
2.3.3 请说明和超星视频做法区别,各自优缺点。
- 区别:思路不太相同,我自己的代码是将-和+进行判断,而超星中是对小数点、括号等分开进行判断。超新星中的代码用函数把代码进行了分装,增强了代码的可读性,并且使主函数更加易懂整洁。