实验目的
一、熟悉C 语言中函数的编程方法;
二、掌握C 语言中函数定义和调用方法;
三、掌握数组作为函数参数的编程方法。
实验要求
本次实验不要求提交正式实验报告,但要求实验完成后,将程序及程序的运行结果依次拷贝到一个word文档中,统一形成一个.doc文档后提交至Blackboard。文档名可用你的姓名+你的学号。
实验内容
本次实验要求定义5个函数,使用参考程序调用这5个自定义
函数。
(第一个函数)定义一个函数Cal_gcd(int m, int n),计算两个正整数m和n的最大公约数,函数Cal_gcd的返回值为m和n的最大公约数。
算法步骤参考如下:
(1) 当前的两个整数相等吗?相等,该数就是最大公约数,结束循环.
(2) 将两个整数中较大的一个数用这两个整数的差替代.
(3) 循环转移到(1)
(第二个函数)定义一个函数Cal_mcm(int m, int n),计算两个正整数m和n的最小公倍数,函数Cal_mcm的返回值为m和n的最小公倍数。
两个正整数m 与n 的最小公倍数mcm 计算方法如下: 设gcd 为这两个数的最大公约数,则
最小公倍数 mcm = m × n / gcd
(第三个函数)编写一个函数myBubbleSort(int array[], int n),使用冒泡排序法对数组array中的前n个元素(n也可理解为数组array的大小)进行由小到大排序。此函数无返回值。
(第四个函数)编写一个函数mySelectSort(int array[], int n),使用选择排序法对数组array中的前n个元素进行由大到小排序。此函数无返回值。
(第五个函数)编写一个函数myDisplayBar(int array[], int n, char cStar),根据数组array前n个元素的值绘制棒图。cStar为棒图中显示的字符。此函数无返回值。
(参考程序结构如下:)
#include "stdio.h"
#include "time.h"
#include "stdlib.h"
#define NUM 20
/*定义的5个函数可放于此行的下面*/
void main(void)
{
int myArr[NUM], k, a, b;
srand((unsigned)time(NULL));
a= rand()%100+1;
b= rand()%100+1;
printf("\n%d和%d的最大公约数为%d \n",a, b, Cal_gcd(a, b) );
printf("\n%d和%d的最小公倍数为%d \n",a, b, Cal_mcm(a, b) );
fflush(stdin);
getchar();
for(k=0; k<NUM; k++)
myArr[k] = rand()%50+1;
printf("\n%d个随机数及其棒图:\n",NUM);
myDisplayBar (myArr, NUM, ‘*’);
printf("\n\n等待键盘打回车后进行冒泡排序......");
fflush(stdin);
getchar();
myBubbleSort(myArr, NUM);
printf("\n冒泡排序后的结果及其棒图:\n");
myDisplayBar (myArr, NUM, ‘+’);
printf("\n\n等待键盘打回车后进行选择排序......");
fflush(stdin);
getchar();
mySelectSort(myArr, NUM);
printf("\n选择排序后的结果及其棒图:\n");
myDisplayBar (myArr, NUM, ‘@’);
printf("\n\n等待键盘打回车后结束");
fflush(stdin);
getchar();
}
实验代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>
#define NUM 20
int my_max(int a, int b){
if (a >= b) {
return a;
}
else {
return b;
}
}
int my_min(int a, int b) {
if (a <= b) {
return a;
}
else {
return b;
}
}
//最大公约数
int Cal_gcd(int m, int n) {
if (m == n) return m;
int t = 0;
while (m != n) {
t = abs(m - n);
if (my_max(m, n) == m) m = t;
else n = t;
}
return m;
}
//最小公倍数
int Cal_mcm(int a, int b) {
return a * b / Cal_gcd(a, b);
}
//冒泡排序
void myBubbleSort(int array[], int n) {
int i, j, temp;
for (i = 0; i < n - 1; i++) {
for (j = 0; j < n - i - 1; j++) {
if (array[j] > array[j + 1]) {
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
//选择排序
void mySelectSort(int array[], int n) {
int i, j, max_idx, temp;
for (i = 0; i < n - 1; i++) {
max_idx = i;
for (j = i + 1; j < n; j++) {
if (array[j] > array[max_idx]) {
max_idx = j;
}
}
temp = array[i];
array[i] = array[max_idx];
array[max_idx] = temp;
}
}
//打印棒图
void myDisplayBar(int array[], int n, char cStar) {
int i;
for (i = 0; i < n; i++) {
printf("[%2d]", i);
printf(" ");
printf("%2d", array[i]);
printf(" ");
int j;
for (j = 0; j < array[i]; j++) {
printf("%c", cStar);
}
printf("\n");
}
}
void main(void)
{
int myArr[NUM], k, a, b;
srand((unsigned)time(NULL));
a = rand() % 100 + 1;
b = rand() % 100 + 1;
printf("\n%d和%d的最大公约数为%d \n", a, b, Cal_gcd(a, b));
printf("\n%d和%d的最小公倍数为%d \n", a, b, Cal_mcm(a, b));
fflush(stdin);
getchar();
for (k = 0; k < NUM; k++)
myArr[k] = rand() % 50 + 1;
printf("\n%d个随机数及其棒图:\n", NUM);
myDisplayBar(myArr, NUM, '*');
printf("\n\n等待键盘打回车后进行冒泡排序......");
fflush(stdin);
getchar();
myBubbleSort(myArr, NUM);
printf("\n冒泡排序后的结果及其棒图:\n");
myDisplayBar(myArr, NUM, '+');
printf("\n\n等待键盘打回车后进行选择排序......");
fflush(stdin);
getchar();
mySelectSort(myArr, NUM);
printf("\n选择排序后的结果及其棒图:\n");
myDisplayBar(myArr, NUM, '@');
printf("\n\n等待键盘打回车后结束");
fflush(stdin);
getchar();
}
运行结果
运行结果一:
运行结果二: