为什么无法输出?
#include<stdio.h>
int main()
{
int n = 0;//学生人数
int k = 0;//第k名学生
char num[][10] = {"\0"};//存放学号,如90777001
char(*pnum)[10];
pnum = num;
double grade[101] = { 0 };//存放成绩<=100
double* p = NULL;
p = grade;
scanf("%d %d", &n, &k);
for (int i = 0; i < n; i++)
{
scanf("%s %lf", &num[i][10], &grade[i]);
}
for (int i = 0; i < n - 1; i++)//对成绩从高到低排序
{
for (int j = 0; j < n - 1; j++)
{
if ((*p+j) < (*p+j+1))
{
double temp = (*p+j);
grade[j] = (*p+j+1);
grade[j+1] = temp;
char s = (*pnum+j)[10];
num[j][10] = (*pnum + j + 1)[10];
num[j][10] = s;
}
}
}
printf("%s %g", (*pnum + k - 1), (*p + k - 1));//输出第k名学生的学号和成绩
return 0;
}
【以下回答由 GPT 生成】
问题出在代码的指针使用上有一些错误。下面是具体的问题和解决方案:
在这行代码中:scanf("%s %lf", &num[i][10], &grade[i]);
,应该将&num[i][10]
改为num[i]
,因为num
是一个二维字符数组,而不是一个指向字符数组的指针。所以应该改为:scanf("%s %lf", num[i], &grade[i]);
。
在排序部分的代码中,排序算法部分没有问题,但是在交换成绩和学号时的代码有问题。应该使用中间变量对成绩和学号进行交换,而不是直接赋值。对应的代码应该是: ```c double temp = (p + j); (p + j) = (p + j + 1); (p + j + 1) = temp;
char s[10]; strcpy(s, (pnum + j)); strcpy((pnum + j), (pnum + j + 1)); strcpy((pnum + j + 1), s); ```
注意:为了在排序算法中使用指针,可以使用指针间接访问数组元素。例如,对于grade
数组,可以使用*(p + j)
来访问元素,而对于num
数组,可以使用*(pnum + j)
来访问元素。
下面是修改后的代码:
#include <stdio.h>
#include <string.h>
int main()
{
int n = 0; //学生人数
int k = 0; //第k名学生
char num[][10] = {"\0"}; //存放学号,如90777001
char(*pnum)[10];
pnum = num;
double grade[101] = {0}; //存放成绩<=100
double* p = NULL;
p = grade;
scanf("%d %d", &n, &k);
for (int i = 0; i < n; i++)
{
scanf("%s %lf", num[i], p + i);
}
for (int i = 0; i < n - 1; i++) //对成绩从高到低排序
{
for (int j = 0; j < n - 1 - i; j++)
{
if (*(p + j) < *(p + j + 1))
{
double temp = *(p + j);
*(p + j) = *(p + j + 1);
*(p + j + 1) = temp;
char s[10];
strcpy(s, *(pnum + j));
strcpy(*(pnum + j), *(pnum + j + 1));
strcpy(*(pnum + j + 1), s);
}
}
}
printf("%s %g", *(pnum + k - 1), *(p + k - 1)); //输出第k名学生的学号和成绩
return 0;
}
现在代码应该能够正确输出第k名学生的学号和成绩。
【相关推荐】
char num[][10] = {"\0"};
编译器不知道你的num有多大,这个根据输入的n动态分配。
引用 皆我百晓生 小程序回复内容作答:
程序无法输出的原因是在排序部分的代码中,交换学号和成绩时的赋值操作有误。
首先是成绩的交换,应该是:
double temp = p[j];
p[j] = p[j+1];
p[j+1] = temp;
然后是学号的交换,应该是:
char temp[10];
strcpy(temp, pnum[j]);
strcpy(pnum[j], pnum[j+1]);
strcpy(pnum[j+1], temp);
另外,scanf函数中的%s和%lf格式控制符中不需要使用取地址符&,正确的写法应该是:
scanf("%s %lf", num[i], &grade[i]);
修正后的代码如下:
#include<stdio.h>
int main()
{
int n = 0;//学生人数
int k = 0;//第k名学生
char num[101][10] = {"\0"};//存放学号,如90777001
char (*pnum)[10];
pnum = num;
double grade[101] = { 0 };//存放成绩<=100
double* p = NULL;
p = grade;
scanf("%d %d", &n, &k);
for (int i = 0; i < n; i++)
{
scanf("%s %lf", num[i], &grade[i]);
}
for (int i = 0; i < n - 1; i++)//对成绩从高到低排序
{
for (int j = 0; j < n - 1; j++)
{
if (p[j] < p[j + 1])
{
double temp = p[j];
p[j] = p[j + 1];
p[j + 1] = temp;
char temp[10];
strcpy(temp, pnum[j]);
strcpy(pnum[j], pnum[j + 1]);
strcpy(pnum[j + 1], temp);
}
}
}
printf("%s %g", pnum[k - 1], p[k - 1]);//输出第k名学生的学号和成绩
return 0;
}