C语言博客作业04--数组
|这个作业属于哪个班级|C语言--网络2011/2012 |
| ---- | ---- | ---- |
| 这个作业的地址 | C语言博客作业04--数组 |
| 这个作业的目标 | 学习数组相关内容 |
| 姓名 | 陈佳桐 |
0.展示PTA总分
展示2张关于“数组题目集”分数截图。
1.本章学习总结
1.1 学习内容总结
学习主要知识识点:
数组中如何查找数据
A顺序查找法
特点:既适用于顺序字符串查找,又适用于非顺序字符串查找。
例:数组7-2查找整数
-
1.通过使用if循环语句判断是否有次数,当查找到最后一个数仍不满足时,输出否定。
-
2.也可以使用flag进行判断,初始化flag=0;当查找到数字时,flag=1.最后根据flag进行if语句输出。
B二分查找法:
-
特点:仅用于顺序字符串查找数据。
-
速度快于顺序查找。
例:来自课堂派测试数组C作业--一维、二维数组
#include <stdio.h>
int main(void)
{
int N, number, top, bott, min, loca;
int a[15] = { -3, -1, 0, 1, 2, 4, 6, 7, 8, 9, 12, 19, 21, 23, 50};
N = 15;
scanf("%d", &number);
loca = 0; top = 0; bott = N - 1;
if ((number < a[0]) || (number > a[N - 1]))
loca = -1;
while ((loca == 0) && (top <= bott)) {
min = /*1*/ (top + bott) / 2 ;
if (number == a[min])
{
loca = min;
printf("The serial number is %d\n", loca + 1);
break;
}
else if (number < a[min]) bott = min - 1;
else /*2*/ top = min + 1 ;
}
if ( /*3*/ loca==-1||top>bott ) printf("%d isn't in table\n", number);
return 0;
}
//输入要找的数,每次取数组的中间数,和要找的数做比较,判断此数在中间数的左侧还是右侧,将判断区间不断进行缩小,直到找到该数或者中间数超过区间范围。
数组中如何插入数据,伪代码
插入数据首先在于找到需要插入位置,同时保证数组中其它数据的位置不发生改变,意味着需要对原数组部分内容进行有序的位置移动,同时注意符合数组定义。
如:
#include<stdio.h>
int main ()
{
int a[11];
int n;
int number;
scanf("%d",&n);
int i;
for( i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
i=0; //将循环后的i清零,重新进行循环
scanf("%d",&number);
while(a[i]<number&&i<n)
i++; //寻找number应该插入的位置,以i进行计数,这里也可以定义一个index量进行判断
for (int j=n-1;j>=i;j--)
{
a[j+1]=a[j]; //将插入位置以及之后的原数组内容向后移动。
}
a[i]=number;
for( i=0;i<n+1;i++)
{
printf("%d ",a[i]);
}
return 0;
}
伪代码
//从小到大
int number //需要插入的数据
int a[]
int i=0
int j
while a[i]<number&&i<n
then i++ //寻找number应该插入的位置,以i进行计数
for j=n-1 to i
a[j+1]=a[j] //将插入位置以及之后的原数组内容向后移动。
a[i]=number; //特殊位置的数据插入
数组中如何删除数据
a :来源于课堂派测试C作业--字符数组+数组复习
//Fun函数用来删除字符串中所有空格。
//学会程序中实现数组中删除元素做法,即重构数组。
//如输入: as df gghk lkj78,
//则输出: asdfgghklkj78
//#include <stdio.h>
void Fun(char str[81])
{
int i,j;
i=j=0;
while(____2_____) //str[i]
{
if(str[i]!=' ')
str[j++]=str[i];
i++;
}
str[j]=___3____; //'\0'
}
int main()
{
char str[81];
int n;
gets(str);
puts(str);
_____1______; //Fun(str)
printf("*** str: %s\n",str);
}
b: PTA数组题目
#include<stdio.h>
int main ()
{
int a[100];
int n,i;
scanf("%d\n",&n);
int temp=n;
for( i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
int k;
scanf("%d\n",&k);
int x;
for(i=0;i<k;i++)
{
scanf("%d\n",&x);
for(int j=x-1;j<n;j++)
{
a[j]=a[j+1];
}
}
for(int m=0;m<(n-k);m++)
{
if(m==n-k-1)
{
printf("%d",a[m]);
break;
}
printf("%d ",a[m]);
}
return 0;
}
数组中目前学到排序方法,主要思路?
冒泡法排序:
-
(从小到大情况)从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们。通过一遍扫描,则最后一个元素必定是最大的元素。然后用同样的方法对前N−1个元素进行第二遍扫描。依此类推,最后只需处理两个元素,就完成了对N个数的排序。
-
特点:效率较慢。耗时久。
#include<stdio.h>
int main()
{
int n;
int temp = 0;
scanf("%d %d\n", &n, &k);
int a[100];
for (int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
for (int j = 0; j < n; j++) //每个数都进行排序
{
for (int x = 0; x < n - 1; x++)
{
if (a[x] > a[x + 1]) //如果发现更大,两数据交换位置,两两之间都会进行一次判断。
{
temp = a[x];
a[x] = a[x + 1];
a[x + 1] = temp;
}
}
}
for (int m= 0; m < n; m++)
{
printf("%d", a[m]);
}
return 0;
}
选择排序法:冒泡排序法的改进
-
1.第一次循环找出最大值或最小值,将这个数放在数组的最首端或最末端。
-
2.随着选择法的进行,比较的次数将会不断减少。在前面的循环过程中已经进行过比较的数就不再比较,如有符号条件情况已进行过数值互换,进行了所谓的“选择”过程,从而使循环次数减少。
-
3.效率高于冒泡法,比较次数较少。
//此题将给定的n个整数从大到小排序后输出。
#include<stdio.h>
int main()
{
int n;
int a[11];
int temp = 0;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
for (int j = 0; j <n-1; j++)
{
for (int x = 0; x < n - j - 1; x++)
{
if (a[x + 1] > a[x])
{
temp = a[x];
a[x] = a[x + 1];
a[x + 1] = temp;
}
}
}
for (int m= 0; m < n; m++)
{
printf("%d",a[m]);
}
return 0;
}
数组做枚举用法,有哪些案例?
枚举类型:参考https://www.runoob.com/cprogramming/c-enum.html
引用来自:https://www.cnblogs.com/Gaoqiking/p/11722241.html
枚举变量
定义枚举变量,分清楚枚举变量和枚举类型的区别
//先定义枚举类型,后定义枚举变量
enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};
enum DAY week;
//同时定义
enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
}week;
//直接定义
enum
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
}week;
哈希数组用法
//哈希表
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。
-
1.hash就是为了把一个复杂的字串,通过一定的转换,得到一个简单的数字(通常是数字)。
-
2.这种方法,通过对多个数组进行定义,以空间换时间来提高效率。
-
3.将所需的数值储存在一个数组中,当需要时再进行调用。
-
4.该数组储存的数可以作为一个数组的下标来用。
如pta数组第8题
这是一个痛苦的回忆。。。
//正确做法
#include<stdio.h>
int main()
{
int n, i;
int a[100000]; //存放需要进行判断的元素
static int b[100001]; //对判断元素出现次数进行累计(类似于count变量用法)
int flag=0; //flag变量为标志,用于判断是否结束循环,输出内容
scanf("%d", &n);
for (i = 0; i < n; i++)
scanf("%d", &a[i]);
for (i = 0; i < n ; i++)
{
b[a[i]]++;
if (b[a[i]]==2)
{
flag=1;
break;
}
}
if (flag==1)
printf("YES");
if(flag==0)
printf("NO");
return 0;
}
字符数组、字符串特点及编程注意事项。
用getchar()或scanf()的'%c'格式符对数组进行字符赋值。
for(i=0;i<10;i++)
a=getchar(); //用scanf()赋值
for(i=0;i<10;i++)
scanf("%c",&a); //自动补充字符数组的结束标志,不需要再赋值。
接收字符串,会以空格,tab,回车作为结束符号
while函数循环输入
int i=0 ;
while((str[i]=getchar())!'\n')
i++;
str[i]='\0'; //补充\0使字符串结束
字符数组:包含一维数组,二维数组,多维数组。
字符串:字符串本质是数组
-
编程注意事项:
-
1.对字符数组的定义使用 char 数组名[数据长度];
-
2.字符数组中的一个元素存放一个字符,它在内存中占用两个字节。
-
3.用字符串给字符数组赋值时由于要添加结束符 '\0',数组的长度要比字符串的长度(字符串长度不包括 '\0')大1。
2.PTA实验作业
2.1 题目名1
选择一题一维数组相关题目。请认真写伪代码整理解题思路。自己代码和同学代码比较,说明各自代码特点。
2.1.1 伪代码
这里对伪代码的进一步学习https://wenku.baidu.com/view/21f241200722192e4536f6e8.html(纯伪代码)
定义 字符数组a,观众数量n,投票情况number,j。
输入 观众数量
For i=0 to i= n-1
输入投票情况
Read number
switch(number)
case 1:a[0]++;跳出
case 2:a[1]++;跳出;
case 3:a[2]++;跳出;
case 4:a[3]++;跳出;
case 5:a[4]++;跳出;
case 6:a[5]++;跳出;
case 7:a[6]++;跳出;
case 8:a[7]++;跳出;
default:跳出;
End for
For j=0 to j=7
Print j+1,a[j]
老师伪代码:
2.1.2 代码截图
//代码过长,进行了一些缩进
2.1.3 找一份同学代码(尽量找思路和自己差距较大同学代码)比较,说明各自代码特点。
-
1.本人代码特点:根据输入投票情况,以switch语句对数组对应数值进行累加,根据累加情况以循环结构输出结果。
-
2.想法过程流畅,对数组的利用类似于count计数做法,思路比较清晰。
-
3.但代码量大,如果碰到选择偏后多的情况,运行时间会偏长。
-
1.同学代码特点:通过使用一个if语句判断count++的情况,使得代码量减少,效率提高。
-
2.比较可知,该同学的代码运行时间短,效果好,两者的思路类似,但同学的优化和考虑更加周到。
-
3.使用switch语句和if语句,得出不同结果,以后应当思考是否有更好的解法。
2.2 题目鞍点:介绍二维数组。
2.2.1 伪代码
定义二维数组,定义最大值max,定义最小值min,定义行数row,定义列数column。
For i=0 to n-1
For j=0 to n-1
Read a[i][j] //输入二维矩阵:把输入的数给a[i][j]
End for
End for
For i=0 to n-1
max←a[i][0] //把a[i][0]赋值给max
row←i
column←0
flag←1
For j=0 to n-1
If a[i][j]>=max
Then do max←a[i][j];
row←i;
column←j;
End if
End for
min←max
For k=0 to n-1
If a[k][column]<min
Then do flag←0;跳出
End if
End for
If flag==1
Then do
Print row,column
Else
Do
Print "NONE"
End if
2.2.2 代码截图
2.2.3 和超星视频做法区别
-
a.本人代码:以flag为标志位判断是否满足条件(只要有一个条件不满足就输出否定)。
-
b.通过循环判断鞍点在行和列上是否满足条件。
老师代码:
-
1.两者的思路类似。
-
2.通过封装Getpoint函数使主函数代码量降低,看起来更加清晰易读懂。
-
3.有简明的注释说明代码的使用。
-
4.这两个习惯应该好好学习,在之后更加大型的程序中很有帮助。
2.3 题目:切分表达式
2.3.1 伪代码
定义i,定义一维字符数组a
Read a
定义字符str
str←a[0]
For i to a[i]等于'0'
If '0'<=a[i]<='9' or a[i]等于.
then do 输出a[i]
Else if a[i]等于*或者等于/或者等于(或者等于)
do
If '0'<=str<='9'
then do
print a[i]
Else
do
print a[i]
Else if a[i]等于- or a[i]等于+
do
If '0' <=str<= '9'
then do
a[i]
Else if
do
print a[i]
Else
do
print a[i]
End if
str=a[i]
End for
2.3.2 代码截图
2.3.3 和超星视频做法区别
-
比较
-
1.整体的思路和老师的相似,老师使用while语句,我使用for语句。
-
2.老师用a[i-1]和a[i+1]判断前一个和后一个字符,我通过定义一个字符变量来存储啊a[i]字符。
-
3.和上面所说的一样,老师更多的使用函数进行封装,主函数显得清晰明了。
-
4.老师运用的continue语句使得程序的运行速度加快,提高效率。
-
5.我的伪代码过于追求格式,可读性较差。
-