C博客作业04-数组
| 这个作业属于哪个班级 | C语言--网络2011/2012 |
| ---- | ---- | ---- |
| 这个作业的地址 | C博客作业04--数组 |
| 这个作业的目标 | 学习如何设计函数、C语言基本数据类型 |
| 姓名 | 胡旻轩 |
0. 展示PTA总分
1. 本章学习总结
1.1 学习内容总结
数组:就是只能存放一种数据类型,比如int类型的数组、float类型的数组,里面存放的数据称为“元素”
数组的定义:
首先声明数组的类型,然后声明数组元素的个数(也就是需要多少存储空间)
格式: 元素类型 数组名[元素个数];
比如: int[3];
数组元素有顺序之分,每个元素都有一个唯一的下标(索引),而且都是从0开始
数组元素的访问: a[i]
数组元素的初始化:
-
int a[3] = {10, 9, 6};
-
int a[3] = {10,9};
-
int a[] = {11, 7, 6};
-
int a[4] = {[1]=11,[0] = 7};
#include<stdio.h>
int main()
{
//数组的定义格式: 类型 变量名[元素个数];
//int ages[5];
//数组的赋值方式:
/*
ages[0] = 12;
ages[1] = 19;
ages[2] = 14;
ages[3] = 26;
ages[4] = 18;
*/
//int ages[5] = {[2] = 14,[3] = 26};
//int ages[5] = {12,19};
int ages[5] = {12,19,14,26,18};
//错误写法:
//int ages[];
//错误写法
//int ages[5]; 只能在定义数组的时候进行初始化
//ages = {12,19,14,26,18};
//错误写法,如果想在定义数组的同时进行初始化,数组元素个数必须是常量或者不写
//int ages[count] = {12,19,14,26,18};
/*数组的遍历,按顺序查看数组的每一个元素*/
//1.for循环遍历
for (int i = 0; i <5; i++)
{
printf("ages[%d] = %d\n",i ,ages[i]);
}
return 0;
}
[ ]里面的个数必须是一个固定值,可以是常量(比如6、8)、常量表达式(比如3+4、5*7)。绝对不能使用变量或者变量表达式来表示元素个数,大多数情况下不要省略元素个数
(当数组作为函数的形参和数组初始化时除外)
C语言中编译器是不会对数组下标越界进行检查的,所以自己访问数组元素时要注意。<
一维数组与函数参数:
一维数组的元素作为函数实参,与同类型的简单变量作为实参一样,是单向的值传递,即数组元素的值传给形参,从而形参是改变不影响实参
数组名代表着整个数组的地址,如果一维数组的名字作为函数实参,传递的是整个数组,即形参数组和实参数组完全相同,是存放在同一存储空间的同一个数组。这样形参数组
修改时,实参数组也同时被修改了。形参数组的元素个数可以省略。
二维数组的定义:
一个数组能表示一个班人的年龄,如果想表示很多班呢?
什么是二维数组?int ages[3][10]; 三个班,每个班10个人,相当于3行10列,相当于装着3个一维数组
二维数组是一个特殊的一维数组:它的元素是一维数组。例如int a[2][3]可以看作由一维数组a[0]和一维数组a[1]组成,这两个一维数组都包含了3个int类型的元素
定义形式: 类型 数组名[ 行数] [列数]
int a[2][3]; //2行3列的二维数组
二维数组的存放顺序是按行存放的,先存放第一行的元素,再存放第2行的元素。例如int a[2][3]的存放顺序是:a[0][0] → a[0][1] → a[0][2] → a[1][0] → a[1][1] → a[1][2]
2. PTA实验作业
2.1 7-7 数组循环左移
2.1.1 伪代码
分别输2个整数代表数组中数字个数和左移位置
for 循环输入数组的值
for 重复每次向左移动
嵌套for 将数组右移一位
输出数组第一个数
for 循环输出剩下的数
2.1.2 代码截图
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;
}
总结:虽然主题的思路都差不多,但是宇航同学进行了更为系统的代码封装,动用函数的思维,让整个代码更加标准化和专业化,这份思维值得我们的学习。
2.2 7-14 找鞍点
2.2.1 伪代码
定义a[] 定义函数GetPoint(int a[][N], int n)
for 读入数据 end for
在函数中
定义maxindex
for
index=0
判断每一行中的最大值
并把下标给maxindex
end for
for
让列等于index
判段该数是否是该列最小的
end for
若内循环执行一遍输出结果
若外循环执行一遍则输出NONE
2.2.2 代码截图
2.2.3 请说明和超星视频做法区别,各自优缺点
这题在自己开始着手的时候,并没有什么思路,自己每次尝试也是以失败告终,没有一个测试点可以过得去,因此就利用超星视频进行了学习,所以总体思路就是利用超星视频内的思路。
2.3 7-6 切分表达式——写个tokenizer吧
2.3.1 伪代码
定义字符串str[50]
定义变量i 控制循环
定义flag
输入字符串fgets
加入循环for (i = 0; str[i] != '\n'; i++)
判断:if(第一个地方就是第一个字符是正负号时)
判断:if(如果是数字或者小数点的话判断下一位是否是小数点或者数字)
else if(负数的判断 前一位是数字还是其他符号)
else if(正数的判断 数字前一位是不是‘(’)