题目从键盘任意输入某班10个学生的成绩(成绩类型为整型),保存到数组中,并输出成绩由高到低的排序结果。
(提高:输入学生数n,用malloc申请对应的存储空间存放学生成绩(用指向整型数据的指针实现),然后对成绩进行排序)
你的程序不符合题意啊,要用malloc,你没有用
把int a[10];
修改为
int *a = (int *)malloc(sizeof(int) * 10);
在结尾加上
free(a);
不知道你这个问题是否已经解决, 如果还没有解决的话:#include <stdio.h>
#include <stdlib.h>
char ** Function1()
{
char **Arr = NULL;
char i = 0, j = 0;
char Brr[3][3] = {"123", "456", "789"};
Arr = (char **)malloc(sizeof(char *) * 3);
for (i = 0; i < 3; i++)
{
Arr[i] = (char *)malloc(sizeof(char) * 3);
for (j = 0; j < 3; j++)
{
Arr[i][j] = Brr[i][j];
}
}
return Arr;
}
int main(int argc, const char *argv[])
{
char **p = NULL;
int i = 0, j = 0;
p = Function1();
printf ("Arr[0][0] = %c\n", *(*p)); // 1
printf ("Arr[0][1] = %c\n", *(*(p) + 1)); // 2
printf ("Arr[0][2] = %c\n", *(*(p) + 2)); // 3
printf ("Arr[1][0] = %c\n", *(*(p + 1))); // 4
printf ("Arr[1][1] = %c\n", *(*(p + 1) + 1)); // 5
printf ("Arr[1][2] = %c\n", *(*(p + 1) + 2)); // 6
printf ("Arr[2][0] = %c\n", *(*(p + 2))); // 7
printf ("Arr[2][1] = %c\n", *(*(p + 2) + 1)); // 8
printf ("Arr[2][2] = %c\n", *(*(p + 2) + 2)); // 9
// 将保存每一行的指针先释放掉
for (i = 0; i < 3; i++)
{
if (*(p + i) != NULL)
{
free (*(p + i));
*(p + i) = NULL;
printf ("free *(p + %d) success!!!\n", i);
}
}
// 最后将保存整个二维数组的指针释放掉
if (p != NULL)
{
free (p);
printf ("free p success!!!\n");
}
return 0;
}
该代码没有明显错误,可以正确地输入10个学生成绩并按照从高到低排序输出。
如果要改善该代码,可以考虑以下几点:
输入校验: 在输入学生成绩时,可以对每个输入做校验,确保输入的是合法的整数,避免非法输入导致程序异常退出。
错误处理: 使用动态内存分配时,需要考虑内存分配失败的情况,并给出相应的错误提示。
函数封装: 在代码较为复杂时,可以把功能相似的代码封装成函数,提高代码的可读性和复用性。
以下是对上述改进点的实现示例:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int* get_grades(int n);
void bubble_sort(int* arr, int n);
void print_grades(int* arr, int n);
int main() {
int n = 10;
int* grade = get_grades(n);
bubble_sort(grade, n);
printf("成绩从高到低排列为:\n");
print_grades(grade, n);
free(grade);
return 0;
}
int* get_grades(int n) {
int* grade = (int*)malloc(sizeof(int) * n);
if (grade == NULL) { // 内存分配失败
printf("内存分配失败\n");
exit(-1);
}
printf("请输入%d个学生的成绩:\n", n);
for (int i = 0; i < n; i++) {
char input[256]; // 定义字符数组
int j = 0;
scanf("%s", input); // 接收字符串
while (input[j]) { // 判断每个字符是否都是数字
if (!isdigit(input[j])) {
printf("输入有误,请重新输入:\n");
scanf("%s", input); // 再次接收字符串
j = 0; // 从头开始检查
}
else {
j++;
}
}
grade[i] = atoi(input); // 字符串转为整数
}
return grade;
}
void bubble_sort(int* arr, int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1 - i; j++) {
if (arr[j] < arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
void print_grades(int* arr, int n) {
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}