这个作业属于哪个班级 | C语言--网络2011/2012 |
---|---|
这个作业的地址 | C博客作业04--数组 |
这个作业的目标 | 学习数组相关内容 |
姓名 | 汪月月 |
0.展示PTA总分
1.本章学习总结
1.1数组基本美容
数组类型 数组名称[数组大小]
例如:int a[7];
- 数组大小必须是常量
- 数组下标从0开始(好的程序员一定从零开始),不要越界了,下标范围[0,数组长度-1]
- 数组大小可以用宏定义
#include<stdio.h>
#define N 10//宏定义
int main()
{
int arr[N];//定义数组
return 0;
}
初始化
static int a[5];//将数组初始化为0
int arr1[3]={1,2,3};
int arr2[]={1,2,3};//将数组前三个元素赋值
int arr3[3]={1,2}//将前两个赋值
int arr5[3][3]={1,2,3,4,5,6};//将二维数组赋值
int arr6[][4]={{1,2},{3,4,5},{6}};//将第1行的前两个,第二行前三个,第三行的第一个赋值
int arr7[3][]={{1,2},{3,4,5},{6}};//错误形式
char s1[3]={'a','k','b'};//分别赋值
char s2[]="abcdef";//字符串直接赋值,注意后面有
数组输入输出
#include<stdio.h>
int main()
{
static int a[5];
char s[10];
/*数值型数组输入*/
for (int i = 0; i < 5; i++)//数组下标从0开始,i不能等于5,会发生数组越界
{
scanf("%d", &a[i]);
}
/*字符型数组输入*/
fgets(s, 10, stdin);
/*数值型数组输出*/
for (int i = 0; i < 5; i++)
{
printf("%d", a[i]);
}
/*字符型数组输出*/
puts(s);
return 0;
}
数组长度
len=sizeof(a)/sizeof(a[0]);
查找某个元素
就是将数组遍历,直到找到为止
枚举案例
1.查找数字
2.排序
3.找鞍点。。。。
1.2几种数组的排序插入删除移动的方法
1.2.1选择法排序
void SeletSort(int a[],int len)//排序数组,数组长度
{
int temp;
for (int i = 0; i < len-1; i++) {
for(int j=i+1;j<len;j++)
if (a[i] > a[j])
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
1.2.2冒泡法排序
void BubbleSort(int a[], int len)
{
int temp;
for (int i = 0; i < len; i++)
{
for (int j = 0; j < len; j++)
{
if (a[j] > a[j + 1])
{
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}
1.2.3插入法排序
void InsertNumber(int a[],int n,int num)
{
int i, j;
for (i = 0; i < n; i++)
{
if (a[i] > num)//找到要插入的位置
{
break;
}
}
for (j = n - 1; j >= i; j--)
a[j + 1] = a[j];//将后面的数据后移一位
a[i] = num;//把要插入的地方等于该数
for (i = 0; i <= n; i++)
printf("%d ", a[i]);
}
1.2.4哈希数组
7-8 有重复的数据
#include<stdio.h>
int b[100000];
int a[100000];
int main()
{
int n,flag = 0,x;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
x = a[i];
b[x]++;//将数组a的值作为数组b的下标,并将其做标记
}
for (int i = 1; i < 100000; i++)//判断b数组即可知道是否有重复数据
{
if (b[i] > 1)//大于一证明出现了两次及以上
flag = 1;
}
if (flag == 0)
printf("NO");
else
printf("YES");
return 0;
}
7-3 删除重复字符
#include<stdio.h>
char str[1000];
char hash[256];//利用Ascll表,既能将要删除的字符删去,又能排序
int main()
{
int i = 0;
while ((str[i] = getchar()) != '
')
{
hash[str[i]] = -1;//将str数组的值作为hash数组的下标,并将其赋值
i++;
}
for (int j = 0; j < 255; j++)//按顺序输出
{
if (hash[j] == -1)
printf("%c", j);
}
return 0;
}
1.2.5二分查找
int BinSearch(int* a, int n, int key)//传入数组,数组长度,要查找的数据
{
int str, end, min;//开头,末尾,中间值
str = 0;
end = n - 1;
while (str <= end)
{
min = (str + end) / 2;
if (key == a[min])//相等
return min;
else if (key > a[min])//在min右边
str = min + 1;
else//在min左边
end = min - 1;
}
if (key != a[min])return -1;
else return min;
}
1.2.6进制转换
int a[10000];
void Base(int base,int number)
{
int ans;
int k = 0;
while (number >0)
{
ans = number % base;
a[k++] = ans;
number /= base;
}
for (int i = k-1; i >=0; i--)//如果按八位或则32位输出,则将k-1改为7或31
printf("%d", a[i]);
}
1.2.7删除数据
/*标记法
对要删除的数据进行标记*/
void DeletNumber(int a[], int n, int num)//传入数组,数组长度,要删除数据
{
int i,t;
for (i = 0; i < n; i++)
{
if (a[i] == num)
{
t = i;//标记该数据下标
break;
}
}
for (i = 0; i < n; i++)
{
if (i != t)//除了该数据都输出
printf("%d ", a[i]);
}
}
/*移动法
将后面数字前移,将删除数字覆盖*/
void DeletNumber(int a[], int n, int num)
{
int i, j;
for (i = 0; i < n; i++)
{
if (a[i] == num)//找到数字所在位置
{
for (j = i; j < n; j++)
{
a[j] = a[j + 1];//将后面数据前移
}
n--;
j--;
}
}
for (i = 0; i < n; i++)
printf("%d ", a[i]);
}
1.2.8数组左右移动
//eg.数组左移
void MoveNumber(int a[], int n, int m)//数组,数组长度,移动位数
{
while (m >= n)//移动位数超过原来数组长度
{
m -= n;
}
for (int i = m; i < n; i++)//先将左移后的数据输出
{
if (i == m)printf("%d", a[i]);
else printf(" %d", a[i]);
}
for (int i = 0; i < m; i++)//再输出移动前的
{
printf(" %d", a[i]);
}
}
以上代码均是自己写出来的,没有交到平台测试,只是自己测试了几个,仅供参考,具体还是看题目。
1.3字符数组的相关内容
1.3.1注意事项
字符数组最后一定要有' ';
scanf()与printf()遇到' '就会停止读入和输出
例如这样读入字符
while ((str[i]=getchar())!='
')
i++;
str[i] = ' ';
所以最好用fgets()读入字符,但最后会多一个回车
所以循环时要这样
for (i = 1;s[i]&& s[i] != '
'; i++)
如果直接复制的话,注意数组开大一点
字符串函数
1.strlen()
2.strcat()
3.strcpy()
4.strcmp()
2.PTA实验作业
2.17-1 将数组中的数逆序存放
2.1.1伪代码
变量定义
int n,i
int a[N];
输入数组
a[N]
数据处理
for i=n-1 to 0//逆序输出即可
if i==n-1//第一个输出不带空格
then printf("%d",a[i])
else
then printf(" %d",a[i])
end
2.1.2代码截图
2.1.3同学互比
2.27-14 找鞍点
2.2.1伪代码
定义变量
int a[6][6];
int lineMax, colMin,flag;
输入数据
a[6][6],n
数据处理
for i = 0 to n
colMin = i
for j = 0 to n 行最大
if a[i][lineMax] <= a[i][j]
then lineMax = i 找到最大
end
for j = 0 to n 列最小
if a[colMin][lineMax] > a[j][lineMax]
then colMin = j
break 存在更小的,则该点不是鞍点
end
if i == colMin//结束
then flag = 0
break
end
if flag是0
输出 colMin,lineMax
else
否则 NONE
2.2.2代码截图
2.2.3与超星视频对比
1.觉得老师的思路清晰,自己一直都是有点乱,一会行和列就弄混了
2.还没有真正掌握伪代码,写的和代码差不多。。。。
3.原本有些乱,看了视频后,就清晰多了,分装函数
4.后来稍作修改
2.37-6 切分表达式
2.3.1伪代码
if s[0]==+||-//表示正数,或负数,不换行
输出s[0]
else if s[i]==(,),/,+,*//运算符,输出后回车
输出s[i]+
else if s[i]是0~9,或者.
if s[i+1]!=0~9||.//后面不是数字
printf s[i]
else//后面是数字
printf s[i]
else if s[i]==-
if s[i-1]==0~9//证明-是运算符,输出后回车
printf s[i]
else//是负号
printf s[i]
else//是数字
if s[i+1]==0~9||.//后面还有数字
printf s[i]
else
printf s[i]
2.3.2代码截图
2.3.3与超星视频对比
1.视频中用if语句并联,需要多次判断,个人比较喜欢用多分支,有时候也分情况
2.视频中情况分的很清楚,还是用了函数进行分装,而我的稍微有点乱。。。
3.代码量比我的少
4.后来稍加改正