一.目的
1.熟悉变量的指针和指向变量的的指针变量的概念和使用
2.熟悉数组的指针和指向数组的的指针变量的概念和使用
3. 掌握冒泡法或选择法排序的算法
4. 掌握函数的定义、调用、声明,以及参数的两种传递方式
二、实习环境
Visual Studio 2022
三.实习内容与步骤
1.定义一个数组stu[10]存放10个学生的成绩,从键盘输入数据,要求用指针实现
2.将数组stu[10]的内容输出到屏幕上,要求用指针实现
3.将成绩数组按照从高到低进行排序,要求用指针实现
4.将第三步内容放在函数中实现,在主函数中调用实现排序,用指针实现,输出排序后的成绩单
5. 采用指针方法,输入字符串“student score ”,复制该字符串并输出(复制字符串采用库函数或用户自定义函数)
6.在实习报告中画出程序流程图,说明程序设计的算法,附主要程序段及运行结果(屏幕截图)。
7. 在实习报告中说明知识点。
8.在实习报告中说明程序设计过程中的难点、解决办法及编程小结或体会。
四.程序流程图、算法及运行结果
程序流程图
算法描述
1.声明变量stu、p、q、r、s、i、j、temp;
2.输入10个学生的成绩,将结果存放到stu数组中;
3.输出stu数组内容;
4.对stu数组降序排序,使用双重循环,外层循环控制每一轮比较的起始位置,内层循环控制比较过程:
i.将p指针指向当前起始位置,将q指针指向p位置之后的第一个数;
ii.比较p和q位置的数,如果*p<*q,则交换p和q指向的数;
iii.然后将q指针后移一位,重复上述操作直到q指针到达数组末尾;
iv.最后将p指针后移一位,继续进行下一轮比较;
5.输出stu数组内容;
6.输入一行字符串,使用fgets函数读入字符串并存放到s数组中;
7.将s数组中的字符串复制到r数组中;
8.输出字符串数组s中的内容;
9.结束程序。
程序代码
#include<stdio.h>
#include<string.h>
//用于交换两个数的函数
void swap(int* p, int* q)
{
int temp;
temp = *p;
*p = *q;
*q = temp;
}
int main()
{
int stu[10];
int* p, * q;
char* r;
char s[100];
int i, j;
int temp;
printf("输入10个学生的成绩:\n");
for (p = stu; p < stu + 10; p++) scanf("%d", p);//存放10个学生的成绩
printf("输出10个学生的成绩:\n");
for (p = stu; p < stu + 10; p++) printf("%d ", *p);//将内容输出到屏幕上
for (p = stu; p < stu + 9; p++) {
for (q = p + 1; q < stu + 10; q++) {
if (*p < *q) {
/*temp = *p;
*p = *q;
*q = temp;*/
swap(p, q);//交换两个数
}
}
}
printf("\n降序输出10个学生的成绩:\n");
for (p = stu; p < stu + 10; p++) printf("%d ", *p);//将内容降序输出到屏幕上
r = s;
printf("\n输入字符串:\n");
getchar();//吸收输入缓冲区中的换行符
fgets(r,100,stdin);//输入字符串
strcpy(s, r);//复制字符串
printf("输出字符串:\n");
printf("%s\n", s);//输出字符串
return 0;
}
运行结果
五、知识点、难点及解决办法。
知识点
1.指针的使用:通过指针变量p和q存储和访问数组stu中的数据,分别实现遍历和交换操作。
2.函数定义和调用:程序中自定义一个swap函数,用于交换两个整数,然后在排序过程中多次调用该函数。
3.数组和循环结构:程序定义了一个长度为10的int类型数组stu,存储了10个学生的成绩,并利用双层for循环实现了选择排序算法,将数组元素按降序排序。
4.字符串的输入输出:程序使用fgets函数从标准输入流中获取一行字符串,并使用strcpy函数将获取到的字符串内容赋值给另一个字符数组s,最后将这个字符串输出
5.用char型指针访问字符串,指针指向字符串的首字符
难点及解决办法
1.scanf输入字符串遇到空格就会停止输入,所以改用fgets输入一行
2.在用fgets输入字符串前,缓冲区中有换行符,导致fgets遇到这个换行符会停止输入,所以用getchar()吸收换行符
3.在输入字符串到char型指针r前,应该先给指针赋值
六、编程小结或体会。
总的来说,该程序代码的是实现还是比较简单的,不过有一些细节还是要注意的,比如getchar()吸收换行符,在输入字符串到char型指针前要先给指针赋值,还有自定义函数swap传的是地址而不是值。程序涉及的知识点都是比较基础的,熟练掌握这些知识点对于编写和调试程序都非常重要。通过编写这个程序,我感觉自己对c语言的掌握程度有所提高,特别是对指针的理解和使用更加熟练了,同时也认识到仍有很多不足,需要日后的不断练习来提高自己的编程能力