这个C程序那里错了为什么执行2选项的时候给矩阵赋值会错
本帖最后由 奥普瓯江 于 2018-1-11 15:55 编辑给矩阵赋值会出现错误不能赋值到指定位置应该赋值给第一行第五个但是他却斜向赋值了。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void welcome(void);
int my_scanf(void);
int *matrix(void);
int my_printf(int *ppt);
void my_tow(int *ptr);
void my_three(int *ptr);
void welcome()
{
printf("============================\n");
printf("*欢迎使用该程序,指令如下*\n");
printf("*1.生成一个 M*N 的矩阵 *\n");
printf("*2.初始化矩阵 *\n");
printf("*3.给矩阵中某个元素赋值 *\n");
printf("*4.读取矩阵中某个元素 *\n");
printf("*5.打印整个矩阵 *\n");
printf("*6.结束程序 *\n");
printf("============================\n");
}
int my_scanf(void)
{
int num;
printf("请输入一个指令: ");
scanf("%d", &num);
if (num < 1 || num > 6)
{
printf("你输入的数字错误请从新输入");
}
return num;
}
int*matrix(void)
{
static int *full = NULL;
static int i, j;
printf("请输入新矩阵规模(M * N) ->");
scanf("%d*%d", &i, &j);
full = (int *)realloc(full, sizeof(int) * (i * j + 2));
if(full == NULL)
{
printf("你的矩阵未创建成功");
exit(1);
}
else
{
printf("%d*%d的矩阵以创建成功", i, j);
}
full = i;
full = j;
return full;
}
void my_tow(int *ptr)
{
int n = ptr;
int m = ptr;
int *matrix = ptr + 2;
int num;
printf("你想出使化指针的数值是多少 ->");
scanf("%d", &num);
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
*((matrix + i) + j) = num;
}
}
}
void my_three(int *ptr)
{
int i, j;
int number;
printf("请输入要修改的位置(行,列) ->");
scanf("%d*%d", &i, &j);
putchar('\n');
printf("请输入一个数字:");
scanf("%d", &number);
putchar('\n');
*((ptr + i - 1) + (j + 1)) = number;
}
int my_printf(int *ptr)
{
int n = ptr;
int m = ptr;
int *matrix = ptr + 2;
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
/*printf("%-3d",matrix);*/
printf("%-3d", *((matrix + i) + j));
}
putchar('\n');
}
}
int main(void)
{
welcome();
int i;
int *ptr = NULL;
while((i = my_scanf()) != 6)
{
switch(i)
{
case 1 :
{
ptr = matrix();
putchar('\n');
putchar('\n');
break;
}
case 2 :
{
my_tow(ptr);
putchar('\n');
putchar('\n');
break;
}
case 3 :
{
my_three(ptr);
putchar('\n');
putchar('\n');
break;
}
case 4 :
{
my_printf(ptr);
putchar('\n');
break;
}
case 5 :
{
my_printf(ptr);
putchar('\n');
break;
}
}
}
return 0;
}
这个程序我又改了一下成为了现在这样但是还是不对,想请教一下大神给解答一下、
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void welcome(void);
int my_scanf(void);
int *my_matrix(void);
int my_printf(int *ptr);
void my_tow(int *ptr);
void my_three(int *ptr);
void welcome()
{
printf("============================\n");
printf("*欢迎使用该程序,指令如下*\n");
printf("*1.生成一个 M*N 的矩阵 *\n");
printf("*2.初始化矩阵 *\n");
printf("*3.给矩阵中某个元素赋值 *\n");
printf("*4.读取矩阵中某个元素 *\n");
printf("*5.打印整个矩阵 *\n");
printf("*6.结束程序 *\n");
printf("============================\n");
}
int my_scanf(void)
{
int num;
printf("请输入一个指令: ");
scanf("%d", &num);
if (num < 1 || num > 6)
{
printf("你输入的数字错误请从新输入");
}
return num;
}
int*my_matrix(void)
{
static int *full = NULL;
int i, j;
printf("请输入新矩阵规模(M * N) ->");
scanf("%d*%d", &i, &j);
full = (int *)realloc(full, sizeof(int) * (i * j + 2));
if(full == NULL)
{
printf("你的矩阵未创建成功");
exit(1);
}
else
{
printf("%d*%d的矩阵以创建成功", i, j);
}
full = i;
full = j;
return full;
}
void my_tow(int *ptr)
{
int n = ptr;
int m = ptr;
int *matrix = ptr + 2;
int num;
printf("你想出使化指针的数值是多少 ->");
scanf("%d", &num);
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
*((matrix + j) + i) = num;
}
}
}
void my_three(int *ptr)
{
int x, y;
int number;
int *matrix = ptr + 2;
printf("请输入要修改的位置(行,列) ->");
scanf("%d,%d", &x, &y);
putchar('\n');
printf("请输入一个数字:");
scanf("%d", &number);
putchar('\n');
*((matrix + (x - 1)) + (y - 1)) = number;
}
int my_printf(int *ptr)
{
int n = ptr;
int m = ptr;
int *matrix = ptr + 2;
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
printf("%-3d", *((matrix + i) + j));
}
putchar('\n');
}
}
int main(void)
{
welcome();
int i;
int *ptr = NULL;
while((i = my_scanf()) != 6)
{
switch(i)
{
case 1 :
{
ptr = my_matrix();
putchar('\n');
putchar('\n');
break;
}
case 2 :
{
my_tow(ptr);
putchar('\n');
putchar('\n');
break;
}
case 3 :
{
my_three(ptr);
putchar('\n');
putchar('\n');
break;
}
case 4 :
{
my_printf(ptr);
putchar('\n');
break;
}
}
}
free(ptr);
return 0;
} 索引方式错了
*((ptr + i - 1) + (j + 1)) = number;改为 *(ptr+i*j-1) = number;
printf("%-3d", *((matrix + i) + j)); 改为 printf("%-3d",*(matrix+i*j-1)); qq1242009750 发表于 2018-1-10 16:38
索引方式错了
*((ptr + i - 1) + (j + 1)) = number;改为 *(ptr+i*j-1) = number;
printf("%-3d", *((m ...
没明白能在给解释一下么 5行5列的地址应该是和1行1列偏移多少呢5*5-1*1,明白了吗 sp1ral 发表于 2018-1-11 15:59
5行5列的地址应该是和1行1列偏移多少呢5*5-1*1,明白了吗
我说的是我的这个程序,错在哪里了,二楼说的那个方法我试了,编译后并没有解决问题,还麻烦了 我用手机回的帖子,你试试看对不对
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void welcome(void);
int my_scanf(void);
int *my_matrix(void);
int my_printf(int *ptr);
void my_tow(int *ptr);
void my_three(int *ptr);
void welcome()
{
printf("============================\n");
printf("*欢迎使用该程序,指令如下*\n");
printf("*1.生成一个 M*N 的矩阵 *\n");
printf("*2.初始化矩阵 *\n");
printf("*3.给矩阵中某个元素赋值 *\n");
printf("*4.读取矩阵中某个元素 *\n");
printf("*5.打印整个矩阵 *\n");
printf("*6.结束程序 *\n");
printf("============================\n");
}
int my_scanf(void)
{
int num;
printf("请输入一个指令: ");
scanf("%d", &num);
if (num < 1 || num > 6)
{
printf("你输入的数字错误请从新输入");
}
return num;
}
int*my_matrix(void)
{
static int *full = NULL;
int i, j;
printf("请输入新矩阵规模(M * N) ->");
scanf("%d*%d", &i, &j);
full = (int *)realloc(full, sizeof(int) * (i * j + 2));
if(full == NULL)
{
printf("你的矩阵未创建成功");
exit(1);
}
else
{
printf("%d*%d的矩阵以创建成功", i, j);
}
full = i;
full = j;
return full;
}
void my_tow(int *ptr)
{
int n = ptr;
int m = ptr;
int *matrix = ptr + 2;
int num;
printf("你想出使化指针的数值是多少 ->");
scanf("%d", &num);
/*for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
*((matrix + j) + i) = num;
}
}*/
//你在创建内存空间的时候是1维数组,赋值按1维赋值就可以了
for (i=0;i<m*n;i++)
{
*(matrix+i)=num;
}
}
void my_three(int *ptr)
{
int x, y;
int number;
int *matrix = ptr + 2;
printf("请输入要修改的位置(行,列) ->");
scanf("%d,%d", &x, &y);
putchar('\n');
printf("请输入一个数字:");
scanf("%d", &number);
putchar('\n');
//*((matrix + (x - 1)) + (y - 1)) = number; 需要行的值*x-1
*(matrix+((x-1)*ptr)+(y))=number;
}
int my_printf(int *ptr)
{
int n = ptr;
int m = ptr;
int *matrix = ptr + 2;
/*for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
printf("%-3d", *((matrix + i) + j));
}
putchar('\n');
}*/
for(int i=0;i<n*m;i++)
{
printf("%-3d", *(matrix + i);
}
putchar('\n')
}
int main(void)
{
welcome();
int i;
int *ptr = NULL;
while((i = my_scanf()) != 6)
{
switch(i)
{
case 1 :
{
ptr = my_matrix();
putchar('\n');
putchar('\n');
break;
}
case 2 :
{
my_tow(ptr);
putchar('\n');
putchar('\n');
break;
}
case 3 :
{
my_three(ptr);
putchar('\n');
putchar('\n');
break;
}
case 4 :
{
my_printf(ptr);
putchar('\n');
break;
}
}
}
free(ptr);
return 0;
} sp1ral 发表于 2018-1-12 09:30
我用手机回的帖子,你试试看对不对
#include
#include
我改了两处,经过测试这回程序可以按照我的思路执行了,主要是我赋值和打印的时候有错误。{:9_238:}
#include<stdio.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void welcome(void);
int my_scanf(void);
int *my_matrix(void);
int my_printf(int *ptr);
void my_tow(int *ptr);
void my_three(int *ptr);
void welcome()
{
printf("============================\n");
printf("*欢迎使用该程序,指令如下*\n");
printf("*1.生成一个 M*N 的矩阵 *\n");
printf("*2.初始化矩阵 *\n");
printf("*3.给矩阵中某个元素赋值 *\n");
printf("*4.读取矩阵中某个元素 *\n");
printf("*5.打印整个矩阵 *\n");
printf("*6.结束程序 *\n");
printf("============================\n");
}
int my_scanf(void)
{
int num;
printf("请输入一个指令: ");
scanf("%d", &num);
if (num < 1 || num > 6)
{
printf("你输入的数字错误请从新输入");
}
return num;
}
int*my_matrix(void)
{
static int *full = NULL;
int i, j;
printf("请输入新矩阵规模(M * N) ->");
scanf("%d*%d", &i, &j);
full = (int *)realloc(full, sizeof(int) * (i * j + 2));
if(full == NULL)
{
printf("你的矩阵未创建成功");
exit(1);
}
else
{
printf("%d*%d的矩阵以创建成功", i, j);
}
full = i;
full = j;
return full;
}
void my_tow(int *ptr)
{
int n = ptr;
int m = ptr;
int *matrix = ptr + 2;
int num;
printf("你想出使化指针的数值是多少 ->");
scanf("%d", &num);
/*for(int i = 0; i < n; i++)*/
/*{*/
/*for(int j = 0; j < m; j++)*/
/*{*/
/**((matrix + j * n) + i) = num;*/
/*}*/
/*}*/
//你在创建内存空间的时候是1维数组,赋值按1维赋值就可以了
for (int i=0;i<m*n;i++)
{
*(matrix+i)=num;
}
}
void my_three(int *ptr)
{
int x, y;
int n = ptr;
int m = ptr;
int number;
int *matrix = ptr + 2;
printf("请输入要修改的位置(行,列) ->");
scanf("%d,%d", &x, &y);
putchar('\n');
printf("请输入一个数字:");
scanf("%d", &number);
putchar('\n');
//*((matrix + (x - 1)) + (y - 1)) = number; 需要行的值*x-1
/**(matrix+((x-1)*ptr)+(y))=number;*/
//这里也改一下了
*(matrix + ((x - 1) * m + (y - 1)))=number;
}
int my_printf(int *ptr)
{
int n = ptr;
int m = ptr;
int *matrix = ptr + 2;
/*for(int i = 0; i < n; i++)
* {
*for(int j = 0; j < m; j++)
{
printf("%-3d", *((matrix + i) + j));
}
putchar('\n');
}*/
/* for(int i=0; i < n*m; i++)*/
/*{*/
/*printf("%-3d", *(matrix + i));*/
/*}*/
//输出我更改成这样了,这样输出能输出成矩阵
for(int i=0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
printf("%-3d", *(matrix + i * m + j));
}
putchar('\n');
}
putchar('\n');
}
int main(void)
{
welcome();
int i;
int *ptr = NULL;
while((i = my_scanf()) != 6)
{
switch(i)
{
case 1 :
{
ptr = my_matrix();
putchar('\n');
putchar('\n');
break;
}
case 2 :
{
my_tow(ptr);
putchar('\n');
putchar('\n');
break;
}
case 3 :
{
my_three(ptr);
putchar('\n');
putchar('\n');
break;
}
case 4 :
{
my_printf(ptr);
putchar('\n');
break;
}
}
}
free(ptr);
return 0;
}
页:
[1]