深圳大学-电信院-C程序设计实验-函数使用编程

实验目的

一、熟悉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();
}

运行结果

运行结果一:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
运行结果二:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值