003软件(2016)基础设计(一)

本文介绍了数组的基础应用,包括一维数组与二维数组的操作方法。同时深入探讨了矩阵的构造与打印,提供了三种不同的实现方案,帮助读者理解螺旋方阵和蛇形方阵的生成原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

待我学有所成,结发与蕊可好。@夏瑾墨

内容一:顺序、分支、循环结构程序设计、数组的应用    (4学时)

方式:简单复习知识点,重点复习一维数组、二维数组。
题目:
 基础:将10个元素存入一个一维数组中,按逆序输出,并找出最大数和最小数。
解:

#include<stdio.h> 
int main()
{
    int i, a[10];
    for(i = 0; i < 10; i ++)//顺序循环,输入10个数值
        scanf("%d",a+i);

    for(i = 9; i >= 0; i --)// 逆序循环,输出10个数
        printf("%d ",a[i]);

    return 0;
}

 中:已知二维数组形式如下:求主对角线上元素之和。
解:

#include<stdio.h>
int main()
{
        int a[4][4]={5,9,10,12,4,6,7,8,11,23,20,1,3,2,40,14},//存进一个二维数组
        sum=0,i;
        for(i=0;i<4;i++)
            sum+=a[i][i];//对角线元素以此相加
            printf("sum=%d\n",sum); 
} 

 难:矩阵的构造与打印
1) 矩阵为n阶方阵,n由键盘输入;
2) 可在螺旋方阵和蛇形方阵中选择(如下图所示)。
这里写图片描述
方案1(老李):

#include <stdio.h> //定义输入/输出函数
#include <stdlib.h>定义杂项函数及内存分配函数,system()
#include <string.h>//字符串处理
#define MAX 100
int a[MAX][MAX];

int main() {
    int n,x,y,nowNum=0;
    scanf("%d",&n);
    memset(a,0,sizeof(a));//memset() 函数常用于内存空间初始化,用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘memset(a, '/0', sizeof(a));
    x = 0,y = 0;
    nowNum = a[x][y] = 1;
    while(nowNum < n*n) {
        while(y+1<n && !a[x][y+1])  a[x][++y] = ++nowNum;//
        while(x+1<n && !a[x+1][y])  a[++x][y] = ++nowNum;
        while(y-1>=0 && !a[x][y-1]) a[x][--y] = ++nowNum;
        while(x-1>=0 && !a[x-1][y]) a[--x][y] = ++nowNum;
    }
    for(x=0; x<n; x++) {
        for(y=0; y<n; y++)
            printf("%4d",a[x][y]);
        printf("\n");
    }
    printf("\n\n");
    system("pause");
    return 0;
} 

《算法竞赛入门》
在螺旋矩阵设计中通过记录(计数器)控制每行的数的数目和转向,实现行列互换,“层层推进”,从而实现数的螺旋循环。
方案2(成哥):

#include<stdio.h>
#define N 100
int lx[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int sx[2][2]={{-1,1},{1,-1}};
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        int a[N][N];
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                a[i][j]=0;
            }
        }
        int x=0,y=0,z=0;
        for(int h=1;h<n*n+1;h++)
        {
            a[x][y]=h;
            if(x+lx[z][0]==n||y+lx[z][1]==-1||y+lx[z][1]==n||a[x+lx[z][0]][y+lx[z][1]])
            {
                if(z==3) z=0;
                else z++;
            }
            x=x+lx[z][0];
            y=y+lx[z][1];
        }
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                printf("%3d",a[i][j]);
            }
            printf("\n");
        }
        printf("\n");
        x=0;
        y=0;
        z=0;
        for(int h=1;h<n*n+1;h++)
        {
            a[x][y]=h;
            if(x+sx[z][0]==-1||y+sx[z][1]==-1||x+sx[z][0]==n||y+sx[z][1]==n)
            {
                if(z==1) 
                {
                    z=0;
                    if(x+1==n) y++;
                    else x++;   
                }
                else 
                {
                    z++;
                    if(y+1==n) x++;
                    else y++;
                }
            }
            else
            {
                x=x+sx[z][0];
                y=y+sx[z][1];
            }
        }
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                printf("%3d",a[i][j]);
            }
            printf("\n");
        }
    }
    return 0;
}

方案3(老于):

#include <iostream>
#include <stdlib.h>
#include <iomanip>
using namespace std;
int initializeMatrix(int n,int **matrix){
    int i,j;
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++){
            matrix[i][j]=0;
        }
    }
}
int setMatrix1(int n,int **matrix){
    int i=0,j=0,di=0,dj=0,r=1,flag=0;
    for(;;){
        for(i=di,j=dj-flag;j<n-dj;j++,r++) matrix[i][j]=r; if(di++>=n/2) break;
        for(i=di,j=n-1-dj;i<n-di;i++,r++) matrix[i][j]=r;
        for(;j>0+dj;j--,r++) matrix[i][j]=r; if(dj++>=n/2) break;
        for(;i>0+di;i--,r++) matrix[i][j]=r;
        flag=1;
    }
}
int setMatrix2(int n,int **matrix){
    int i=0,j=0,r=1,v=0,d=1,m=1;
    for(;;){
        if(d%2==1){
            for(i=(d<=n)?d-1:n-1,j=(d<=n)?0:d-n,v=0;v<m;v++,i--,j++) matrix[i][j]=r++;
        }else{
            for(i=(d<=n)?0:d-n,j=(d<=n)?d-1:n-1,v=0;v<m;v++,i++,j--) matrix[i][j]=r++;
        }
        d++;
        m=(d<=n)?d:2*n-d;
        if(r>n*n) break;
    }
}
int setMatrix3(int n,int **matrix){
    int i=0,j=0,r=1;
    for(;;){
        for(i=0;i<n;i++) matrix[i][j]=r++; j++; if(r>=n*n) break;
        for(i=n-1;i>=0;i--) matrix[i][j]=r++; j++; if(r>=n*n) break;
    }
}
int setMatrix(int n,int **matrix,int pattern){
    switch(pattern){
        case 1:setMatrix1(n,matrix);break;
        case 2:setMatrix2(n,matrix);break;
        case 3:setMatrix3(n,matrix);break;
        default:break;
    }
}
int showMatrix(int n,int **matrix){
    int i,j;
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++){
            cout<<setw(3)<<matrix[i][j];
            cout<<" ";
        }
        cout<<endl;
    }
}
int input(int *n,int *pattern){
    bool flag=0;
    cout<<"dimension:";
    cin>>*n;
    if(*n>0&&*n<16) flag=1;else{cout<<"dimension illegal"<<endl;return 0;}
    cout<<"pattern:";
    cin>>*pattern;
    if(*pattern>0&&*pattern<=3) flag=1;else{cout<<"pattern illegal"<<endl;return 0;}
    return flag;
}
int main(){
    int i,j,n,r,**matrix,pattern;
    char key='y';
    for(;;){
        if(key=='y'){
            if(!input(&n,&pattern)) continue;
            matrix=(int **)malloc(sizeof(int *)*n);
            for(r=0;r<n;r++) matrix[r]=(int *)malloc(sizeof(int)*n);
            initializeMatrix(n,matrix);
        }
        setMatrix(n,matrix,pattern);
        showMatrix(n,matrix);
        for(r=0;r<n;r++) free(matrix[r]);
        free(matrix);
        cout<<"create new matrix?";
        cin>>key;
    }
}

待我学有所成,结发与蕊可好。@夏瑾墨

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值