利用指针指定打印二维数组的某行某列的元素
#include <stdio.h>double er(double abcd[], int x, int y)
{
int a, b;
double* p;
a:
printf("输入你要打印的元素。(格式:行,列)\n");
scanf_s("%d,%d", &a, &b);
if (a > x || b > y)
{
printf("你输入的行或者列错误。");
goto a;
}
p = *abcd;
printf("%f", *(*(p+a-1)+(b-1)));//**************在这里他说读取位置错误
return(0);
}
void 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;
}
er(ab, a, b);
}
如题,想问问要怎么改,头大 你好!这段代码有一些问题,我们一步一步来解决。
问题1:函数er中的指针数组p并没有正确初始化,导致出现错误。
问题2:在函数main中,变量d和f在循环内没有重置,导致第二次调用er函数时,输入的行和列数有误。
我将逐步为您解决这些问题。以下是修改后的代码:
#include <stdio.h>
void printElement(double abcd[], int x, int y) {
int a, b;
double* p = *abcd; // 修正指针p的初始化方式
a:
printf("输入你要打印的元素。(格式:行,列)\n");
scanf_s("%d,%d", &a, &b);
if (a > x || b > y || a <= 0 || b <= 0) { // 添加对输入行列数小于等于0的检查
printf("你输入的行或者列错误。\n");
goto a;
}
printf("%f", *(p + (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;
}
printElement(ab, a, b);
return 0;
}
现在,代码应该能够正确地读取并打印指定行和列的元素了。
请注意,在编程中,尽量避免使用 goto 语句,因为它会导致程序结构变得混乱,不易于理解和维护。我们可以使用循环来替代 goto 语句,使代码更加清晰和健壮。 根据您提供的C代码,在函数er中,指针p的使用有一些问题。正确的做法是将p指向二维数组的某一行,然后通过指针访问该行的元素。
另外,还可以优化代码结构,去掉不必要的goto语句,并且建议将参数类型double abcd[]改为更具通用性的double** abcd。
以下是修改后的代码示例:
#include <stdio.h>
double er(double** abcd, int x, int y) {
int a, b;
printf("输入你要打印的元素。(格式:行,列)\n");
scanf_s("%d,%d", &a, &b);
if (a > x || b > y) {
printf("你输入的行或者列错误。\n");
return 0;
}
double* p = *(abcd + a - 1);
printf("%f\n", *(p + b - 1)); // 访问指定行列的元素
return 0;
}
void 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);
}
}
er(ab, a, b);
// 释放动态分配的内存
for (int i = 0; i < a; i++) {
free(ab);
}
free(ab);
}
这段代码利用指针指定打印二维数组的某行某列的元素。首先,根据用户输入的行数和列数动态分配二维数组空间。然后,通过调用er函数指定要打印的行和列,并输出对应位置的元素值。
请注意,在使用动态内存分配(malloc和free)时,需要包含头文件stdlib.h。
希望这样的修改能够解决您的问题。如果您有更多疑问,请随时提出。
如果问题已经解决,请设置最佳答案 你的代码存在一些问题。下面是修改后的代码,可以通过指针打印二维数组的指定行和列的元素:
#include <stdio.h>
void printElement(double* arr, int x, int y, int row, int col) {
double* p = arr + (row - 1) * y + (col - 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);
}
}
int row, col;
printf("输入要打印的元素的行和列。(格式:行,列)\n");
scanf_s("%d,%d", &row, &col);
if (row > a || col > b) {
printf("输入的行或列错误。\n");
return 0;
}
printElement(&ab, b, a, row, col);
return 0;
}
这个修改后的代码使用printElement函数来打印二维数组的指定行和列的元素。函数中的指针p通过偏移计算找到对应的元素,并进行打印。在main函数中,先读取输入的二维数组元素,然后再读取要打印的元素的行和列,并调用printElement函数进行打印。注意,二维数组的行数和列数在传递给printElement函数时需要调换位置。 根据你提供的代码,我看到了一些问题,我将进行修正并给出修改后的代码:
#include <stdio.h>
void 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;
}
printf("%f\n", abcd);
}
int main() {
double ab = { 0 };
int a, b, 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` 函数修改为 `scanf`,因为 `scanf_s` 在某些编译器中可能不支持。
2. 在 `er` 函数中,添加了对输入行和列的合法性检查,如果行或列超出范围或为负数,会输出错误信息并要求重新输入。
3. 将 `int` 类型的 `main` 函数的返回类型修改为 `int`。
4. 添加了 `return 0;` 语句作为 `main` 函数的返回值。
5. 修正了在 `printf` 语句中 `%f` 前面缺少换行符 `\n` 的问题。
如果回答对你有帮助,请给我一个最佳答案!{:10_254:}{:10_254:}{:10_254:} Mike_python小 发表于 2023-8-1 18:13
根据你提供的代码,我看到了一些问题,我将进行修正并给出修改后的代码:
必须是使用指针,如果不是有这个前提我也不会头大 Sorawithcat 发表于 2023-8-1 15:19
必须是使用指针,如果不是有这个前提我也不会头大
#include <stdio.h>
void 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;
}
printf("%f\n", *(abcd + (a-1)*y + (b-1)));
}
int main() {
double ab = { 0 };
int a, b, 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;
}
Mike_python小 发表于 2023-8-1 18:29
我按照这个的代码然后输出结果为0
#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", *(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;
} Sorawithcat 发表于 2023-8-1 15:56
我按照这个的代码然后输出结果为0
#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 * y + b));
}
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;
}
这个呢{:10_245:} 学习编程中的Ben 发表于 2023-8-1 18:11
你的代码存在一些问题。下面是修改后的代码,可以通过指针打印二维数组的指定行和列的元素:
这个修改后 ...
我按照这个代码输出结果为0
#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, b, a);
} Mike_python小 发表于 2023-8-1 18:57
这个呢
还是0{:10_266:} Sorawithcat 发表于 2023-8-1 16:01
还是0
{:5_104:} 问题描述:这段代码中有几个问题,我帮你解决。
#include <stdio.h>
double er(double abcd[], int x, int y)
{
int a, b;
double* p;
a:
printf("输入你要打印的元素。(格式:行,列)\n");
scanf_s("%d,%d", &a, &b);
if (a > x || b > y)
{
printf("你输入的行或者列错误。\n");
goto a;
}
p = *abcd;
printf("%f", *(*(p + a - 1) + (b - 1))); //**在这里他说读取位置错误
return (0);
}
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;
}
er(ab, a, b);
return 0;
}
修改后的代码解释:
1. void main() 应该改为 int main(),main 函数需要返回一个整数类型的值。
2. 在 er 函数中,double* p; 应该改为 double (*p);,以声明一个指向 double 类型的指针。
3. 在 main 函数中,行数和列数的输入前应该加上换行符 \n,方便用户输入。
4. 增加一个 return 0; 语句在 main 函数的末尾。
这些修改应该能解决代码中的问题。如果还有其他问题,请随时提问。
如果回答对你有帮助,请给我一个最佳答案!{:10_254:}{:10_254:}{:10_254:}
Mike_python小 发表于 2023-8-1 19:02
我单步调试了一下,应该是最后取值出了问题,其他都没问题 Sorawithcat 发表于 2023-8-1 19:04
我单步调试了一下,应该是最后取值出了问题,其他都没问题
最佳给我呗 Sorawithcat 发表于 2023-8-1 16:04
我单步调试了一下,应该是最后取值出了问题,其他都没问题
{:10_257:}就是说解决了? 学习编程中的Ben 发表于 2023-8-1 19:04
问题描述:这段代码中有几个问题,我帮你解决。
还是错误的代码,错误原因和我一样 Sorawithcat 发表于 2023-8-1 19:08
还是错误的代码,错误原因和我一样
我看一下 Mike_python小 发表于 2023-8-1 19:05
就是说解决了?
没,我指的是那个地方出了问题,但是问题没解决 Sorawithcat 发表于 2023-8-1 16:10
没,我指的是那个地方出了问题,但是问题没解决
{:10_266:}
页:
[1]
2