C博客作业04--数组
这个作业属于哪个班级 | C语言--网络2011/2012 |
---|---|
这个作业的地址 | C博客作业04--数组 |
这个作业的目标 | 学习数组相关内容 |
姓名 | 王博 |
0.展示PTA总分(0----2)
1.本章学习总结(3分)
1.1 学习内容总结
1.1.1数组中如何查找数据,有哪些做法
用循环让数组的下标逐个变化,再一一进行对比,判断出要寻找的数。
将要找的数放在一个数组中,再在另一个数组中循环输入被查找的数组。
1.1.2数组中如何插入数据,怎么做,可以写个伪代码或动态图展示方法
找到插入位置
记录该位置
for循环将该位置及以后的数组向后移动一个位置
将插入数据输入标记位置
1.1.3数组中如何删除数据,这个有多种做法,请一一展示。
直接将要删除的数后面的数向前移动
将符合要求的字符输入另一个数组中重新排列
1.1.4数组中目前学到排序方法,主要思路?
选择排序法:把每一次从待排序的du数据元素中选zhi出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完
冒泡排序法:相邻的两个数进行对比再根据需求交换位置,并且重复多次即可达到排序的目的。
1.1.5数组做枚举用法,有哪些案例?
骰子六面的投掷概率
选择排序法
A-B在A字符串中去除B中所含有的元素
统计一行文本的单词个数
查找整数
等
1.1.6哈希数组用法,目前学过哪些案例,举例展示。
用一个数组的下标与输入数据关联,再将输入数据与数组下标进行对照,从而进行记录。
记录输入字符中每种大写字母的个数
将26个字母与数组从1-26的下标一一对应,对输入数据进行判断,但判断符合时,对应变量num[i]++
1.1.7字符数组、字符串特点及编程注意事项。
SCANF("%s",num);输入字符串时输入'\n'、 ' '时停止录入并且会自动在输入字符后加上'\0'的结束符。
fgets(num,100,stdin);输入字符串时输入'\n'结束录入并且会将回车键录入,后在其末尾加上'\0'的结束符
2.PTA实验作业(7分)
2.1 7-7 数组循环左移(3分)
2.1.1 伪代码
分别输2个整数代表数组中数字个数和左移位置
for 循环输入数组的值
for 重复每次向左移动
嵌套for 将数组右移一位
输出数组第一个数
for 循环输出剩下的数
2.1.2 代码截图
王博
#include<stdio.h>
int main()
{
int n, m,i,temp,a;
int num[100];
scanf("%d %d", &n, &m);
if (m >= n)
m = m % n;
for (i = 0; i < n; i++)
{
scanf("%d", &num[i]);
}
for (a = 1; a <= m; a++)
{
for (i = 0; i < n - 1; i++)
{
temp = num[i + 1];
num[i + 1] = num[i];
num[i] = temp;
}
}
printf("%d", num[0]);
for (i = 1; i < n; i++)
{
printf(" %d", num[i]);
}
return 0;
}
2.1.3找一份同学代码(尽量找思路和自己差距较大同学代码)比较,说明各自代码特点。
陈宇航
#include <stdio.h>
#define MAXN 100
int ArrayShift( int a[], int n, int m );
int main()
{
int a[MAXN], n, m;
int i;
scanf("%d %d", &n, &m);
for ( i = 0; i < n; i++ ) scanf("%d", &a[i]);
ArrayShift(a, n, m);
for ( i = 0; i < n; i++ ) {
if (i != 0) printf(" ");
printf("%d", a[i]);
}
printf("\n");
return 0;
}
int ArrayShift(int a[], int n, int m)
{
for (int i = 0; i < m; i++)
{
int temp = a[n - 1];
a[n - 1] = a[0];
for (int A = 0; A < n - 2; A++)
{
a[A] = a[A + 1];
}
a[n - 2] = temp;
}
return 1;
}
我自己的代码比较中规中矩,陈宇航的代码将C语言的知识充分运用,虽然思路程序都差不多,都是陈宇航将右移的代码分装为了一个函数,值得我去学习,提升了代码的简洁性和可读性,而且他的代码中还运用了许多课外小知识,对于C语言的基础内容我还需要加强。
2.2 找鞍点(2分)
2.2.1 伪代码
for找每行的最大值并记录
for找到每列最小值并记录
用行标和列表对比是否相等
相等则为鞍点输出,并flag=1记录
若flag=0即无鞍点则输出NONE
2.2.2 代码截图
#include<stdio.h>
int main() {
int n=0, i, j, min, max, tmp, flag=0;
scanf("%d",&n);
int num[n][n], a[n];
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
scanf("%d",&num[i][j]);
if(j==0)
{
max=num[i][j];//最大值一开始默认为每行的第一个
}
if(max<=num[i][j])// 找到每行的最大值
{
max=num[i][j];
a[i]=j;//行最大的坐标i,j
}
}
}
for(j=0; j<n; j++)
{
for(i=0; i<n; i++)
{
if(i==0)
{
min=num[i][j];
}
if(min>=num[i][j])//列最小
{
min=num[i][j];
tmp=i;
}
}
if(j==a[tmp])//根据列最小的行角标i,判断它们的纵角标j是否相等
{
printf("%d %d", tmp ,j);
flag=1;
break;
}
}
if(flag==0)printf("NONE");
return 0;
}
2.2.3 请说明和超星视频做法区别,各自优缺点。
超星中对判断条件的代码进行了分装,有利于代码的阅读,并且使主函数更加整洁。
其他思路与我的代码差不多
2.3 切分表达式
2.3.1 伪代码
for循环判断数组是否为数字
如果是item=1
再通过while推算至该数字结束
输出数字
如果是负号
判断-前后字符是否合理合理则输出负号或负号加回车
如果为加号判断是否为开头。开头则不输出+
如此循环至不满足条件
2.3.2 代码截图
#include <stdio.h>
#include <stdlib.h>
int main()
{
char ch[41];
int i,j;
int item;
gets(ch);
for(i=0;ch[i]!='\0';i++){
if(ch[i]>='0'&&ch[i]<='9'){
item=i;
while(((ch[i]>='0'&&ch[i]<='9')||ch[i]=='.')&&ch[i]!='\0')
i++;
for(j=item;j<i;j++)
printf("%c",ch[j]);
i--;
putchar('\n');
}
else if(ch[i]=='-'){
if(ch[i-1]>='0'&&ch[i-1]<='9'||ch[i+1]=='(') {
putchar('-');
putchar('\n');
}
else
putchar('-');
}
else if(ch[i]=='+') {
if(i==0)
printf("%c",ch[i]);
else printf("%c\n",ch[i]);
}
else{
printf("%c",ch[i]);
putchar('\n');
}
}
return 0;
}
2.3.3 请说明和超星视频做法区别,各自优缺点。
超星中对判断条件的代码进行了分装,有利于代码的阅读,并且使主函数更加整洁。
超星中是对小数点、括号等分开进行判断,而我自己的代码是主体分为-和+进行判断,超星中的写法更有利于代码的阅读和理解,也更容易编写。