这个作业属于哪个班级 | C语言--网络2011/2012 |
---|---|
这个作业的地址 | C博客作业04--数组 |
这个作业的目标 | 学习数组相关内容 |
姓名 | 廖浩轩 |
0.展示PTA总分
1.本章学习总结
1.1 学习内容总结
数组中如何查找数据,有哪些做法
顺序查找:不需要排序,遍历所有数组元素,查找时间较长。
二分法查找:需要对所有数据进行排序,适合顺序结构。因为每次都是和中间值比较,如果大于选中间值后面的部分继续二分查找,如果小于中间值则选前面的部分继续执行。例如:
#include <stdio.h>
#define M 10
void main()
{
static int a[M]={-12,0,6,16,23,56,80,100,110,115};
int n,low,mid,high,found;
low=0;
high=M-1;
found=0;
printf("Input a number to be searched:");
scanf("%d",&n);
while(low<=high)
{
mid=(low+high)/2;
if(n==a[mid]) {found=1;break;}
else if(n>a[mid]) low=mid+1;
else high=mid-1;
}
if(found==1) printf("The index of %d is %d",n,mid);
else printf("There is not %d",n);
}
分块查找:需要按照数值大小进行排序分块,虽然每个块中的大小可以不排序,但是块的取值区间是排序的。
数组中如何插入数据,怎么做,可以写个伪代码或动态图展示方法
例如在一个由小到大排好序的数列中插入一个数值:
#include <stdio.h>
int main()
{
int a[11];
int i, k, x;
printf("请您输入一个数组中的10个数字:
");
for (i = 0; i <= 9; i++)
{
scanf("%d", &a[i]);
}
printf("请您输入一个要插入的数字:
");
scanf("%d", &x);
for (i = 0; i <= 9; i++)
{
if (x < a[i]) //找到第一个比x大的数据
break;
}
k = i; //跳出来记住位置
for (i = 9; i >= k; i--) /*自第k个数据之后的所有数据后移*/
{
a[i + 1] = a[i];
}
a[k] = x; //将x插入一定要在for循环外面,在里面会把后面的数据覆盖
for (i = 0; i <= 10; i++)
{
printf("%d ", a[i]);
}
return 0;
}
数组中如何删除数据,这个有多种做法,请一一展示
方法一:对原数组进行对应删除
#include<stdio.h>
#define N 10
void main()
{
int a[N], num, i, n = N;
int j;
/*输入N个数到数组中;*/
for (i = 0; i < n; i++)
{
scanf(" %d", &num);
a[i] = num;
}
/*在数组a中删除指定的zhi数num;*/
for (i = 0; i < n; i++)
{
if (a[i] == num)
{
//a[i]=a[n];//如果不保留原数组里的顺序,此一句即可代替下边2行语句,同时省掉变量j
for (j = i; j < n - 1; j++)
{
a[j] = a[j + 1];
}
n--;
}
}
/*输出删除了num后的数组a;*/
for (i = 0; i < n; i++)
{
printf("%d ", a[i]);
}
getchar();
}
方法二:建立新数组
#include <stdio.h>
#define SIZE 100
int deleteData(int*, int, int);
int main()
{
int n = 10;
int i, j, locate;
int a[SIZE] = { 12,15,79,4,6,52,16,1,9,19 };
for (j = 0; j < n; j++)
{
printf(" %d", a[j]);
}
printf("
请输入数组a[10]需要删除的元素位置序号:");
scanf("%d", &locate);
n = deleteData(a, n, locate);
for (i = 0; i < n; i++)
{
printf(" %d", a[i]);
}
printf("
");
return 0;
}
int deleteData(int arr[], int len, int loc)
{
int i = loc;
while (i < len - 1)
{
arr[i] = arr[i + 1];
i++;
}
len--;
return len;
}
数组中目前学到排序方法,主要思路?
冒泡排序法:对数组进行多次的扫描并排序,所需时间长
#include<stdio.h>
int main() {
int i;
int j;
int n;
int num[100];
int k;
int temp;
scanf("%d %d", &n,&k);
for (i = 0; i < n; i++)
{
scanf("%d", &num[i]);
}
for (i = 0; i < k; i++)
{
for (j = 0; j < n; j++)
{
if (num[j] < num[j - 1])
{
int temp = num[j - 1];
num[j - 1] = num[j];
num[j] = temp;
}
}
}
for (i = 0; i < n; i++)
{
if (i != 0)
{
printf(" ");
}
printf("%d", num[i]);
}
return 0;
}
选择排序法:选择出需要排序的数组中的数据对其进行排序,所需时间短
#include<stdio.h>
int main() {
int i;
int j;
int n;
int num[10];
int temp;
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%d", &num[i]);
}
for (i = 0; i < n-1; i++)
{
for (j = 0; j < n-i-1; j++)
{
if (num[j] < num[j + 1])
{
temp = num[j];
num[j] = num[j + 1];
num[j + 1] = temp;
}
}
}
for (i = 0; i < n; i++)
{
if (i != 0)
{
printf(" ");
}
printf("%d", num[i]);
}
return 0;
}
数组做枚举用法,有哪些案例?
PTA题目:调查电视节目受欢迎程度,查找整数等,附上查找整数的代码
#include<stdio.h>
int main() {
int i;
int n;
int num[20];
int X;
int temp=0;
scanf("%d %d", &n,&X);
for (i = 0; i < n; i++)
{
scanf("%d", &num[i]);
}
for (i = 0; i < n; i++)
{
if (num[i] == X)
{
printf("%d", i);
temp = 1;
}
}
if (temp == 0)
{
printf("Not Found");
}
return 0;
}
哈希数组用法,目前学过哪些案例,举例展示
PTA题目:
代码:
#include<stdio.h>
int panduan(int n);
int main()
{
int a[100001];
int n;
int m;
int i;
int flag = 0;
scanf("%d", &n);
if (panduan(n) == 1)
{
printf("YES");
}
else
{
printf("NO");
}
return 0;
}
int panduan(int n)
{
int static b[100001];
int i;
int x;
for (i = 1; i <= n; i++)
{
scanf("%d", &x);
if (b[x] == 1)
{
return 1;
}
else
{
b[x] = 1;
}
}
建立哈希函数来进行判断数组是否符合要求,然后进行返回。
字符数组、字符串特点及编程注意事项。
- gets识别换行符 ,也就是不识别空格,可以输入一行数据, puts输出后,会自动加上一个换行符
- 如果不是使用scanf函数的%s格式,或者是使用gets函数输入字符串,记得一定需要在最后面加一个' '.例如:使用scanf函数的%c格式,或者使用getchar,一定要在后面加上一个' '
- scanf函数输入时,然后整数换行时,输入直接闪退,这个时候需要在%d后面加上 换行
2.PTA实验作业
2.1 有重复的数据
2.1.1 伪代码
int main
{
scanf n //得知输入数值数量
if panduan=1 //利用函数来判断输出值
printf YES //证明有重复数据
else
printf NO //证明没有重复数据
}
int panduan
{
int static b[100001]//设置静态数组
int x
for
scanf x
if (b[x] == 1) 返回返回值1
else b[x] = 1//利用数值来作为数组下标,如果下标出现两次则说明有重复数据
end for
}
2.1.2 代码截图
2.1.3 找一份同学代码(尽量找思路和自己差距较大同学代码)比较,说明各自代码特点。
同学代码:
特点:我运用了分装函数的方法来让代码更清晰可读,做法都是运用了哈希数组。
2.2 找鞍点
2.2.1 伪代码
定义数组和max数组
for
if (a[i][j] >= a[i][maxi]) //判断行最大数并记录位置到max数组中
{
maxi = j;
}
max[i] = maxi;
end for
for
//判断上述已经是行最大数的数是否为列最大数
if(不是) break//跳出循环
if (是) printf("%d %d
", j, max[j]);//输出鞍点位置,并结束程序
end for
输出无鞍点
2.2.2 代码截图
2.2.3 请说明和超星视频做法区别,各自优缺点
稍微借鉴了超星视频的做法,思路一致,不同的是视频运用了分装函数的办法让整个过程更加清晰明了
2.3 切分表达式
2.3.1 伪代码
定义字符数组
get(字符数组)
for
if (所获取为0~9的数值)
while (((ch[i] >= '0' && ch[i] <= '9') || ch[i] == '.') && ch[i] != ' ')//判断下一位是为0~9数值或为小数点,记录对应下标
for printf("%c", ch[j]);//输出对应下标的数
if (所获取为‘-’字符)
if (ch[i - 1] >= '0' && ch[i - 1] <= '9' || ch[i + 1] == '(')//数组前一位是数字或者下一位是前括号
{
putchar('-');
putchar('
');//减号单独输出一行
}
else
{
putchar('-');//只输出减号
}
if (所获取为‘+’)
if(i == 0)//正号为起始,仅输出正号
{
putchar('+');
}
else//正号单独输出一行
{
putchar('-');
putchar('
')
}
else//其余的单独输出一行
{
printf("%c", ch[i]);
putchar('
');
}
end for
2.3.2 代码截图
2.3.3 请说明和超星视频做法区别,各自优缺点。
超星视频运用了封装函数的方法,且有提前结束循环的设置可以缩短代码运行时间,代码可读性和所需时间得到提升,我的代码比较直白,但也考虑了特殊情况,细节抓得住