鱼C论坛

 找回密码
 立即注册
查看: 1938|回复: 6

[已解决]这个C程序那里错了为什么执行2选项的时候给矩阵赋值会错

[复制链接]
发表于 2018-1-10 15:12:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 奥普瓯江 于 2018-1-11 15:55 编辑

给矩阵赋值会出现错误不能赋值到指定位置应该赋值给第一行第五个但是他却斜向赋值了。
2018-01-10 15-10-19 的屏幕截图.png
#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[0] = i; 
                full[1] = j; 
                
                return full;

}

void my_tow(int *ptr)
{
                int n = ptr[0];
                int m = ptr[1];
                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[0];
                int m = ptr[1];
                int *matrix = ptr + 2;

                for(int i = 0; i < n; i++)
                {
                                for(int j = 0; j < m; j++)
                                {
                                                /*printf("%-3d",matrix[i * 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 = 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[0] = i; 
                full[1] = j; 
                
                return full;

}

void my_tow(int *ptr)
{
                int n = ptr[0];
                int m = ptr[1];
                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[0];
                int m = ptr[1];
                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;
}
最佳答案
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[0] = i;
                full[1] = j;
               
                return full;

}

void my_tow(int *ptr)
{
                int n = ptr[0];
                int m = ptr[1];
                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[0])+(y))=number;
               

}

int my_printf(int *ptr)
{
                int n = ptr[0];
                int m = ptr[1];
                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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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));
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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 ...

没明白能在给解释一下么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-11 15:59:26 From FishC Mobile | 显示全部楼层
5行5列的地址应该是和1行1列偏移多少呢5*5-1*1,明白了吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-11 23:48:24 | 显示全部楼层
sp1ral 发表于 2018-1-11 15:59
5行5列的地址应该是和1行1列偏移多少呢5*5-1*1,明白了吗

我说的是我的这个程序,错在哪里了,二楼说的那个方法我试了,编译后并没有解决问题,还麻烦了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-12 09:30:48 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
我用手机回的帖子,你试试看对不对
#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[0] = i;
                full[1] = j;
               
                return full;

}

void my_tow(int *ptr)
{
                int n = ptr[0];
                int m = ptr[1];
                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[0])+(y))=number;
               

}

int my_printf(int *ptr)
{
                int n = ptr[0];
                int m = ptr[1];
                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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-14 09:30:57 | 显示全部楼层
sp1ral 发表于 2018-1-12 09:30
我用手机回的帖子,你试试看对不对
#include
#include

我改了两处,经过测试这回程序可以按照我的思路执行了,主要是我赋值和打印的时候有错误。
#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[0] = i;
        full[1] = j;
               
        return full;

}

void my_tow(int *ptr)
{
                int n = ptr[0];
        int m = ptr[1];
        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[0];
                int m = ptr[1];
        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[0])+(y))=number;*/

                //这里也改一下了
                *(matrix + ((x - 1) * m + (y - 1)))=number;
               

}

int my_printf(int *ptr)
{
                int n = ptr[0];
        int m = ptr[1];
        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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-1 07:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表