SEx2-模块化程序设计

普遍存在的问题及建议:

  1. 组员宏定义错误。本次作业有50%以上的同学存在宏定义错误,错误如下:
#define _M1 M1	//这样定义,仅替换M1为_M1,而M1不是字符串
#define _M2 M2

以上代码需要修改为:

#define _M1 "M1"
#define _M2 "M2"
  1. 需定义TRUE/FALSE的宏。
  2. define保护需要包含头文件中的所有内容。
  3. “虚拟组员M1的内务工作别人是看不到的”:需要定义static限制内务函数_M1Task()仅在当前模块访问:
static void _M1Task();

5.头文件中需写函数声明,.c文件中写函数定义。

参考思路

  1. “完成M1要做的内务工作,即发送一条消息在屏幕上"Hello M2, I am M1\n" , 然后检查 M2 的任务是否完成”:因此,M1Task()的任务包括两部分:第一为完成对应的内务工作,第二为检查M2是否完成。
  2. “虚拟组员M1的内务工作别人是看不到的”:为保证其他模块无法调用对应的内务工作,需要将模块的内务工作单独列出为一个函数A(),可利用某关键词将该函数A()限定为仅能在该模块内访问。为使外部能够调用该模块的任务函数M1Task(),需要将该函数暴露出去。
    M1模块需要包含如下内容:
static void _M1Task();	//内务工作,不可被外部访问
void M1Task();			//M1任务,暴露给外部访问
  1. 针对M2模块,需提供M2Task()函数给外部访问。并提供内务函数供自己模块调用。
    M2模块需要包含如下内容:
static void _M2Task();	//内务工作,不可被外部访问
void M2Task();			//M2任务,暴露给外部访问
#define TRUE 1
#define FALSE 0
static int flag = FALSE;//仅当前模块访问,记录M2模块是否完成签到任务。
int testM2();			//暴露给外部测试M2是否签到完成的功能
  1. M*Task()函数,可以自行设定参数及返回值类型。
  2. 该系统限定文件写入模式为"w+",在管理员模式下输出到屏幕的签到信息,可以不必从文件中读取。

完整可运行代码:

整个文件组织如下:

  • 学号.h
#ifndef _NO
#define _NO
#include <stdio.h>
#define M1 "M1"						//自行定义M1和M2的签到id
#define M2 "M2"
#define ME "12345"						//管理员的签到id
#define FILE_NAME "checkin.dat"			//保存签到信息的文件名
void memberSignin(FILE *fp, char* memberID);
#endif
  • 学号.c
#include "学号.h"
#include "M1.h"
#include "M2.h"
#include <string.h>
#include <time.h>
#include <stdlib.h>
int main() {
	char str[100];
	FILE * fp;
	fp = fopen(FILE_NAME, "w+");
	if(fp!=NULL) {
		while(scanf("%s", str)!=EOF) {
			memberSignin(fp, str);
		}
		fclose(fp);
	}
	else {
		printf("Error : File Open Failed.\n");
		exit(-1);
	}
} 
void memberSignin(FILE *fp, char* memberID){
	//以静态数组保存每次签到的信息,可以不用从文件中读取。 
	static char memberArray[10][100];
	//简要记录时钟信息。 
	static clock_t memberClock[10];
	static int memberArrayLen = 0;
	if(strcmp(memberID, ME)==0) {
		int i=0;
		for(;i<memberArrayLen;i++) {
			printf("%s %d\n", memberArray[i], memberClock[i]);
		}
	}
	else if(strcmp(memberID, M1)==0) {
		memberClock[memberArrayLen] = clock();
		fprintf(fp, "%s %d\n", memberID, memberClock[memberArrayLen]);
		strcpy(memberArray[memberArrayLen++], memberID);
		M1Task();
	}
	else if(strcmp(memberID, M2)==0) {
		memberClock[memberArrayLen] = clock();
		fprintf(fp, "%s %d\n", memberID, memberClock[memberArrayLen]);
		strcpy(memberArray[memberArrayLen++], memberID);
		M2Task();
	}
	else {
		printf("Input Error.\n");
		fclose(fp);
		exit(-1);
	}
}
  • M1.h
#ifndef _M1
#define _M1
void M1Task();
static void _M1Task();
#endif
  • M1.c
#include "M1.h"
#include "M2.h"
#include <stdio.h>
void M1Task() {
	_M1Task();
	if(testM2()) {
		printf("Its OK\n");
	}
	else {
		printf("Not finished yet\n");
	}
}
static void _M1Task(){
	printf("Hello M2, I am M1\n");
}

  • M2.h
#ifndef _M2
#define _M2
#define TRUE 1
#define FALSE 0
void M2Task();
static void _M2Task();
int testM2();
#endif
  • M2.c
#include "M2.h"
#include <stdio.h>
static int flag = FALSE; 
void M2Task(){
	_M2Task();
}
static void _M2Task(){
	printf("Hello M1, I am M2\n");
	flag = TRUE;
}
int testM2(){
	return flag;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值