奥普瓯江 发表于 2018-1-10 15:12:21

这个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;
}

qq1242009750 发表于 2018-1-10 16:38:06

索引方式错了
*((ptr + i - 1) + (j + 1)) = number;改为 *(ptr+i*j-1) = number;
printf("%-3d", *((matrix + i) + j)); 改为 printf("%-3d",*(matrix+i*j-1));

奥普瓯江 发表于 2018-1-11 01:54:01

qq1242009750 发表于 2018-1-10 16:38
索引方式错了
*((ptr + i - 1) + (j + 1)) = number;改为 *(ptr+i*j-1) = number;
printf("%-3d", *((m ...

没明白能在给解释一下么

sp1ral 发表于 2018-1-11 15:59:26

5行5列的地址应该是和1行1列偏移多少呢5*5-1*1,明白了吗

奥普瓯江 发表于 2018-1-11 23:48:24

sp1ral 发表于 2018-1-11 15:59
5行5列的地址应该是和1行1列偏移多少呢5*5-1*1,明白了吗

我说的是我的这个程序,错在哪里了,二楼说的那个方法我试了,编译后并没有解决问题,还麻烦了

sp1ral 发表于 2018-1-12 09:30:48

我用手机回的帖子,你试试看对不对
#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;
}

奥普瓯江 发表于 2018-1-14 09:30:57

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]
查看完整版本: 这个C程序那里错了为什么执行2选项的时候给矩阵赋值会错