首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何编写使用2D数组生成矩阵的程序?

如何编写使用2D数组生成矩阵的程序?
EN

Stack Overflow用户
提问于 2009-12-16 16:10:10
回答 3查看 5K关注 0票数 0

假设用户输入一个整数"3",矩阵应该是3X3和一些随机数。例如:

代码语言:javascript
复制
8 0 2 
6 3 4
5 7 1 

我需要使用2D数组来完成它。

但我不知道该怎么做。这是我的代码,我现在该怎么办?

代码语言:javascript
复制
#include "stdafx.h"
#include "stdlib.h"
#include "time.h"

int _tmain(int argc, _TCHAR* argv[])
{

    int num1, num2;


    printf("enter a integer (3-9): ");
    scanf("%d", &num1);

    srand(time(NULL));

    switch (num1)
    {
    case 3: num2 = (rand() % 8);
        break;
    case 4: num2 = (rand() % 15);
        break;
    case 5: num2 = (rand() % 24);
        break;
    case 6: num2 = (rand() % 35);
        break;
    case 7: num2 = (rand() % 48);
        break;
    case 8: num2 = (rand() % 63);
        break;
    case 9: num2 = (rand() % 80);
        break;
    }


    printf("%d  %d\n", num1, num2);

    int s[][] = num1 * num1;



    return 0;
}

新更新

代码语言:javascript
复制
#include "stdafx.h"
#include "stdlib.h" 
#include "time.h"


int _tmain(int argc, _TCHAR* argv[])
{
    int num2 = 0;
    int num=0, i, j;     
    int mtx[9][9] = {0}; 

    while (num < 3 || num > 9) { 
        printf("Enter an integer (3-9): "); 
        scanf("%d", &num); 
    } 
do
{
    srand(time(NULL)); 

    switch (num)
    {
    case 3: num2 = rand() % 8;
        break;
    case 4: num2 = rand() % 15;
        break;
    case 5: num2 = rand() % 24;
        break;
    case 6: num2 = rand() % 35;
        break;
    case 7: num2 = rand() % 48;
        break;
    case 8: num2 = rand() % 63;
        break;
    case 9: num2 = rand() % 80;
        break;
    }


    for (i=0; i < num; ++i) 
        for (j=0; j < num; ++j) 
            mtx[i][j] = num2; 
}
while ( num2 == num2);



    for (i=0; i < num; ++i) { 
    for (j=0; j < num; ++j) 
        printf("%i ", mtx[i][j]); 
    printf("\n"); 
} 



    return 0;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-12-16 19:12:43

首先,稍微简化一下您所写的内容:

代码语言:javascript
复制
#include "stdafx.h"
#include "stdlib.h"
#include "time.h"

int _tmain (int argc, _TCHAR* argv[]) {
    int num=0, i, j;     // Added initializers and loop counters
    int mtx[9][9] = {0}; // Reserve enough space for the worst-case scenario

    while (num < 3 || num > 9) { // Added input validation loop
        printf("Enter an integer (3-9): ");
        scanf("%d", &num);
    }

    srand(time(NULL));

    // Loop through the matrix elements we want, filling each with a random number    
    for (i=0; i < num; ++i)
        for (j=0; j < num; ++j)
            mtx[i][j] = rand();

    /* Do something with the matrix here (display it, etc) */

    return 0;
}

要像上面显示的那样显示矩阵,循环看起来几乎与填充数组的循环相同。

代码语言:javascript
复制
for (i=0; i < num; ++i) {
    for (j=0; j < num; ++j)
        printf("%i ", mtx[i][j]);
    printf("\n");
}

实际上,这些循环非常相似,如果您不需要对矩阵做任何事情,只需显示它,那么首先使用数组就没有意义了(只需使用第二个循环并将mtx[i][j]替换为rand())。

票数 1
EN

Stack Overflow用户

发布于 2009-12-16 16:28:34

我已经有一段时间没有使用c语言了,所以您可能需要使用下面的一些内容,但是基本概念应该适用。

代码语言:javascript
复制
#include "stdafx.h"
#include "stdlib.h"
#include "time.h"

int _tmain(int argc, _TCHAR* argv[])
{

    int num1, num2;

    /* This makes sure the number they enter is between 3 and 9 */
    while (!(num>3)&(num<9)) {
        printf("enter a integer (3-9): ");
        scanf("%d", &num1);
    }


    srand(time(NULL));
    int counter1 = num1;
    int counter2 = num1;

    int intArray[num1][num1]; /*Initialize array*/

    while (counter1 > 0) {
        while (counter2 > 0) {
            intArray[counter1][counter2] = rand(); /*This will be your populated 2D array */
            counter2--;
        }
        counter1--;
        counter2 = num1;
    }


    return 0;
}
票数 2
EN

Stack Overflow用户

发布于 2009-12-16 16:43:48

在C中有两种2D数组,尽管访问这两种数组的语法非常相似。一种方法是有一个连续的内存范围,为您保存所有的数组值,编译器将内存“折叠”成一个明显的多维形状:

代码语言:javascript
复制
int contiguous2DArray[3][4] = { 0, 1, 2, 3,
                                4, 5, 6, 7,
                                8, 9, 10, 11 };
int another2DArray[4][3] = { 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 };
int a3DArray[2][2][3] = { 0, 1, 2,  3, 4, 5,    6, 7, 8,  9, 10, 11 };

/* A series of true statements. */
contiguous2DArray[0][0] == 0;
contiguous2DArray[0][1] == 1;
contiguous2DArray[1][0] == 4;

another2DArray[0][0] == 12;
another2DArray[0][1] == 13;
another2DArray[1][0] == 15;

a3DArray[0][0][0] == 0;
a3DArray[0][0][1] == 1;
a3DArray[0][1][0] == 3;
a3DArray[1][0][0] == 6;

除了最后一个数组大小之外,所有的数组大小都是该类型所必需的一部分。因为这些大小是在编译时知道的,所以编译器知道在增加索引时要跳过所需的数量。最后一个索引总是导致编译器在每次上升一个空格时跳过一个空格。第二,最后一个将跳过n,其中n是最后一个大小,第三个到最后一个将跳过m * n,其中m和n是最后两个大小。

正如您所看到的,由于在运行时大小不能改变,这种数组并不适合于一个数组,所有维度在运行时都可能有所不同。

对于这样的数组,您需要开始使用指向数组的指针数组,而不是连续内存的多维数组。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1915701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档