Sorawithcat 发表于 2023-8-1 19:16:39

利用指针指定打印二维数组的某行某列的元素

本帖最后由 Sorawithcat 于 2023-8-1 19:32 编辑

刚刚出了个乌龙
请用刚刚开始学二维数组和指针的萌新看的懂的代码解决{:10_266:}
就是只用我写的代码用的东西,不要再用什么头文件了{:10_266:}
#include <stdio.h>

double er(double *abcd, int x, int y)
{
        int a, b;
a:
        printf("输入你要打印的元素。(格式:行,列)\n");
        scanf_s("%d,%d", &a, &b);
        if (a > x || b > y || a <= 0 || b <= 0)
        {
                printf("你输入的行或者列错误。");
                goto a;
        }
        double* p = abcd + (a - 1) * y + (b - 1);
        printf("%f\n", *p);
}


int main()
{
        double ab = { 0 };
        int a, b;
        int d = 0, f = 0;
        printf("输入二维数组的行数。\n");
        scanf_s("%d", &a);
        printf("输入二位数组的列数。\n");
        scanf_s("%d", &b);
        printf("依次输入二维数组的元素。\n");
        for (;d < a;d++)
        {
                for (;f < b;f++)
                {
                        scanf_s("%lf", &ab);
                }
                f = 0;
        }
        d = 0;
        f = 0;
        er(&ab, a, b);
}

isdkz 发表于 2023-8-1 19:17:01

这段代码的目标是通过指定行和列,打印二维数组中的某个元素。然而,代码存在一些问题,特别是在处理二维数组和指针操作时。

我将对代码进行修改,并提供注释以解释每个步骤的作用。

#include <stdio.h>

double er(double *abcd, int x, int y)
{
    int a, b;
a:
    printf("输入你要打印的元素。(格式:行,列)\n");
    scanf("%d,%d", &a, &b);
    if (a > x || b > y || a <= 0 || b <= 0)
    {
      printf("你输入的行或者列错误。");
      goto a;
    }
    double* p = abcd + (a - 1) * y + (b - 1); // 修正计算指定元素地址的错误
    printf("%f\n", *p);
}

int main()
{
    double ab = { 0 };
    int a, b;
    int d = 0, f = 0;
    printf("输入二维数组的行数。\n");
    scanf("%d", &a);
    printf("输入二维数组的列数。\n");
    scanf("%d", &b);
    printf("依次输入二维数组的元素。\n");
    for (; d < a; d++)
    {
      for (; f < b; f++)
      {
            scanf("%lf", &ab);
      }
      f = 0;
    }
    d = 0;
    f = 0;
    er(&ab, a, b); // 修正传递参数的错误
}


对于二维数组的处理,我们需要使用正确的行和列来计算元素的地址。在C语言中,二维数组是按行存储的,因此我们需要调整计算指定元素地址的方式。修正后的计算方式为:

double* p = abcd + (a - 1) * y + (b - 1);


同时,函数er调用时的参数也需要修正为a和b ,而不是b和a 。

修正后的代码应该可以正确地打印出指定行和列的二维数组元素。

Mike_python小 发表于 2023-8-1 19:17:26


#include <stdio.h>

double er(double *abcd, int x, int y)
{
    int a, b;

read_input:
    printf("输入你要打印的元素。(格式:行,列)\n");
    scanf("%d,%d", &a, &b);
    if (a > x || b > y || a <= 0 || b <= 0)
    {
      printf("你输入的行或者列错误。\n");
      goto read_input;
    }

    double *p = abcd + (a - 1) * y + (b - 1); // 计算指向所需元素的指针位置
    printf("%f\n", *p);
}

int main()
{
    double ab = { 0 };
    int a, b;
    int d = 0, f = 0;

    printf("输入二维数组的行数。\n");
    scanf("%d", &a);
    printf("输入二维数组的列数。\n");
    scanf("%d", &b);

    printf("依次输入二维数组的元素。\n");
    for (;d < a;d++)
    {
      for (;f < b;f++)
      {
            scanf("%lf", &ab);
      }
      f = 0;
    }

    er(&ab, a, b);
    return 0;
}


修改内容如下:
1. 移除 scanf_s 函数中的 _s 后缀。
2. 修复换行符 \n 的转义错误。
3. 在输入提示的标签处添加 read_input: 标签。
4. 将 double* p = abcd + (a + 1) * y + (b - 1); 修改为 double *p = abcd + (a - 1) * y + (b - 1);,以修正计算指向所需元素的指针位置。
5. 在 main 函数中,修复换行符的转义错误。
6. 移除 scanf_s 函数中的 _s 后缀。
7. 在内层循环结束后,添加 f = 0; 以重置循环计数器。
8. 添加 return 0; 以返回一个整数类型的值。

希望这次能够满足你的需求,如果还有其他问题,请随时提问。

如果回答对你有帮助,请给我一个最佳答案!{:10_254:}{:10_254:}{:10_254:}

学习编程中的Ben 发表于 2023-8-1 19:18:01

#include <stdio.h>

void printElement(double *arr, int x, int y) {
    int a, b;
    printf("输入你要打印的元素。(格式:行,列)\n");
    scanf_s("%d,%d", &a, &b);
    if (a > x || b > y) {
      printf("你输入的行或者列错误。\n");
      printElement(arr, x, y); // 输入错误时递归调用自身重新输入
      return;
    }
    double *p = arr + (a - 1) * y + (b - 1);
    printf("%f\n", *p);
}

int main() {
    double ab = { 0 };
    int a, b;
    printf("输入二维数组的行数。\n");
    scanf_s("%d", &a);
    printf("输入二维数组的列数。\n");
    scanf_s("%d", &b);
    printf("依次输入二维数组的元素。\n");
    for (int i = 0; i < a; i++) {
      for (int j = 0; j < b; j++) {
            scanf_s("%lf", &ab);
      }
    }
    printElement(&ab, a, b);
   
    return 0;
}

这个有指针了

学习编程中的Ben 发表于 2023-8-1 19:20:41

我现在这个有指针了!!!

Sorawithcat 发表于 2023-8-1 19:20:43

学习编程中的Ben 发表于 2023-8-1 19:18
这个有指针了

但是输出为0

学习编程中的Ben 发表于 2023-8-1 19:22:10

Sorawithcat 发表于 2023-8-1 19:20
但是输出为0

#include <stdio.h>

void printElement(double **arr, int x, int y) {
    int a, b;
    printf("输入你要打印的元素。(格式:行,列)\n");
    scanf_s("%d,%d", &a, &b);
    if (a > x || b > y) {
      printf("你输入的行或者列错误。\n");
      printElement(arr, x, y); // 输入错误时递归调用自身重新输入
      return;
    }
    double *p = *(arr + a - 1) + b - 1;
    printf("%f\n", *p);
}

int main() {
    int a, b;
    printf("输入二维数组的行数。\n");
    scanf_s("%d", &a);
    printf("输入二维数组的列数。\n");
    scanf_s("%d", &b);

    double **ab = new double*;
    for (int i = 0; i < a; i++) {
      ab = new double;
    }

    printf("依次输入二维数组的元素。\n");
    for (int i = 0; i < a; i++) {
      for (int j = 0; j < b; j++) {
            scanf_s("%lf", &ab);
      }
    }

    printElement(ab, a, b);

    // 释放内存
    for (int i = 0; i < a; i++) {
      delete[] ab;
    }
    delete[] ab;

    return 0;
}

Sorawithcat 发表于 2023-8-1 19:23:37

学习编程中的Ben 发表于 2023-8-1 19:22


9 error{:10_266:}

Mike_python小 发表于 2023-8-1 19:24:12

Sorawithcat 发表于 2023-8-1 16:23
9 error

#include <stdio.h>

void er(double *abcd, int x, int y)
{
    int a, b;
a:
    printf("输入你要打印的元素。(格式:行,列)\n");
    scanf_s("%d,%d", &a, &b);
    if (a > x || b > y || a <= 0 || b <= 0)
    {
      printf("你输入的行或者列错误。");
      goto a;
    }
    printf("%f\n", *(abcd + (a - 1) * y + (b - 1)));
}

int main()
{
    double ab = {0};
    int a, b;
    int d = 0, f = 0;
    printf("输入二维数组的行数。\n");
    scanf_s("%d", &a);
    printf("输入二位数组的列数。\n");
    scanf_s("%d", &b);
    printf("依次输入二维数组的元素。\n");
    for (; d < a; d++)
    {
      for (; f < b; f++)
      {
            scanf_s("%lf", &ab);
      }
      f = 0;
    }
    d = 0;
    f = 0;
    er(&ab, a, b);
    return 0;
}

学习编程中的Ben 发表于 2023-8-1 19:25:15

Sorawithcat 发表于 2023-8-1 19:23
9 error

#include <stdio.h>
#include <stdlib.h>

void printElement(double **arr, int x, int y) {
    int a, b;
    printf("输入你要打印的元素。(格式:行,列)\n");
    scanf_s("%d,%d", &a, &b);
    if (a > x || b > y || a <= 0 || b <= 0) {
      printf("你输入的行或者列错误。\n");
      printElement(arr, x, y); // 输入错误时递归调用自身重新输入
      return 0;
    }
    double *p = *(arr + a - 1) + b - 1;
    printf("%f\n", *p);
}

int main() {
    int a, b;
    printf("输入二维数组的行数。\n");
    scanf_s("%d", &a);
    printf("输入二维数组的列数。\n");
    scanf_s("%d", &b);

    double **ab = (double**)malloc(a * sizeof(double*));
    for (int i = 0; i < a; i++) {
      ab = (double*)malloc(b * sizeof(double));
    }

    printf("依次输入二维数组的元素。\n");
    for (int i = 0; i < a; i++) {
      for (int j = 0; j < b; j++) {
            scanf_s("%lf", &ab);
      }
    }

    printElement(ab, a, b);

    return 0;
}

Sorawithcat 发表于 2023-8-1 19:30:04

Mike_python小 发表于 2023-8-1 19:24


这个代码和我的差不多吧行数输入大于2时输出为0

学习编程中的Ben 发表于 2023-8-1 19:32:17

Sorawithcat 发表于 2023-8-1 19:30
这个代码和我的差不多吧行数输入大于2时输出为0

https://blog.csdn.net/weixin_44074246/article/details/116445909

学习编程中的Ben 发表于 2023-8-1 19:34:07

https://blog.csdn.net/zzy979481894/article/details/124678972

Sorawithcat 发表于 2023-8-1 19:37:44

学习编程中的Ben 发表于 2023-8-1 19:32
https://blog.csdn.net/weixin_44074246/article/details/116445909

我这里主要是传参的时候搞不懂{:10_266:}就是在学这个

学习编程中的Ben 发表于 2023-8-1 19:42:16

Sorawithcat 发表于 2023-8-1 19:37
我这里主要是传参的时候搞不懂就是在学这个

啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
我也没办法了QAQ

要不你把最佳给我吧,反正也没人会

Mike_python小 发表于 2023-8-1 19:43:37

学习编程中的Ben 发表于 2023-8-1 16:42
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
我也没办法了QAQ



想得美,我不也回答了,你还白嫖一个最佳

Sorawithcat 发表于 2023-8-1 19:44:01

学习编程中的Ben 发表于 2023-8-1 19:42
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
我也没办法了QAQ



万一呢

学习编程中的Ben 发表于 2023-8-1 19:45:47

Sorawithcat 发表于 2023-8-1 19:44
万一呢

看样子你是不会给我了,算了,bye,我去写作业了,QAQ

Sorawithcat 发表于 2023-8-1 19:49:01

学习编程中的Ben 发表于 2023-8-1 19:45
看样子你是不会给我了,算了,bye,我去写作业了,QAQ

头痛{:10_266:}

sfqxx 发表于 2023-8-1 21:59:16

你的代码基本上是正确的,但是你在使用scanf_s函数时,需要注意scanf_s函数是在MSVC编译器中才有的,GCC编译器是没有这个函数的,所以如果你是在GCC编译器下编译的话,需要将scanf_s替换为scanf。

此外,你的代码中没有返回值,er函数和main函数都需要一个返回值。er函数应返回一个double值,而main函数应返回一个int值。

下面是修改后的代码:#include <stdio.h>

double er(double *abcd, int x, int y)
{
    int a, b;
a:
    printf("输入你要打印的元素。(格式:行,列)\n");
    scanf("%d,%d", &a, &b);
    if (a > x || b > y || a <= 0 || b <= 0)
    {
      printf("你输入的行或者列错误。\n");
      goto a;
    }
    double* p = abcd + (a - 1) * y + (b - 1);
    printf("%f\n", *p);
    return *p;
}


int main()
{
    double ab = { 0 };
    int a, b;
    int d = 0, f = 0;
    printf("输入二维数组的行数。\n");
    scanf("%d", &a);
    printf("输入二位数组的列数。\n");
    scanf("%d", &b);
    printf("依次输入二维数组的元素。\n");
    for (;d < a;d++)
    {
      for (;f < b;f++)
      {
            scanf("%lf", &ab);
      }
      f = 0;
    }
    d = 0;
    f = 0;
    er(&ab, a, b);
    return 0;
}这段代码会首先让你输入二维数组的行数和列数,然后依次输入二维数组的元素。接着,程序会提示你输入你想打印的元素的行和列,如果你输入的行或列超出了数组的范围,程序会提示你输入的行或列错误,并让你重新输入。如果你输入的行和列在数组范围内,程序会打印出你指定的元素。

不知道可不可以{:10_245:}
页: [1] 2
查看完整版本: 利用指针指定打印二维数组的某行某列的元素