假设用户输入一个整数“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;
}
答案 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]
)。