Как написать программу, которая использует 2D массив для генерации матрицы? - PullRequest
0 голосов
/ 16 декабря 2009

Предположим, пользователь вводит целое число «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 ]

3 голосов
/ 16 декабря 2009

Я некоторое время не использовал 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 голос
/ 16 декабря 2009

Начиная с небольшого упрощения того, что вы написали:

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

На самом деле циклы настолько похожи, что, если вам не нужно ничего делать с матрицей, кроме ее отображения, нет смысла использовать массив для начала (просто используйте этот второй цикл и замените mtx[i][j] на rand()).

1 голос
/ 16 декабря 2009

Существует два варианта двумерного массива в C, хотя синтаксис для доступа к любому из них до смешного похож. Один из вариантов состоит в том, чтобы иметь непрерывный диапазон памяти, содержащий все значения массива, с помощью компилятора, «складывающего» память в кажущуюся многомерную форму для вас:

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 - два последних размера.

Как вы можете видеть, поскольку размеры не могут изменяться во время выполнения, этот тип массива не подходит для одного, все измерения могут изменяться во время выполнения.

Для подобных массивов вам нужно начать использовать массивы указателей на массивы вместо многомерных массивов непрерывной памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...