总体要求:
一般每题要求四个函数,输入函数可以从in.dat中读数据,也可用rand()函数自行产生,输出函数完成把结果输出到屏幕或文件的任务,核心处理函数完成题目规定的要求,main()函数要求以尽可能友好、对程序使用安全的界面完成调用其它函数的任务。
一.排序求平均值(包括将数拆散,求奇偶数、求最大最小值)。
1.该程序设计四个函数:ReadDat()随机产生100个学生成绩存放到数组aa中,随机产生100个相应的学号存放到bb数组中,jsSort()函数的功能是:对aa数组进行降序排列。最后调用函数WriteDat()输出排序后的成绩和相应的学号。在main()函数中调用以上函数。
这道题在我看来主要有两点:1.随机数的产生
2.排序问题
对于这两个问题,分别通过伪随机数发生器和冒泡排序来解决
#include
#include/*包含伪随机数发生器的库 */
#include/*包含time函数的库*/
/*伪随机数发生器每次生成的随机数不同应结合srand函数和time函数。*/
int aa[100];
int bb[100]; /*全局变量,aa数组:成绩;bb数组:学号 */void ReadDat(int arr[], int nlen)/*产生100个随机成绩 */
{
int i;
srand( (unsigned)time( NULL ) );/* srand()函数产生一个以当前时间开始的随机种子.应该放在for等循环语句前面 不然要很长时间等待*/
for (i=0; i{
arr[i] = rand() % 100;/*rand 功 能::伪随机数发生器;所属库:stdlib.h;需要先调用srand初始化,一般用当前日历时间初始化随机数种子,这样每次执行代码都可以产生不同的随机数。*/
} /*rand()%max ,max为最大值,其随机域为0~max-1*/
}void RANDNUM(int arr[], int nlen)/*产生100个随机学号 */
{
int i;
srand( (unsigned)time( NULL ) );
for (i=0; i{
arr[i] = rand() % 100;/*希望产生形如2011**的学号,所以要求其产生100以内随机数 */
}
}void jsSort(int arr[], int nlen)/*降序排列 这里用了冒泡排序。 时间复杂度为O(n^2)*/
{
int i,j;
for (i=0; ifor (j=0; j {
if (arr[j] < arr[j+1])
{
int nTemp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = nTemp;
}
}
}
/*在这里写下感受,为什么用冒泡,而不是用时间复杂度为O(nlogn,底数为2)的快排,主要是因为冒泡简单,稳定*/
void WriteDat()/*输出排序后的成绩和相应的学号 */
{
int i;
printf("学号: 成绩:
");
for (i=0; i<100; i++)
{
printf(" %5d %d
", bb[i]+201100, aa[i]);/*bb[]+201100可以形成形如2011**的学号样式,此步骤可以放在 产生随机学号那里
,代码可做如下修改arr[i] = rand() % 100+201100;*/
}
/* while(1);死循环,为了在DEV-C++下看到结果,运行是注释掉 */
}main()/*主函数,四次函数调用 */
{
ReadDat(aa, 100);/*成绩 */
jsSort(aa, 100);/*排序 */
RANDNUM(bb, 100); /*学号 */
WriteDat();/*输出 */
}
DEV-C++ 4.9.9.2编译通过