c语言程序设计实验报告

实验报告必须有以下内容:
1. 实验内容描述与需求分析
2. 概要设计(数据结构、算法设计)
3. 调试、分析与实验结果
4. 总结
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>

#define WRITER 1 // 生产者数目

#define READER 2 // 消费者数目

#define MAXNUM 10 // 缓冲数目

int num2=1,num1=1;//读者,写者次数
pthread_mutex_t rmutex; // 读者互斥信号量, 一次只有一个线程访问缓冲
pthread_mutex_t wmutex; // 写者互斥信号量, 一次只有一个线程访问缓冲
int rcount;//现在读者数目
int r_id = 0; //读者id

void *R(void *arg)//读者
{

int id = ++r_id;
while(num2 <= MAXNUM)
{
// 用sleep的数量可以调节读者和写者的速度,便于观察
sleep(2);

pthread_mutex_lock(&rmutex);//开始读
if( rcount==0 )
pthread_mutex_lock(&wmutex);//判定是否在写
rcount+=1;
pthread_mutex_unlock(&rmutex);//也给别读者一起读
printf("%d 号读者,开始第 %d次读书 \n", id, num2);
sleep(2);
pthread_mutex_lock(&rmutex);//读完
rcount-=1;
if( rcount==0 )
pthread_mutex_unlock(&wmutex);//判定是否可以写
printf("%d 号读者,读完\n", id);
pthread_mutex_unlock(&rmutex);//读者读完
num2+=1;
}
return NULL;
}

void *W(void *arg)//写者
{
while(num1 <= MAXNUM)
{
// 用sleep的数量可以调节读者和写者的速度,便于观察
sleep(1);
pthread_mutex_lock(&wmutex);//开始写
printf("写者第 %d次写书 \n", num1);
sleep(3);
pthread_mutex_unlock(&wmutex);//写完
num1+=1;
}
return NULL;
}

int max(int a, int b)
{
return (a>b)? a : b;
}

int main()

{
pthread_t id1[WRITER];

pthread_t id2[READER];

int i;
int ret[max(READER,WRITER)];// 初始化同步信号量

// 创建N个写者线程
for(i = 0; i < WRITER; i++)

{
ret[i] = pthread_create(&id1[i], NULL, &W, (void *)(&i));

if(ret[i] != 0)

{
printf("Writer %d creation failed \n", i);
exit(1);
}
}
//创建N个读者线程

for(i = 0; i < READER; i++)

{
ret[i] = pthread_create(&id2[i], NULL, &R, NULL);

if(ret[i] != 0)

{
printf("Reader %d creation failed \n", i);
exit(1);
}
}
//销毁线程
pthread_join(id1[0],NULL);

pthread_join(id2[0],NULL);

printf("OK,结束!\n");

exit(0);

}
那位大侠帮我分析下,谢谢了

五、 课程设计小结心得体会
1设计思想
1)、设定一个一维数组,可先按员工序号设定每位员工的工资
2)、利用While语句和Prinft语句完成用户菜单的设计
功能为:第1项 设为员工编号和工资数据
第2项 设为修改员工工资数据
第3项 设为查询员工工资数据
第4项 设为结束系统
3)、当用户选择1、2项时,需输入员工编号,所以需要设计编号校正功能,如果出错可输出“The error employe number”
4)、当选择2时,进行工资数据的修改,并将新数据存回该员工的工资数组中
5)、利用for循环中判断语句,将用户工资数与数组中的工资数进行比较,如相同则输出,将计数器加1,如此下去,直到把整个数组遍历一遍
6)、判断计数器是否为0, 是0表示找不到相符的工资,如果不为0,则输出共查出几比相符的工资
以上当然里面也涉及了“函数的模块化”理念,可以避免但需要重复打印头文件时重复编写打印信头的语句。像这样的程序是多见的,这样不但降低了程序还发效率,而且耗时浪费资源“共用体”的使用简化了程序的“复杂”性,正如(4)中,学号与姓名同时表示一个人,但在函数使用了“共用体”,从而程序的简单可以便于纠错,查找问题,避免了代码的重复,这样就给编译时带来了一定的难度与“量”的繁杂。一般不采取这样的做法,力求“简单、明了、清晰”。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-06-23
慢慢来吧
第2个回答  2019-02-24
#include<graphics.h>
#include<math.h>
#include<dos.h>
#define
pi
3.1415926
#define
X(a,b,c)
x=a*cos(b*c*pi/180-pi/2)+300;
#define
Y(a,b,c)
y=a*sin(b*c*pi/180-pi/2)+240;
#define
d(a,b,c)
X(a,b,c);Y(a,b,c);line(300,240,x,y)
void
init()
{int
i,l,x1,x2,y1,y2;
setbkcolor(1);
circle(300,240,200);
circle(300,240,205);
circle(300,240,5);
略……
#include<graphics.h>
#include<math.h>
#include<dos.h>
#define
pi
3.1415926
#define
X(a,b,c)
x=a*cos(b*c*pi/180-pi/2)+300;
#define
Y(a,b,c)
y=a*sin(b*c*pi/180-pi/2)+240;
#define
d(a,b,c)
X(a,b,c);Y(a,b,c);line(300,240,x,y)
void
init()
{int
i,l,x1,x2,y1,y2;
setbkcolor(1);
circle(300,240,200);
circle(300,240,205);
circle(300,240,5);
略……
#include<graphics.h>
#include<math.h>
#include<dos.h>
#define
pi
3.1415926
#define
X(a,b,c)
x=a*cos(b*c*pi/180-pi/2)+300;
#define
Y(a,b,c)
y=a*sin(b*c*pi/180-pi/2)+240;
#define
d(a,b,c)
X(a,b,c);Y(a,b,c);line(300,240,x,y)
void
init()
{int
i,l,x1,x2,y1,y2;
setbkcolor(1);
circle(300,240,200);
circle(300,240,205);
circle(300,240,5);
略……
#include<graphics.h>
#include<math.h>
#include<dos.h>
#define
pi
3.1415926
#define
X(a,b,c)
x=a*cos(b*c*pi/180-pi/2)+300;
#define
Y(a,b,c)
y=a*sin(b*c*pi/180-pi/2)+240;
#define
d(a,b,c)
X(a,b,c);Y(a,b,c);line(300,240,x,y)
void
init()
{int
i,l,x1,x2,y1,y2;
setbkcolor(1);
circle(300,240,200);
circle(300,240,205);
circle(300,240,5);
略……
相似回答