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(正数的判断 数字前一位是不是‘(’)

2.3.2 代码截图

posted @ 2020-12-13 21:49  云中霓裳  阅读(177)  评论(0编辑  收藏  举报