《C语言及程序设计》实践项目——二维数组与指针

返回:贺老师课程教学链接

【项目1-二维数组当函数参数】
定义一个函数来完成对参数数组中元素的求和工作,函数声明如下:

int sum(int array[ ][4],int m,int n);  //该函数完成对array数组中的前m行和n列元素求和

在以下程序的基础上,完成对sum函数的定义。

#include <stdio.h>
int sum(int array[ ][4],int m,int n);//该函数完成对array数组中的前m行和n列元素求和
int main()
{
    int a[4][4]= {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}; //定义二维数组的同时进行初始化
    int row,col;
    scanf("%d %d", &row, &col); //输入行数和列数
    printf("%d\n", sum(a, row, col)); //输出二维数组前row行前col列的元素的和
    return 0;
}

[参考解答]

【项目2-多科成绩单】
某班不超过100名同学。用二维数组score[][4]保存同学们的高数、英语、C语言成绩及总成绩(在此假设学生的学号为整型的连续值,用数组的行下标作学号)。在此基础上,完成下面的操作:
(1)输入学生的实际人数num,在输入各科的成绩时,输入3科成绩后可以自动求出总分,并将数据全保存到数组中;
(2)输出各门课及总分的最高成绩、最低成绩、平均成绩。

#include <stdio.h>
void input(double s[][4],int n); //输入成绩
void output(double s[][4],int n); //输出成绩
double max(double s[][4],int n,int i); //求第i门课的最高成绩,i=3时是总分
double min(double s[][4],int n,int i); //求第i门课的最低成绩
double avg(double s[][4],int n,int i); //求第i门课的平均成绩

int main()
{
    int i,num;
    double score[100][4]; //设一个班最多100人,实际按输入来
    char course[4][10]= {"高等数学","英语","C++","总分"};
    printf("输入学生人数:");
    scanf("%d", &num);
    //(1)输入成绩并求出总分
    input(score,num);
    //(2)输出成绩
    output(score,num);

    //(3)输出各门课及总分的最高成绩、最低成绩、平均成绩和成绩的标准偏差;
    for(i=0; i<4; ++i)
    {
        printf("%s的最高成绩是%.2f, ", course[i], max(score,num,i));
        printf("最低成绩是%.2f, ", min(score,num,i));
        printf("平均成绩是%.2f ", avg(score,num,i));
        printf("\n");
    }
    return 0;
}

[参考解答]

【项目3-各种“棋盘”】
定义一个8行8列的二维数组a[8][8]。
(1)为二维数组中的数据赋50以内的随机数(程序模板中setdata()函数已经完成,利用产生随机数的系统函数实现),可能的取值如图所示;

(2)设计函数out()按行输出二维数组中的数据;
(3)设计函数outDiagonal()输出从左上到右下对角线上的元素的值,如对图的数据而言,输出为48 34 12 31 40 42 34 45;再输出从右上到左下对角线上的值;
(4)将此数组视为“扫雷”游戏的界面(实际上扫雷游戏的界面一般就用二维数组保存其界面),通过键盘输入一个位置,输出其周围八个格子中的数据,如输入2 2时,输出34 30 47 29 48 14 12 31(注意:一共八个,不包括该位置上的数)(参见图中的黄色部分),计算这些数的和并输出。另外,如果选择的位置在边缘或角上时,周围的格数不够八个,按实际个数输出。请用循环有规律地列举出来各个值,不要采用顺序结构逐个罗列。这项功能由函数mine()完成。
(5)设计函数change()改变数组中的值。改变的规则是:从第2行(即a[1]行)开始到最后一行,每一元素是其正上方元素和右上方元素之和,例如a[1][0]取a[0][0]和a[0][1]之和,a[1][1]取a[0][1]和a[0][2]之和,……。对各行最后一列元素,其右上方无数据,取上一行中的第一个元素,如a[1][7]取a[0][7]和a[0][0]之和。对上图中的数据,a[1]行的元素将依次为:50(48+2) 27(2+25) 41 30 33 63 60 64(16+48),a[2]行依次为77 68…114。
程序模板:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
void setdata(int a[8][8]);  //设置随机数
void out(int a[8][8]);		//输出数组
void outDiagonal(int a[8][8]);  //输出对角线元素的值
void mine(int a[8][8],int x, int y);		//按“扫雷”游戏的规则输出相邻格子
void change(int a[8][8]); 				//按要求改变数值
int main()
{
    int a[8][8], x, y;
    setdata(a);
    out(a);
    outDiagonal(a);
    printf("输入一个位置:");
    scanf("%d %d", &x, &y);
    mine(a,x,y);
    change(a);
    out(a);
    return 0;
}
void setdata(int a[8][8])
{
    int i,j;
    srand(time(NULL));//需要用当前时间作“种子”,以便每次运行取得的序列不同
    for(i=0; i<8; i++)
        for(j=0; j<8; j++)
            a[i][j]=rand()%50+1;
    return;
}
//按行序优先输出数组
void out(int a[8][8])
{
}
//输出对角线元素的值(从左上到右下、从右上到左下)
void outDiagonal(int a[8][8])
{
}
//按扫雷游戏规则,输出a[x][y]周围的8个数字
void mine(int a[8][8],int x, int y)
{
}
//按题目中所言规则更改元素的值
void change(int a[8][8])
{
}

[参考解答]

【拓展-二维数组更多用处】
(这部分可以不去选择实践,看看、想想即可。)中国象棋的棋盘也可以采用二维数组存储。
(1)下棋程序需要体现相关的规则,例如,马走日。通过键盘输入一个位置,输出按“日”字型可以走到的所有位置,及其位置上的数值。例如,在项目6的图中,输入2 2时,输出(0,1,2)(0,3,16) (1,0,9) (1,4,12)……(项目6图中的背景有斜线的部分。可走到的位置一般为八个,位置在边缘或角上时,可能不够八个,按实际输出)。
(2)马走日还有“别马腿”的规则。在任务4的图中,如果马腿位置上的数大于25,认为马腿被别了(实际游戏中,以该位置是否有棋子进行判断)。请在(1)的基础上考虑这一规则,只输出所有能走到的位置及数值。
(3)俄罗斯方块游戏中的每一个小方块也用二维数组(一般4*4或8*8)表示,单色游戏数组元素用0、1即可,彩色的取值不限于0、1。对小方块的基本操作包括左旋、右旋、反转等操作。请针对上面的二维数组,实现左旋、右旋、反转等操作。
(4)JPEG是数字图像存储的国际标准。在JPEG编码规则中,其编码的基本单位是8*8的图像“块”,其中有一个环节叫“Z字型编码”,也即将一个8*8的“块”中数据按如图所示的方向取出,形成一个1*64的向量(可以保存在一个一维数组中)。请输出前面的8*8的数据块对应的向量。

(5)《线性代数》是工程数学的重要组成,在大二时开设,其中将涉及大量矩阵的运算,用于解决工程中的问题。在编程实现矩阵操作时,就是二维数组的操作。

时间: 2024-10-07 10:31:06

《C语言及程序设计》实践项目——二维数组与指针的相关文章

《C语言及程序设计》实践项目——二维数组

返回:贺老师课程教学链接 [项目1-折腾二维数组]创建一个5行4列的二维整型数组,通过初始化,为数组中的前两列的10个元素赋初值,然后: 通过键盘输入,使后两列的10个元素获得值: 按行序优先输出数组元素: 将所有元素值乘以3后保存在数组中: 按列序优先输出(输出的第一行是数组中的第一列--,其实输出的就是"转置"): 将数组"倒"着输出(即最后一行最后一列的最先输出,第0行第0列的最后输出): 输出数组中的所有偶数: 输出所有行列下标之和为3的倍数的元素值. #i

二维数组与指针-C语言二维数组中的*(p+1)的确切含义

问题描述 C语言二维数组中的*(p+1)的确切含义 各位大师们,烦请指教一二吧.如果是在一维数组中,*(p+1)表示p+1这个地址空间或空间中的值,那么在二维数组中,p+1是指向a[1]*(p+1)是a1这个地址中的值啊?可是为什么会是地址呢? 解决方案 二维数组其实是一个小戏法,本质上还是一维数组--二维下标连续构成的数组又连续构成第一维下标.你可以像遍历一维数组那样遍历它 解决方案二: 其实a[2][3]的调用可以看成是两个调用,首先是对a进行[2]操作,然后再对a[2]的返回值进行[3]操

数组 指针-c语言二维数组的指针问题

问题描述 c语言二维数组的指针问题 在WinTC下运行如下代码 #include void main() { char a1[][5]={"ab","cd","ef","ghi","sfs"}; printf("%sn",*(a1+3)); //语句1 printf("%cn",**(a1+3)); //语句2 } 运行结果为: ghi g 但如果将上述语句1中的%s

直观理解C语言中指向一位数组与二维数组的指针_C 语言

一维数组和指针:对于一位数组和指针是很好理解的: 一维数组名: 对于这样的一维数组:int a[5];  a作为数组名就是我们数组的首地址, a是一个地址常量 . 首先说说常量和变量的关系, 对于变量来说, 用箱子去比喻再好不过了, 声明一个变量就声明一个箱子,比如我们开辟出一个苹果类型的箱子, 给这个变量赋值就是把盛放苹果的箱子中放入一个实实在在的苹果, 这就是变量的赋值.  而对于数组来说, 就是一组类型相同的箱子中,一组苹果箱子, 可以放入不同的苹果. 一维数组空间: 变量被声明后, 我们

关于指向二维数组的指针编译出错

问题描述 关于指向二维数组的指针编译出错 #include int m; int n; int a[10][10]; void InputArray(int *p, int m, int n); int main(void) { int *(ptr)[10]; ptr=a; printf("Input m,n: "); scanf("%d,%d",&m,&n); InputArray(*ptr,m,n); } void InputArray(int

二维数组行指针的问题

问题描述 二维数组行指针的问题 问一个比较呆的问题,今天看到了这样一个程序,运行结果是9,我就糊涂了(pa+1)[1]是什么啊 为什么(pa+1)[0]是5呢 那个方括号里的数字指什么呢 我真是彻底晕了 求指教~ #include void main() { static int a[3][4]={1,2,3,4,5,6,7,8,9,10},(*pa)[4]=a; cout<<*(pa+1)[1]<<endl; } 解决方案 #include int main() { int a[

《C语言及程序设计》实践参考——二维数组当函数参数

返回:贺老师课程教学链接 [项目1-二维数组当函数参数]定义一个函数来完成对参数数组中元素的排序工作,函数声明如下: int sum(int array[ ][4],int m,int n); //该函数完成对array数组中的前m行和n列元素求和 在以下程序的基础上,完成对sum函数的定义. #include <stdio.h> int sum(int array[ ][4],int m,int n);//该函数完成对array数组中的前m行和n列元素求和 int main() { int

2013级C++第15周项目——二维数组

课程主页在:http://blog.csdn.net/sxhelijian/article/details/11890759 [项目1-折腾二维数组]创建一个长度为5行4列的二维整型数组,通过初始化,为数组中的前两列的10个元素赋初值,然后通过键盘输入,使后两列的10个元素获得值,将所有元素值乘以3后保存在数组中.输出数组时,按行序优先输出,再按列序优先输出(输出的第一行是数组中的第一列--,其实输出的就是"转置"),再将数组"倒"着输出(即最后一行最后一列的最先输

2014秋C++ 第14周项目 二维数组

课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂"贺老师课堂"同步展示,使用的帐号请到课程主页中查看.  [项目1-折腾二维数组]创建一个5行4列的二维整型数组,通过初始化,为数组中的前两列的10个元素赋初值,然后: 通过键盘输入,使后两列的10个元素获得值: 按行序优先输出数组元素: 将所有元素值乘以3后保存在数组中: 按列序优先输出(输出的第一行是数组中的第一列--,其实输出的就是"