C语言博客作业04-数组
| 这个作业属于哪个班级 | C语言--网络2011/2012 |
| ---- | ---- | ---- |
| 这个作业的地址 | (https://edu.cnblogs.com/campus/jmu/2020C/homework/11598) |
| 这个作业的目标 | 学习数组及相关知识。 |
0pta总分截图
1本章学习总结
1.1学习内容总结
- 数组中查找数据
1:直接
#include <stdio.h>
int main()
{
int x;
int i;
int flag;
int a[10];
scanf("%d",&x);
for(i=0;i<10;i++)
{
if(a[i]==x)
flag=1;
}
if(flag)
printf("%d",i);
return 0;
}
2:二分查找
int a[100];
int n=10;
int x;
int low;
int high;
int mid;
int loca;
scanf("%d",&x);
loca=0;
low=0;
high=n-1;
if((x<a[0]||(x>a[n-1]))
loca=-1;
while(loca==0&&low<=high)
{
mid=(low+high)/2;
if(x==a[mid])
{
loca=mid;
printf("%d",loca+1);
break;
}
else if(x<a[mid])
high=mid-1;
else
low=mid+1;
}
return 0;
}
- 数组中插入数据
for i=0 to n-1
i++;
if num>a[i] then
insert=i;
end for
- 删除数据
1:在原数组中删除
for i=0 to i=n-1
i++;
j++;
if a[i]==x then
for j=i to j<n-2
j++;
n--;
a[j]=a[j+1]
end for
2:重构数组
for i=0,j=0 to i=n-1
i++;
j++;
if a[i]!=x then
b[j]=a[i]
end if
end for
- 排序方法
1:冒泡
从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们。通过一遍扫描,则最后一个元素必定是最大的元素。然后用同样的方法对前N−1个元素进行第二遍扫描。依此类推,最后只需处理两个元素,就完成了对N个数的排序。
/*冒泡法排序,需要从头到尾进行相邻两个元素比较,对于一组n个数,第一次扫描比较需比较n-1次,第二次需n-2次*/
for (i = 0; i < n; i++)
scanf("%d", &a[i]);/*读入数据,保存该数组*/
for (i = 0; i < k; i++)/*对数组从头到尾全部扫描的次数*/
for (j = 0; j < n - 1 - i; j++)/*每次扫描一遍需比较的次数*/
{
if (a[j] > a[j + 1])/*交换位置*/
{
temp = a[j + 1];
a[j + 1] = a[j];
a[j] = temp;
}
}
2:选择
for (i = 0; i = n - 1; i++)
{
max = i;/*max存放最大值下标*/
for (j = i + 1; j < n; j++)/*找最大值下标*/
{
if (a[j] > a[max])
max = j;
}/*先找最大值下标,再进行交换下标*/
temp = a[max];
a[max] = a[i];
a[i] = temp;/*最大元素下标与下标为i(i从0—n-1)的元素交换*/
}
-
数组做枚举用法
扔骰子概率、统计文本单词个数、查找整数 -
哈希数组用法
有重复数据
-
字符数组、字符串特点及编程注意事项
1、对于字符串组需要有结束标志'\0',
2、scanf函数对于字符串的输入' '及'\n'时停止录入并且会自动在输入字符后加上'\0'的结束符,scanf("%s",str[i])不用加“&”
3、fgets函数对于字符串的输入对于'\n'会收入,并自动加上'\0'结束标识符,fgets(str,数组长度,stdin)
4、定义数组长度时,应比实际个数+1('\0')
2pta实验作业
2.1题目名:删除数字字符
2.11伪代码
for i=0 to n-1
if 某个元素不是数字字符(a[i]!=x)
then 将该元素存入数组(a[j++]=a[i])
end if
end for
处理过的字符串加上结束表标志'\0'
2.12代码截图
2.13同学代码及各自特点
吕以晴的代码截图
她的特点:不用重新将非数字字符再赋值到数组中直接输出
我:将非数字字符再赋值到数组中,并还得加上结束符'\0'
2.2鞍点
2.21伪代码
for i=0 to n-1
i++
for j=0 to n-1
j++
if 同行比较列,若某一列的数大于col上的数,则交换列下标(a[i][j] >= a[i][col] col = j)
end if
end for
此时找到某一行上最大的数所在的列 (flag=1)
for k=0 to n-1
k++
if 对刚才找到的列比较不同行,若更大则没找到(a[k][col] < a[i][col])
没找到鞍点,退出循环,继续下一轮寻找(flag=0)
end if
end for
if 找到鞍点,退出循环(flag)
end if
end for
if 找到鞍点,输出下标
else 输出NONE
end if
2.22代码截图
2.23与超星的区别
超星:通过判断下标的值来判断是否找到鞍点。优点:少设一个变量,让代码更简洁。
我:设一个变量flag通过改变flag来判断是否找到鞍点。缺点:多设一个变量,增加代码的复杂性。
2.3切分表达式
2.31伪代码
while i<n
if 某一元素为'(' ')' '*' '/'
then 输出"该元素\n"
i++
continue
end if
if 某一元素是数字字符或'.'
if 该元素的后一元素也是数字字符或'.'
then 输出"该元素"
else
输出"该元素\n"
i++
continue
end if
if 某一元素为'+'或'-'
if i==0或前一个元素为'('
then 输出该元素
end if
else
输出"该元素\n"
i++
end if
end while
2.32代码截图
2.33与超星视频做法区别
看了超星后做的题目,没有区别。
超星做法的优点:将切分表达式的功能分装成函数,使代码分块,让人更易看懂。