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

时间:2009-12-16 16:10:10

标签: c arrays

假设用户输入一个整数“3”,矩阵应为3 X 3并且其中包含一些随机数。 例如:

8 0 2 
6 3 4
5 7 1 

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

但我不知道如何完成它。这是我的代码,我现在该怎么做?

#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;
}

新更新

#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;
}

3 个答案:

答案 0 :(得分:3)

我有一段时间没有使用过c,所以你可能需要调整下面的一些内容,但基本的概念应该成立。

#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;
}

答案 1 :(得分:1)

C中有两种2D阵列,但访问它们的语法混淆相似。一种变化是拥有一个连续的内存范围,包含所有数组值,编译器将内存“折叠”为一个明显的多维形状:

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是最后两个大小。

正如您所看到的,由于尺寸无法在运行时变化,因此这种阵列不适合所有尺寸在运行时变化。

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

答案 2 :(得分:1)

从略微简化你写的内容开始:

#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;
}

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

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

实际上循环非常相似,如果除了显示它之外你不需要对矩阵做任何事情,那么使用数组开始就没有意义(只需使用第二个循环并替换{{1}与mtx[i][j])。