第一篇:工资管理(C语言课程设计)
#include “stdio.h”
/*I/O函数*/ # include “bios.h” /*ROM基本输入输出函数*/ #include “dos.h”
/*dos接口函数*/ #include “conio.h”
/*屏幕操作函数*/ #include “stdlib.h”
/*其它说明*/ #include “string.h” /*字符串函数*/ #include “mem.h” /*内存操作函数*/ #include “ctype.h” /*字符操作函数*/ #include “alloc.h” /*动态地址分配函数*/ /****变量定义*******/ typedef struct z1
/*定义数据结构*/ {
char no[11];
/*编号*/
char name[15];/*姓名*/
float jbgz;
/*基本工资*/
float koukuan;/*扣款*/
float yfgz;/*应发工资*/
float shuijin;/*税金*/
float sfgz;
/*实发工资*/
struct z1 *prior;/*前驱指针*/
struct z1 *next;/*后继指针*/ }SALARY;
/*结构体类型名*/ struct z1 *First;
/*双链表头指针*/ struct z1 *Last;
/*双链表尾指针*/ /******函数原型*********/ void init();
/*初始化*/ void create();/*创建链表*/ void calc();
/*计算应发工资*/ void delete();/*删除*/ void search();/*查找*/ void save();/*保存文件*/ void load();/*读取文件*/ void computer();/*计算所需各种票面张数*/ void insert();/*插入*/ void append();/*追加*/ void copy();/*复制文件*/ void sort();/*排序*/ void index();/*索引*/ void total();/*分类合计*/ void list();/*显示所有数据*/ void print(SALARY *p);/*输出单条记录*/ void display();/*随意逐条显示*/ float fax(float x);/*计算税金*/
int menu_select();/*主菜单*/ /*******主函数开始**********/ main(){
int i;
clrscr();
for(;;)
{
switch(menu_select())
/*调用菜单函数返回一个整数值*/
{
case 0:init();break;
/*初始化*/
case 1:create();break;/*输入数据创建双链表*/
case 2:list();break;/*显示所有数据*/
case 3:display();break;/*单条显示*/
case 4:calc();break;/*计算实发工资*/
case 5:search();break;/*查找职工信息数据*/
case 6:delete();break;/*删除记录*/
case 7:insert();break;/*插入记录*/
case 8:append();break;/*追加记录*/
case 9:save();break;/*保存文件*/
case 10:load();break;/*读取文件*/
case 11:copy();break;/*复制文件*/
case 12:sort();break;/*按实发工资升序排序*/
case 13:computer();break;/*计算所需票面数*/
case 14:index();break;/*按职工号索引*/
case 15:total();break;/*按部门求合计*/
case 16:exit(0);
/*退出*/
}
} } /*菜单函数,函数返回值为整型,代表所选的菜单项*/ menu_select(){
char *f[]= {
/*定义菜单字符串数组*/
“**************MENU*************”, /*菜单的标题行*/
“ 0.init list”, /*初始化双链表*/
“ 1.Enter list”, /*输入数据,创建双链表*/
“ 2.List all n”, /*显示所有记录*/
“ 3.Display record by step”, /*显示单条记录*/
“ 4.Calc the salary”, /*计算实发工资*/
“ 5.Search record on name”, /*查找记录*/
“ 6.Delete a record”, /*删除记录*/
“ 7.Insert record to list”, /*插入记录*/
“ 8.Append record to file”, /*追加记录*/
“ 9.Save data to the file”, /*保存文件*/
“ 10.Load data from the file”,/*读取文件*/
“ 11.Copy the file to new file”, /*复制文件*/
“ 12.Sort on sfgz”, /*排序*/
“ 13.Computer ticket number”, /*计算所需票面数*/
“ 14.Index on number”, /*索引*/
“ 15.Total on number”, /*分类合计*/
“ 16.Quit” };/*退出*/
char s[80];
int i;
int key=0;/*记录所压键值*/
int c=0;
gotoxy(1,25);/*移动光标*/
printf(“press any key enter menu......n”);/*压任意键进入主菜单*/
getch();
clrscr();/*清屏*/
textcolor(YELLOW);/*设置文本颜色为黄色*/
textbackground(BLUE);/*设置背景颜色为兰色*/
gotoxy(10,2);
putch(0xda);/*输出左上角边框┏*/
for(i=1;i<44;i++)
putch(0xc4);/*输出上边框水平线*/
putch(0xbf);/*输出右上角边框
┓*/
for(i=3;i<22;i++)/*输出左右两边的垂直线*/
{
gotoxy(10,i);putch(0xb3);
gotoxy(54,i);putch(0xb3);
}
gotoxy(10,22);putch(0xc0);/*输出左上角边框┗*/
for(i=1;i<44;i++)
putch(0xc4);/*输出下边框水平线*/
putch(0xd9);/*输出右下角边框┛*/
window(11,3,53,21);/* 制作显示菜单的窗口,大小根据菜单条数设计*/
clrscr();
/*清屏*/
for(i=0;i<18;i++)
{
gotoxy(10,i+1);
cprintf(“%s”,f[i]);/*输出菜单项数组*/
}
i=1;
gotoxy(10,2);/*设置默认选项在第一项*/
textbackground(LIGHTGREEN);/*设置背景颜色为浅绿*/
cprintf(“%s”,f[1]);/*输出菜单项,表示选中*/
gotoxy(10,2);/*移动光标到菜单的第一项*/
while(key!=13)
/*所压键不是回车键时*/
{
while(bioskey(1)==0);/*查询是否压下了一个键*/
key=bioskey(0);
/*返回下一个在键盘压下的键*/
key=key&0xff?key&0xff:key>>8;/*对所压的键进行判断*/
gotoxy(10,i+1);
textbackground(BLUE);/*设置背景颜色为蓝色*/
cprintf(“%s”,f[i]);/*输出菜单项*/
if(key==72)i=i==1?17:i-1;/*如压向上光标键↑,i减1,如已到第一行再上移,则到最后一行*/
if(key==80)i=i==17?1:i+1;/*如压向下光标键↓,i加1,如已到最后一行再下移,则到第一行*/
gotoxy(10,i+1);/*光标移动i的下一项*/
textbackground(LIGHTGREEN);/*将背景颜色设为浅绿*/
cprintf(“%s”,f[i]);/*输出菜单项*/
c=i-1;/*给代表菜单选项的整数赋值*/
}
textbackground(BLACK);/*设置背景颜色为黑色*/
window(1,1,80,25);/*恢复原窗口大小*/
return c;/*返回代表菜单选项的整数值*/ } /*初始化函数*/ void init(){
First=NULL;
Last=NULL;} /*输入数据,创建双链表*/ void create(){
int x;/*记录行坐标*/
int i;/*记录输入记录数*/
int flag=0;/*做结束标记*/
float temp;
/*定义临时变量*/
SALARY *info,*p;/*定义临时变量*/
if(First!=NULL)
init();/*如果头指针为空,调用初始化函数*/
p=First;/*从头指针开始*/
for(;;)
{
if(flag==1)
break;/*如果flag=1,结束输入*/
i=0;
x=0;
/*确定移动的行坐标*/
clrscr();/*清屏*/
gotoxy(1,3);
printf(“*************gongziguanli*************”);/*输出标题*/
gotoxy(1,4);
printf(“
--Enter @ end--”);/*提示输入@结束*/
gotoxy(1,5);
printf(“|-----|”);/*输出表格的起始线*/
gotoxy(1,6);
printf(“|
no
|
name
| jbgz |”);/*输出字段标题,注意空格数*/
for(;;)
{
gotoxy(1,7+x);
printf(“|----------|----------------|--------|”);/*输出表格的水平线*/
info=(SALARY *)malloc(sizeof(SALARY));/*申请一个记录空间*/
if(!info)
{
printf(“nout of memory”);/*如没有得到空间,输出内存溢出信息*/
exit(0);/*退出程序*/
}
info->next=NULL;/*新结点的后继为空*/
info->prior=NULL;/*新结点的前驱为空*/
gotoxy(1,8+x);printf(“|”);/*输出数据间的分割线*/
gotoxy(12,8+x);printf(“|”);
gotoxy(29,8+x);printf(“|”);
gotoxy(38,8+x);printf(“|”);
gotoxy(2,8+x);/*光标到输入编号位置*/
inputs(info->no,10);/*输入编号,并验证长度不超过10*/
if(info->no[0]=='@')
{
flag=1;
break;
} /*编号首字符为@结束输入*/
gotoxy(13,8+x);/*光标到输入姓名位置*/
inputs(info->name,14);/*输入姓名,并验证长度不超过14*/
gotoxy(30,8+x);/*光标到输入基本工资位置*/
scanf(“%f”,&temp);/*输入基本工资到临时变量*/
info->jbgz=temp;/*基本工资赋值*/
info->koukuan=0;/*初始扣款为0,待计算工资时输入*/
info->sfgz=0;/*初始实发工资为0,待计算工资时计算*/
info->shuijin=0;/*初始税金为0,待计算工资时计算*/
info->yfgz=0;/*初始应发工资为0,待计算工资时计算*/
if(p==NULL)/*如果p为空,说明输入的是第一个结点*/
{
First=Last=info;/*头指针和尾指针*/
First->prior=NULL;/*头指针的前驱是空*/
Last->next=NULL;/*尾指针的后继是空*/
}
else /*插入的结点不是第一结点,则插入在头结点之前*/
{
info->next=p;/*新结点的后继指向原来的头结点*/
info->prior=p->prior;/*新结点的前驱指向原来的头结点的前驱*/
p->prior=info;/*原来结点的前驱指向新结点*/
}
p=info;/*新结点变为p结点,暂时的头结点*/
First=info;/*新结点变为头结点*/
x+=2;
/*因为水平线,将光标下移两行*/
gotoxy(1,8+x);
i++;
/*输入记录数加1*/
if(i%9==0)
break;/*输入9个记录,换一页输入*/
}
gotoxy(1,8+x);
}
printf(“|----------|----------------|--------|”);/*输出结尾水平线*/ } /*字符串输入和验证函数*/ inputs(char *s, int count){
char p[255];
do{
scanf(“%s”,p);/*输入字符串*/
if(strlen(p)>count)printf(“n too long!n”);/*进行长度校验,超过count值重输入*/
}while(strlen(p)>count);
strcpy(s,p);/*将输入的字符串拷贝到字符串s中*/ } /*显示链表*/ void list(){
int i=0,n;/*记录输出行数*/
SALARY *p;/*定义移动指针*/
clrscr();/*清屏*/
p=First;/*从头指针开始*/
while(i%10==0&&p!=NULL)/*外循环控制换页*/
{
i=0;
/*记录一页的输出行数*/
clrscr();
/*清屏*/
printf(“nnn”);/*换行三次*/
printf(“*************************************SALARY***********************************n”);
/*输出大标题*/
printf(“|nO
|
name
|
jbgz | koukuan |
yfgz | shuijin |
sfgz |n”);/*输出字段标题*/
printf(“|----------|---------------|---------|---------|---------|---------|---------|n”);/*输出水平线*/
while(p!=NULL)/*当p不为空时*/
{
printf(“|%-10s|%-15s|%9.2f|%9.2f|%9.2f|%9.2f|%9.2f|n”,p->no,p->name,p->jbgz,p->koukuan,p->yfgz,p->shuijin,p->sfgz);
p=p->next;/*指针后移*/
i++;
/*输出行数加1 */
if(i%10==0)
break;/*如果满10行,跳出内循环*/
}
printf(“****************************************end***********************************n”);/*输出本页的结束行*/
printf(“Press any key congtinue...n”);
getch();/*输出一页暂停一下,压任意键继续*/
} /*返回到外循环,准备下一页的输出*/ } /*单条显示记录*/ void display(){
int ch;
/*菜单选项字符*/
SALARY *p;/*定义临时指针*/
clrscr();/*清屏*/
p=First;/*从头指针开始*/
if(p==NULL)/*指针为空,即链表为空,返回主函数*/
{
printf(“record is empty!n”);
return;
}
else
{
print(p);
/*调用输出函数显示头结点信息*/
for(;;)/*循环开始*/
{
printf(“nn0.Quit 1.Prior
2.Next
3.First
4.Last nn”);/*菜单项Quit退出 Prior前驱 Next后继
First第一条 Last最后一条*/
printf(“nplease select 0~4:”);/*提示输入菜单选项0~4*/
scanf(“%d”,&ch);/*输入菜单选项0~4*/
if(ch==0)break;/*如果选项为0,退出*/
switch(ch)
/*开关语句根据选项字符判断*/
{
case 1:p=p->prior;if(p==NULL)p=First;break;/*指向前驱,没有前驱指向第一个*/
case 2:p=p->next;if(p==NULL)p=Last;break;/*指向后继,没有后继指向最后一个*/
case 3:p=First;break;/*指向第一个结点*/
case 4:p=Last;break;/*指向最后一个结点*/
}
print(p);/*调用输出函数显示指针所指结点信息*/
}
} } /*输出指针所指结点信息*/ void print(SALARY *p){
if(p)
/*如果指针不为空,则显示信息*/
{
clrscr();/*清屏*/
printf(“nnn”);/*换行*/
printf(“************************************SALARY************************************n”);/*输出标题信息*/
printf(“|no
|
name
|
jbgz | koukuan|
yfgz | shuijin |
sfgz
|n”);/*输出字段标题*/
printf(“|----------|---------------|---------|---------|---------|---------|---------|n”);/*输出分割线*/
printf(“|%-10s|%-15s|%9.2f|%9.2f|%9.2f|%9.2f|%9.2f|n”, p->no,p->name,p->jbgz,p->koukuan,p->yfgz,p->shuijin,p->sfgz);/*输出结点信息*/
printf(“***************************************end***************************** *******n”);/*输出结束标记*/
} } /*计算实发工资*/ void calc(){
int x;/*行坐标*/
int i=0;/*记录数*/
float temp;/*临时变量扣款*/
SALARY *p;/*移动指针*/
clrscr();
/*清屏*/
p=First;/*从头指针开始*/
while(p!=NULL)/*当p不为空时,也就是有记录时,外循环控制换页*/
{
x=0;
clrscr();
gotoxy(1,3);
printf(“***************************gongziguanli************************************”);
/*输出标题*/
gotoxy(1,5);
printf(“|------------|”);
gotoxy(1,6);/*下面输出字段标题*/
printf(“|
no
|
name
| jbgz | koukuan | yfgz |shuijin | sfgz |”);
while(p!=NULL)/*当p不为空时,也就是有记录时,内循环控制处理9条*/
{
gotoxy(1,7+x);
printf(“|----------|----------------|--------|----------|--------|--------|--------|”);
gotoxy(1,8+x);printf(“|”);
gotoxy(12,8+x);printf(“|”);
gotoxy(29,8+x);printf(“|”);
gotoxy(38,8+x);printf(“|”);
gotoxy(49,8+x);printf(“|”);
gotoxy(58,8+x);printf(“|”);
gotoxy(67,8+x);printf(“|”);
gotoxy(76,8+x);printf(“|”);
gotoxy(2,8+x);
printf(“%-10s”,p->no);/*输出编号*/
gotoxy(13,8+x);
printf(“%-15s”,p->name);/*输出姓名*/
gotoxy(30,8+x);
printf(“%.2f”,p->jbgz);/*输出基本工资*/
gotoxy(39,8+x);
scanf(“%f”,&temp);/*输入扣款*/
p->koukuan=temp;/*扣款字段赋值*/
p->yfgz=p->jbgz-p->koukuan;/*计算应发工资=基本工资-扣款*/
gotoxy(50,8+x);
printf(“%.2f”,p->yfgz);/*输出应发工资*/
gotoxy(59,8+x);
p->shuijin=(p->yfgz-1000)*fax(p->yfgz);/*否则按税率计算税金*/
printf(“%.2f”,p->shuijin);/*输出税金*/
gotoxy(68,8+x);
p->sfgz=p->yfgz-p->shuijin;/*计算实发工资*/
printf(“%-8.2f”,p->sfgz);/*输出实发工资*/
x+=2;
/*行坐标下移两行*/
i++;
/*记录数加1*/
if(i%9==0)break;/*记录数超过9条,跳出内循环*/
p=p->next;
/*指针后移,处理下一条*/
}
gotoxy(1,7+x);
printf(“|----------|----------------|--------|----------|--------|--------|--------|n”);/*输出结束行*/
printf(“Press any key congtinue...n”);
getch();
} } /*根据应发工资,计算税率*/ float fax(float x){
float f1;
if(x<1000)
return 0;
/*小于1000,返回0*/
switch((int)(x/1000))
{
case 1:f1=0.05;break;/*1000~1999,返回0.05*/
case 2:f1=0.1;break;/*2000~2999,返回0.1*/
case 3:f1=0.15;break;/*3000~3999,返回0.15*/
case 4:f1=0.2;break;/*4000~4999,返回0.2*/
default:f1=0.3;break;/*5000以上,返回0.3*/
}
return f1;} /*计算票面张数*/ void computer(){
SALARY *p;
int i=0,a[7]={0},t100,t50,t20,t10,t5,t2,t1;/*设置数组和临时变量保存票面张数*/
float t;
/*过渡变量,保存当前剩余工资*/
p=First;/*移动指针从头指针开始*/
while(p!=NULL)/*当p不为空时*/
{
t100=(int)p->sfgz/100;/*计算100元张数*/
a[0]=a[0]+t100;
/*累加保存*/
t=p->sfgz-t100*100;/*剩余工资*/
t50=(int)(t/50);/*计算50元张数*/
a[1]=a[1]+t50;/*累加保存*/
t=t-t50*50;/*剩余工资*/
t20=(int)(t/20);
/*计算20元张数*/
a[2]=a[2]+t20;/*累加保存*/
t=t-t20*20;/*剩余工资*/
t10=(int)(t/10);/*计算10元张数*/
a[3]=a[3]+t10;/*累加保存*/
t=t-t10*10;/*剩余工资*/
t5=(int)(t/5);/*计算5元张数*/
a[4]=a[4]+t5;/*累加保存*/
t=t-t5*5;/*剩余工资*/
t2=(int)(t/2);/*计算2元张数*/
a[5]=a[5]+t2;/*累加保存*/
t=t-t2*2;/*剩余工资*/
t1=(int)(t);/*计算1元张数*/
a[6]=a[6]+t1;/*累加保存*/
p=p->next;/*指针后移,处理下一条记录*/
}
clrscr();/*清屏*/
printf(“nnn***********ticket number***************n”);/*输出标题*/
printf(“--100-----50------20-----10-----5------2------1------n”);
/*输出张数标题*/
for(i=0;i<7;i++)
printf(“%5d ”,a[i]);/*输出所需的张数*/
printf(“n”);/*换行*/ } /*按编号查找记录*/ SALARY *find(char *no){
SALARY *p;/*定义移动指针*/
p=First;/*从头指针开始*/
while(p)/*当p不为空时*/
{
if(!strcmp(no,p->no))
return p;/*比较相等,查找成功,返回指针*/
p=p->next;/*不相等指针后移*/
}
printf(“not foundn”);/*没有找到*/
return NULL;/*返回为空指针*/ } /*删除结点*/ void delete(){
SALARY *p;/*定义临时变量,p指向要删除的结点p*/
char s[11];/*要删除结点的编号*/
clrscr();/*清屏*/
printf(“please deleted non”);/*提示输入信息*/
scanf(“%s”,s);
/*输入要删除的职工编号*/
if((p=find(s))!=NULL)/*调用查找函数,如果找到做下面的处理*/
{
if(First==p)
/*如果是第一个结点*/
{
First=p->next;/*将头指针指向其后继结点*/
if(First)
/*如头指针不为空*/
First->prior=NULL;/*将头结点的前驱设为空*/
else
Last=NULL;
/*否则头为空,尾也为空*/
}
else
/*删除的不是第一个结点*/
{
p->prior->next=p->next;/*p的前驱的后继指向p原来的后继*/
if(p!=Last)
/*如果p不是最后个结点*/
p->next->prior=p->prior;/*p后继的前驱指向p原来的前驱*/
else
Last=p->prior;/*如p是最后一个结点,修改尾指针为p的前驱*/
}
free(p);/*删除结点后,不要忘记释放空间*/
printf(“n have deleted %s SALARYn”,s);
printf(“Don't forget saven”);
} } /*按姓名查找结点*/ void search(){
SALARY *p;/*移动指针*/
char s[15];/*保存姓名*/
clrscr();/*清屏*/
printf(“please enter name for searchn”);/*提示输入*/
scanf(“%s”,s);/*输入要查找人的姓名*/
p=First;/*移动指针从头指针开始*/
while(strcmp(p->name,s)&&p!=NULL)/*做比较判断*/
p=p->next;
/*没找到,指针后移继续查找*/
if(p==NULL)/*指针为空,说明没有找到*/
printf(“nlist no %s SALARYn”,s);/*显示没找到信息*/
else
{
printf(“nn”);/*换行*/
print(p);/*查找成功,调用输出函数输出指针p所指记录*/
} } /*插入结点*/ void insert(){
SALARY *p,*info;/* info为新结点,p为新结点的后继*/
char s[11];/*保存查找的姓名*/
float temp;/*临时变量*/
clrscr();/*清屏*/
printf(“please enter location before the non”);/*提示输入在哪个结点之前插入*/
scanf(“%s”,s);/*输入指定结点的编号*/
printf(“nplease new recordn”);/*提示输入记录*/
clrscr();/*清屏*/
gotoxy(1,3);/*定位光标,按表格形式输入新结点信息*/
printf(“**************gongziguanli************”);
gotoxy(1,5);
printf(“|-----|”);
gotoxy(1,6);
printf(“|
no
|
name
| jbgz | ”);
gotoxy(1,7);
printf(“|----------|----------------|--------|”);
info=(SALARY *)malloc(sizeof(SALARY));/*申请空间*/
if(!info)
{
printf(“nout of memory”);/*如没有得到空间,内存溢出*/
exit(0);/*退出程序*/
}
info->next=NULL;/*新结点的后继为空*/
info->prior=NULL;/*新结点的前驱为空*/
gotoxy(1,8);printf(“|”);
gotoxy(12,8);printf(“|”);
gotoxy(29,8);printf(“|”);
gotoxy(38,8);printf(“|”);
gotoxy(2,8);
inputs(info->no,10);/*输入新结点的编号,并校验*/
gotoxy(13,8);
inputs(info->name,14);/*输入新结点的姓名,并校验*/
gotoxy(30,8);
scanf(“%f”,&temp);
/*输入基本工资*/
info->jbgz=temp;/*给基本工资字段赋值*/
info->koukuan=0;/*扣款初始为0*/
info->yfgz=0;/*应发工资初始为0*/
info->shuijin=0;/*税金初始为0*/
info->sfgz=0;/*实发工资初始为0*/
printf(“|----------|----------------|--------|”);
p=First;/*移动指针从头指针开始*/
while(strcmp(p->no,s)&&p!=NULL)/*查找结点确定插入位置*/
p=p->next;/*指针后移,继续查找*/
if(p==NULL)/*如p为空*/
if(p==First)/*如p为头指针,说明链表为空*/
{
First=info;/*新结点为头指针*/
First->prior=NULL;/*头结点的前驱为空*/
Last=First;/*唯一结点,尾指针等于头指针*/
}
else /*新结点插在尾部*/
{
Last->next=info;
info->prior=Last;
Last=info;/*尾指针指向新结点*/
}
else
if(p==First)/*p不为空,但p为头指针,新结点插在第一个结点位置*/
{
info->prior=NULL;/*新结点的前驱为空*/
info->next=p;/*新结点的后继为p*/
p->prior=info;/*p的前驱是新结点*/
First=info;/*修改头指针指向新结点*/
}
else /*新结点插入在中间某一个位置p之前*/
{
info->next=p;/*新结点的后继是p*/
info->prior= p->prior;/*新结点的前驱是p的前驱*/
p->prior->next=info;/*p的前驱的后继是新结点*/
p->prior=info;/*p的前驱是新结点*/
}
printf(“nnn----have inserted %s SALARY----n”,info->name);
printf(“n---Don't forget save---n”);/*提醒调用保存文件存盘*/ } /*保存文件*/ void save(){
FILE *fp;/*定义指向文件的指针*/
SALARY *p;/*定义移动指针*/
char outfile[10];/*保存输出文件名*/
clrscr();/*清屏*/
printf(“Enter outfile name,for example c:f1 e.txt:n”);/*提示输入文件名格式信息*/
scanf(“%s”,outfile);
if((fp=fopen(outfile,“wb”))==NULL)/*为输出打开一个二进制文件*/
{
printf(“can not open filen”);
return;/*返回*/
}
printf(“nSaving file......n”);
p=First;/*移动指针从头指针开始*/
while(p!=NULL)/*如p不为空*/
{
fwrite(p,sizeof(SALARY),1,fp);/*写入一条记录*/
p=p->next;/*指针后移,处理下一条记录*/
}
fclose(fp);/*关闭文件*/
printf(“-----save success!-----n”);/*显示保存成功*/ } /*读文件*/ void load(){
SALARY *p,*q=NULL;/*定义记录指针变量*/
FILE *fp;/* 定义指向文件的指针*/
char infile[10];/*保存文件名*/
clrscr();/*清屏*/
printf(“Enter infile name,for example c:f1 e.txt:n”);/*输入文件名格式*/
scanf(“%s”,infile);/*输入文件名*/
if((fp=fopen(infile,“rb”))==NULL)/*打开一个二进制文件,为读方式*/
{
printf(“can not open filen”);/*如不能打开,则结束程序*/
return;/*返回*/
}
while(First)/*当表不为空时,清空链表*/
{
p=First;/*从头指针开始*/
First=First->next;/*删除头结点*/
free(p);/*释放空间*/
}
printf(“n-----Loading file!-----n”);/*显示正在读文件*/
First=(SALARY *)malloc(sizeof(SALARY));/*为头指针申请空间*/
if(!First)/*如果没有得到空间 显示内存溢出*/
{
printf(“out of memory!n”);
return;/*返回*/
}
p=First;/*将头指针赋值给p*/
while(!feof(fp))/*当文件不空时*/
{
if(1!=fread(p,sizeof(SALARY),1,fp))break;/*将记录读到p所指的结点*/
p->next=(SALARY *)malloc(sizeof(SALARY));/*为p的后继申请空间*/
if(!p->next)/*如果没有得到空间显示内存溢出*/
{
printf(“out of memory!n”);
return;/*返回*/
}
p->prior=q;/*得到空间,则链接指针关系p的前驱为q*/
q=p;/*保存p做为新的p结点的前驱*/
p=p->next;/*p指针后移*/
}
q->next=NULL;/*q的后继为空*/
Last=q;/*尾指针为q*/
First->prior=NULL;/*头指针的前驱为空*/
fclose(fp);/*关闭文件*/
printf(“---You have success read data from file!!---n”);/*显示成功读入记录*/ } /*追加记录*/ void append(){
FILE *fp;
/*定义指向文件的指针*/
SALARY *info;/*指向追加信息的指针*/
char infile[10];/*保存文件名*/
float temp;/*临时变量*/
clrscr();/*清屏*/
gotoxy(1,3);
printf(“**************gongziguanli************”);
gotoxy(1,5);
printf(“|-----|”);
gotoxy(1,6);
printf(“|
no
|
name
| jbgz | ”);
gotoxy(1,7);
printf(“|----------|----------------|--------|”);
info=(SALARY *)malloc(sizeof(SALARY));/*申请追加信息的空间*/
if(!info)
{
printf(“nout of memory”);/*没有空间,内存溢出*/
exit(0);/*结束程序*/
}
info->next=NULL;/*新信息的后继为空*/
info->prior=NULL;/*新信息的前驱为空*/
gotoxy(1,8);printf(“|”);
gotoxy(12,8);printf(“|”);
gotoxy(29,8);printf(“|”);
gotoxy(38,8);printf(“|”);
gotoxy(2,8);
inputs(info->no,10);/*输入编号并校验*/
gotoxy(13,8);
inputs(info->name,14);/*输入姓名并校验*/
gotoxy(30,8);
scanf(“%f”,&temp);/*输入基本工资*/
info->jbgz=temp;
info->koukuan=0;/*扣款为0*/
info->yfgz=0;/*应发工资为0*/
info->shuijin=0;/*税金为0*/
info->sfgz=0;/*实发工资为0*/
printf(“|----------|----------------|--------|”);
printf(“nnnEnter infile name,for example c:f1 e.txt:n”);/*提示输入文件名*/
scanf(“%s”,infile);
if((fp=fopen(infile,“ab”))==NULL)/*打开文件*/
{
printf(“can not open filen”);
return;/*返回*/
}
printf(“n-----Appending record!-----n”);
if(1!=fwrite(info,sizeof(SALARY),1,fp))/*向文件中追加记录*/
{
printf(“-----file write error!-----n”);/*写函数返回值不为1,说明写入错误*/
return;/*返回*/
}
printf(“-----append sucess!----n”);/*显示追加成功*/
fclose(fp);/*关闭文件*/ } /*文件复制*/ void copy(){
char outfile[10],infile[10];/*保存源文件名和目标文件名*/
FILE *sfp,*tfp;/*定义指向源文件和目标文件的指针*/
SALARY *p=NULL;/*定义临时指针,暂存读出的记录*/
clrscr();
printf(“Enter infile name,for example c:f1 e.txt:n”);
scanf(“%s”,infile);/*输入源文件名*/
if((sfp=fopen(infile,“rb”))==NULL)/*二进制读方式打开源文件*/
{
printf(“can not open input filen”);/*显示不能打开文件信息*/
return;/*返回*/
}
printf(“Enter outfile name,for example c:f1 e.txt:n”);/*提示输入目标文件名*/
scanf(“%s”,outfile);/*输入目标文件名*/
if((tfp=fopen(outfile,“wb”))==NULL)/*二进制写方式打开目标文件*/
{
printf(“can not open output file n”);
return;
}
while(!feof(sfp))/*读文件直到文件尾*/
{
if(1!=fread(p,sizeof(SALARY),1,sfp))
break;/*块读*/
fwrite(p,sizeof(SALARY),1,tfp);/*块写*/
}
fclose(sfp);/*关闭源文件*/
fclose(tfp);/*关闭目标文件*/
printf(“you have success copy file!!n”);/*显示成功拷贝*/ } /*排序*/ void sort(){
SALARY *p0,*p00,*p1,*p11,*p2;/*定义临时指针*/
int i=1;/*统计当前排第几个结点*/
clrscr();/*清屏*/
printf(“nn start sort....n”);/*开始排序*/
p1=p11=p2=First;
while(p1!=NULL)/*当p1不为空时*/
{
p0=p1;
/*待比较结点从p1开始*/
p2=p1;
/*p2从当前待排序位置开始*/
while(p2->next!=NULL)/*p2的后继不为空时*/
{
if(p0->sfgz>p2->next->sfgz)/*找当前最小结点*/
{
p00=p2;
/*找到当前最小结点记录其前驱指针*/
p0=p2->next;/*记录当前最小值结点的指针p0*/
}
p2=p2->next;/*指针后移*/
}
Last=p0;/*当前最小结点为尾结点*/
if(p1!=p0)/*判断最小结点是否是当前排序位置,不是则作指针修改*/
{
p00->next=p0->next;/*将p00的后继指向p0的后继*/
p0->next->prior=p00;/*p0的后继的前驱为p00*/
p0->next=p1;/*p0的后继指向下个排序位置p1*/
p1->prior=p0;/*p1的前驱为p0*/
if(i==1)
{
First=p0;
/*作头指针*/
First->prior=NULL;/*头指针的前驱为空*/
}
else
/*不是第一个结点*/
{
p11->next=p0;
/*p11的后继指向p0*/
p0->prior=p11;/*p0的前驱指向p11*/
}
p11=p1=p0;/*因p0是排好序的最后一个结点,p1是下一个将要排序的位置,所以将p0赋值给p1和p11*/
}
i++;/*排好序的结点数加1*/
p1=p1->next;/*p1后移指向下一个待排序位置*/
}
printf(“sort sucess!!n”);/*输出排序成功*/ } /*索引*/ void index(){
SALARY *p,*q,*t,*h1;/*定义临时指针*/
clrscr();/*清屏*/
printf(“nn start index.....nn”);/*显示开始索引*/
h1=First->next;/*将原表的头指针所指的下一个结点作头指针*/
First->next=NULL;/*第一个结点为新表的头结点*/
Last=First;/*尾指针等于头指针*/
while(h1!=NULL)/*当原表不为空时,进行排序*/
{
t=h1;/*取原表的头结点*/
h1=h1->next;/*原表头结点指针后移*/
p=First;/*设定移动指针p,从头指针开始*/
q=First;/*设定移动指针q做为p的前驱,初值为头指针*/
while(strcmp(t->no,p->no)>0&&p!=NULL)/*作编号比较*/
{
q=p;/*待排序点值大,应往后插,所以新表指针后移*/
p=p->next;
}
if(p==q)/*p==q,说明待排序点值小,应排在首位*/
{
t->next=p;/*待排序点的后继为p*/
p->prior=t;/*p的前驱结点指向待排序结点*/
First=t;/*新头结点为待排序点*/
First->prior=NULL;/*头指针的前驱为空*/
}
else /*待排序点应插入在中间某个位置q和p之间,如p为空则是尾部*/
{
t->next=p;/*t的后继是p*/
t->prior=q;/*t的前驱是q*/
q->next=t;/*q的后继是t*/
if(p==NULL)/*判p是否为空*/
Last=t;
/*将t赋值为尾指针*/
else
p->prior=t;/*否则将t赋值给p的前驱*/
}
}
printf(“index sucess!!n”);/*索引排序成功*/ } /*分类合计*/ void total(){
struct t1 /*定义结构体保存合计数据*/
{
char u[7];/*部门*/
float s;
/*合计实发工资*/
}unit[20];
/*定义一个单位部门数不超过20个*/
SALARY *p,*q;/*定义临时指针变量*/
char sno[7],qno[7],*ptr;/*保存部门号*/
float s1;/*保存合计值*/
int i,j;/*控制变量*/
p=First;/*从指针开始*/
i=0;/*统计部门数*/
clrscr();/*清屏*/
while(p!=NULL)/*当p不为空时做下面的处理*/
{
memcpy(sno,p->no,6);/*从编号中取出部门号*/
sno[6]=' ';/*做字符串结束标记*/
q=p->next;/*将指针指向待比较的记录*/
s1=p->sfgz;/*当前部门的实发工资初值作为该部门合计值的初值*/
while(q!=NULL)/*内循环开始*/
{
memcpy(qno,q->no,6);/*读部门号*/
qno[6]=' ';/*做字符串结束标记*/
if(strcmp(qno,sno)==0)/*比较部门号*/
{
s1+=q->sfgz;/*累加实发工资*/
q=q->next;/*指针指向下一条记录*/
}
else
break;/*不是一个部门的结束本次内循环*/
}
strcpy(unit[i].u,sno);/*将部门号写入部门结构体数组中*/
unit[i].s=s1;
/*将实发工资写入部门结构体数组中*/
i++;
/*部门数累加*/
if(q==NULL)/*如果q为空,跳出循环*/
break;
else
p=q;
/*否则,将q赋值给p*/
}
printf(“nn**************Total table**************n”);/*输出合计标题*/
printf(“n--no-------unit------------total---------n”);/*输出序号、部门、合计字段标题*/
for(j=0;j
printf(“
%d
%s
%10.2fn”,j,unit[j].u,unit[j].s);/*输出合计值*/
printf(“---------n”);}
第二篇:C语言课程设计
C语言课程设计
飞机空战小游戏
一、实验环境
运行系统 WINDOWSXP 编程工具C++6.0 地点 程序设计与仿真实验室
桌号19电脑IP地址221.12.10.218
二、实验目的和要求 实验目的:
(1)使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作算法。
(2)使学生进一步掌握程序设计、编写、调试能力。(3)使学生了解软件开发的基本步骤和内容。
实验要求::飞机空战小游戏。功能要求:
1)有主菜单界面,能让用户选择开始、退出、难度等级、查看用户积分功能;
2)飞机能通过A、S、D、W或上下左右键控制移动方向,使用空格键发射子弹;
3)屏幕随机出现从上到下的敌方子弹; 4)当打中敌方子弹时,积分加1;
5)当敌方子弹打正飞机时,游戏结束,并提示用户是否保存记录(记录包括用户名及积分值),保存后退回到主菜单;
6)当选择主菜单中的“查看用户积分”选项时,进入第二级菜单,用户可查看全部用户积分记录,也可仅查看积分最高者,也可根据用户输入的用户名查看;(此处要求使用到链表,用于临时存储用户积分数据);(对链表的查找操作)
7)所有用户积分信息使用文件进行永久性保存; 8)用户选择“难度等级”,可设定游戏不同难度,难度越高,出现敌方子弹数目及间隔将增加。
三、实验内容和结果
系统总体设计:编写出c语言代码,运行程序,并调试程序,最终实现游戏的功能。本程序主要包含游戏控制函数、设置是否继续游戏函数、输出函数、子弹移动函数、敌机移动函数、设置函数、菜单函数等7个主要函数,包含了不同的功能,对原来的程序作出了很大的改进,用到的主要语句有if语句,for语句、while语句、printf语句、switch语句等等,添加了颜色函数。
系统模块设计:包含游戏控制函数、设置是否继续游戏函数、输出函数、子弹移动函数、敌机移动函数、设置函数、菜单函数等7个主要函数,其中是否继续游戏函数,菜单函数主要运用了SWITCH语句和If语句,子弹移动函数,敌机移动函数通过数组内各数值的变化来完成,设置函数主要用PRINTF和SCANF语句进行各项数值的设置,游戏控制函数使用if函数,kbhit()函数,switch函数组合控制数组中飞机进行的移动和图案的变换。最后用打印数组的方式打印出数组变换。最后运用SWITCH函数进行各项菜单内容的操作。
实验的测试和结果:
四、实验中的问题及心得
通过本次试验,使我对c语言有了更深一层次的了解,对for语句、while语句、printf语句、switch语句、颜色函数等等的了解及使用更加详细了一些,明白了这些语句的用法,明确了c语言的使用环境,功能。同时我了解到了一些方法来实现一些C语言作为一个基础性编程语言是我们在以后编程中不可或缺的语言,使用率肯定会进一步增高。掌握了c语言就相当于掌握了一门技术,同时c语言相对而言简单一些,更容易理解。自己虽然对这个小游戏进行一部分的改造,但是我也感觉这只是其中的很很小的一部分,肯定会有更加强大的功能等待着我们去改善。
同时,我也发现了自己很多的不足,需要进一步加强这一方面的学习,在数据结构链表的使用上还很欠缺,无法使用链表进行数据的读取和输入,还有在两个程序的连接上还有困难,对于头文件的理解不到位,链表的结构,定义,使用指针的方式„„这些都需要提高。这些技能的欠缺导致了在 这个小游戏中无法顺利完成有关用户名和记录的一些要求。„„
附录:程序清单
#include
void movebul(int [][N]);//子弹移动函数 void movepla(int [][N]);//敌机移动函数 void setting(void);//设置函数 void menu();//菜单 int scr[50][N]={0},pl=9,width=15,speed=16,density=40,score=0,death=0,length=18,y=0,x=5,z=15,life=1,max=0;//全局变量:界面、我机初始位、界面宽度、敌机速度、敌机密度、得分、死亡,子弹,飞机,敌机初始图案,生命
char name[N];char first[N];void main(){ menu();getch();}
void print(int a[][N])//输出函数 { int i,j;system(“cls”);for(i=0;i a[i][width-1]=4; for(j=0;j { if(a[i][j]==0)printf(“ ”); if((a[i][j]==1)&&(x<15))printf(“%c”,x);//输出我机的符号 if((a[i][j]==2)&&(z<35))printf(“%c”,z);//子弹 if((a[i][j]==3)&&(y<4))printf(“%c”,y+1);//输出敌机符号 if(i==1&&j==width-1)printf(“总积分:%d”,score);//显示得分 if(i==2&&j==width-1)printf(“已经死亡了%d 次,剩余 %d 条命”,death,life-death);//右上角显示死亡次数 if(i==3&&j==width-1)printf(“普通按键:AD控制左右飞行”); if(i==4&&j==width-1)printf(“ W 发射子弹”);if(i==5&&j==width-1)printf(“特殊按键:+-号加减敌机速度”);if(i==6&&j==width-1)printf(“ /*号单列敌机密度减小增大(均有限制)”); if(i==7&&j==width-1)printf(“VIP按键:X键变化飞机图案,Y键变化敌机图案”); if(i==8&&j==width-1)printf(“tZ键变化子弹图案,P键增加生命(均有限制)”); if(i==9&&j==width-1)printf(“注意:向下移动后按其他方向键飞机显现”); } printf(“n”);} } void movebul(int a[][N]){ int i,j;for(i=0;i { if(i==0&&a[i][j]==2) a[i][j]=0; if(a[i][j]==2) { if(a[i-1][j]==3)//加分 { score+=1; printf(“7”); } a[i][j]=0,a[i-1][j]=2; } } } void movepla(int a[][N]){ int i,j;for(i=length-1;i>=0;i--)//从最后一行往上是为了避免把敌机直接冲出数组。 for(j=0;j if(i==length-1&&a[i][j]==3) a[i][j]=0;//消除敌机,在最低层 if(a[i][j]==3)a[i][j]=0,a[i+1][j]=3;//敌机移动 } if(a[length-2][pl]==3&&a[length-1][pl]==1)death++;//死亡 } void continuegame()//继续游戏 { printf(“用户%s”,name);printf(“你的得分是%dn”,score);if(score==0)printf(“tttt 恭喜你刷新了最低记录na”,score);if((score>0)&&(score<20)) printf(“tttt 回家再练 练吧na”,score);if(score>19) printf(“tttt 你真厉害 na”,score);printf(“游戏结束n”);printf(“按y键继续游戏,空格键退出游戏(y/n)?n”);printf(“ttt”);switch(getch())//是否要继续游戏 { case 'y': case 'Y':system(“cls”),death=0,score=0,life=1,x=5,y=0,z=15;menu();break;} } void setting(void)//设置函数 { system(“cls”);//清屏 printf(“n 输入游戏界面的大小(默认3):1-10 ”);scanf(“%d”,&width);width=(width+1)*5;printf(“n 请输入敌机密度大小(默认3):1-5 ”);scanf(“%d”,&density);density=(7-density)*10;printf(“n 输入敌机的飞行速度大小(默认3):1-10 ”);scanf(“%d”,&speed);speed=(11-speed)*2;printf(“n 输入我机的生命(默认1):1-100 ”);scanf(“%d”,&life);printf(“n 输入飞机的图案(默认1):1-2 ”);scanf(“%d”,&x);x=x+4;printf(“n 输入子弹的图案(默认1):1-10 ”);scanf(“%d”,&z);z=z+14;printf(“n 输入敌机的图案(默认1):1-3 ”);scanf(“%d”,&y);y=y-1;} void run(){ int i=0,j=0,k=0,b=0;printf(“请输入用户名:”);scanf(“%s”,name);printf(“您的用户名是:%s”,name);if(getch()==27)setting();printf(“游戏说明:按AWSD控制我机左右飞行,空格键发射子弹n特殊按键:-号敌机减速,+号敌机加速n特殊按键:/号单列敌机密度减小,*号单列敌机密度增大n”);printf(“VIP按键:X键变化飞机图案,Y键变化敌机图案ntZ键变化子弹图案,P键增加生命n”);printf(“任意键开始游戏,esc键进入游戏设置n”);printf(“游戏时也可更改游戏设置任意键开始nn”);system(“color a”);//设置背景颜色 if(getch()==27)setting();scr[length-1][pl]=1;//我方飞机初始位置 scr[0][5]=3;while(death { if(kbhit()) switch(getch())//控制设置按键 { case 'a': case 'A':if(pl>0) scr[length-1][pl]=0,scr[length-1][--pl]=1;break; case 'd': case 'D':if(pl scr[length-1][pl]=0,scr[length-1][++pl]=1;break;case 'W': case 'w':if(length>10) { scr[length-1][pl]=0,scr[length-2][pl]=1; length=length-1; };break; case '+':if(speed>2) { speed=speed-2; };break; case '-':speed=speed+1;break;case '*':if(density>5) { density=density-5; };break; case '/':density=density+10;break; case 'l':if(width<40) { width=width+2; };break; case 's':if(length<30) { scr[length-1][pl]=0; length=length+1; scr[length-1][pl]='5'; };break; case ' ':scr[length-2][pl]=2;break; case 'y':y=(y+1)%4;break; case 'x':x=(x)%2+5;break; case 'z':if(z<25) { z=z+1; } else z=15;break; case 'p':life=life+1;break;} if(++j%density==0)//控制生产敌机的速度 { j=0; srand(time(NULL));//产生随机数 scr[0][rand()%width]=3; scr[rand()%3][rand()%(width+2)]=3; scr[rand()%2][rand()%(width+1)]=3; scr[rand()%4][rand()%(width+4)]=3;//生成随机敌方飞机 } if(++i%speed==0)//控制敌机移动速度,相对于子弹移动速度 movepla(scr);//飞机移动 movebul(scr);//子弹移动 print(scr);//绘制游戏画面 } if(score>=max){ max=score; for(i=0;i { name[i]=first[i]; } } if(score score=score;} continuegame();getch();} void menu(){ printf(“n1:游戏设置n2:游戏说明n3:开始游戏n4:查看用户信息n5:退出游戏n”); switch(getch()){ case '1': setting();menu();break; case '2':printf(“游戏说明:按AWSD控制我机左右飞行,空格键发射子弹n特殊按键:-号敌机减速,+号敌机加速n特殊按键:/号单列敌机密度减小,*号单列敌机密度增大n”);printf(“VIP按键:X键变化飞机图案,Y键变化敌机图案ntZ键变化子弹图案,P键增加生命n”);printf(“ 任意键开始游戏,esc键进入游戏设置n”);printf(“ 游戏时也可更改游戏设置”);menu();break; case '3':run();menu();break; case '4':seerecord();menu();break; case '5':exit(0);break;default:menu();break;} } seerecord(){ printf(“最高纪录为%s,%d”,first[N],max);} C语言程序设计课程设计 设计题目:专业:计算机科学与技术班级:2010级计算机二班组长姓名:马得才【P101712944】成员姓名:孙丽欣【P101712927】 赵广峰【P101712926】 迟成凯【P101712928】 冶成意【P101712930】 2010年5月20日 题目: 指导教师:普措才仁 一、案例需求 二、案例分析 三、案例设计 四、案例实现 五、参考文献 #include int num1; char name1[20]; int score; int nelepeo;//课程已选人数 int Melepeo;//课程人数上限 struct couse * next;}; int student(); //学生登陆 int teacher(); //教师登陆 struct student//学生信息结构体 { int num2; char name2[20]; int nelenum[50];//已选课程编号 int nelen;//已选课程数量 struct student * next;}; void Ms(){ for(kk1=0;kk1<1100;kk1++) for(kk2=0;kk2<1200;kk2++) for(kk3=0;kk3<1200;kk3++);} void keyboardc()//录入课程子函数(从键盘录入){ void intoc();struct couse *p1,*p2;N1=0;p1=p2=(struct couse*)malloc(sizeof(struct couse));printf(“n课程编号:”);fflush(stdin);scanf(“%d”,&p1->num1);printf(“n课程名称:”);scanf(“%s”,p1->name1);printf(“n学分:”);scanf(“%d”,&p1->score);printf(“n课程人数上限:”);scanf(“%d” ,&p1->Melepeo);printf(“ntttt输入成功!”);p1->nelepeo=0;head1=NULL;while(p1->num1!=0){ N1=N1+1; if(N1==1)head1=p1; else p2->next=p1; p2=p1; p1=(struct couse *)malloc(sizeof(struct couse)); printf(“n-----------------------------”); printf(“n课程编号:(输入0结束)”);scanf(“%d”,&p1->num1);printf(“n课程名称:”);scanf(“%s”,p1->name1);printf(“n学分:”);scanf(“%d”,&p1->score);printf(“n课程人数上限:”);scanf(“%d” ,&p1->Melepeo); p1->nelepeo=0; printf(“ntttt输入成功!”);} p2->next=NULL;intoc();} void filec()//录入键盘子函数(从文件录入){ void intoc(); FILE * fp; char filepath[20]; struct couse *p1,*p2; N1=0; printf(“输入要读入的文件路径:”); getchar(); gets(filepath); if((fp=fopen(filepath,“r”))==NULL) { printf(“找不到%s文件!n”,filepath); exit(0); } p1=p2=(struct couse*)malloc(sizeof(struct couse)); fscanf(fp,“%d%s%d%d%d”,&p1->num1,p1->name1,&p1->score,&p1->nelepeo,&p1->Melepeo); head1=NULL; while(!feof(fp)) { N1=N1+1; if(N1==1)head1=p1; else p2->next=p1; p2=p1; p1=(struct couse *)malloc(sizeof(struct couse)); fscanf(fp,“%d%s%d%d%d”,&p1->num1,p1->name1,&p1->score,&p1->nelepeo,&p1->Melepeo); } p2->next=NULL; intoc();} void inputc()//录入课程主函数 { int i; printf(“ttt录入课程信息n”); printf(“n1.从键盘录入n”); printf(“2.从文件录入n”); printf(“3.返回主菜单n”); printf(“请选择(1~3):n”); scanf(“%d”,&i); switch(i) { case(1):keyboardc();break; case(2):filec();break; case(3):system(“cls”);return;break; //return } } void insertc(struct couse *incouse)//课程管理子函数(增加课程){ void intoc(); struct couse *p0,*p1,*p2; p1=head1; p0=incouse; if(head1==NULL) { head1=p0; p0->next=NULL; } else { while((p0->num1 > p1->num1)&&(p1->next!=NULL)) { p2=p1; p1=p1->next; } if(p0->num1 <= p1->num1) { if(head1==p1)head1=p0; else p2->next=p0; p0->next=p1; } else { p1->next=p0; p0->next=NULL; } } N1=N1+1; intoc();} void delc(int num1)//课程管理子函数(删除课程){ void intoc(); struct couse *p1,*p2; if(head1==NULL) { printf(“n没有课程,无法删除!n”); goto end; } p1=head1; while(num1!=p1->num1 && p1->next!=NULL) { p2=p1; p1=p1->next; } if(num1==p1->num1) { if(p1==head1)head1=p1->next; else p2->next=p1->next; printf(“已删除该编号课程!n”); N1=N1-1; } else printf(“无该编号的课程!n”); end:; intoc();} void managementc()//课程管理主函数 { struct couse * incouse; struct couse *p1; int i,num1; printf(“ttt课程管理n”); printf(“1.新增课程n”); printf(“2.删除课程n”); printf(“3.返回主菜单n”); printf(“请选择(1~3):n”); scanf(“%d”,&i); switch(i) { case(1): { incouse=(struct couse *)malloc(sizeof(struct couse)); printf(“n课程编号:”); fflush(stdin); scanf(“%d”,&p1->num1); printf(“n课程名称:”); scanf(“%s”,p1->name1); printf(“n学分:”); scanf(“%d”,&p1->score); printf(“n课程人数上限:”); scanf(“%d” ,&p1->Melepeo); printf(“ntttt输入成功!”); incouse->nelepeo=0; insertc(incouse); break; } case(2): { printf(“请输入要删除课程的编号:n”); scanf(“%d”,&num1); delc(num1); break; } case(3):system(“cls”);return;break; } } void keyboards()//录入学生信息子函数(从键盘录入){ void intos(); int i; struct student *p1,*p2; N2=0; p1=p2=(struct student *)malloc(sizeof(struct student)); printf(“n学生学号:”); scanf(“%d”,&p1->num2); printf(“n学生姓名:”); scanf(“%s”,p1->name2); p1->nelen=0; for(i=0;i<50;i++)p1->nelenum[i]=0; head3=NULL; while(p1->num2!=0) { N2=N2+1; if(N2==1)head3=p1; else p2->next=p1; p2=p1; p1=(struct student *)malloc(sizeof(struct student)); //return printf(“n学生学号:(输入0结束!)”); scanf(“%d”,&p1->num2); printf(“n学生姓名:”); scanf(“%s”,p1->name2); p1->nelen=0; for(i=0;i<50;i++)p1->nelenum[i]=0; } p2->next=NULL; intos();return;} void files()//录入学生信息子函数(从文件录入){ int i=0; FILE * fp; char filepath[20]; struct student *p1,*p2; N2=0; printf(“输入要读入的文件路径:”); getchar(); gets(filepath); if((fp=fopen(filepath,“r”))==NULL) { printf(“找不到%s文件!n”,filepath); exit(0); } p1=p2=(struct student*)malloc(sizeof(struct student)); fread(p1,sizeof(struct student),1,fp); head3=NULL; while(!feof(fp)) { i=0; N2=N2+1; if(N2==1)head3=p1; else p2->next=p1; p2=p1; p1=(struct student *)malloc(sizeof(struct student)); fread(p1,sizeof(struct student),1,fp); } p2->next=NULL;} void inputs()//录入学生信息主函数 { int i; printf(“nttt录入学生信息n”); printf(“n1.从键盘录入n”); printf(“2.从文件录入n”); printf(“3.返回主菜单n”); printf(“请选择(1~3):n”); scanf(“%d”,&i); switch(i) { case(1):keyboards();break; case(2):files();break; case(3):system(“cls”);return;break; } return 0;} void inserts(struct student * incouse)//学生信息管理子函数(填加学生信息){ void intos(); struct student *p0,*p1,*p2; p1=head3; p0=incouse; if(head3==NULL) { head3=p0; p0->next=NULL; } else { while((p0->num2 > p1->num2)&&(p1->next!=NULL)) { p2=p1; p1=p1->next; } if(p0->num2 <= p1->num2) { if(head3==p1)head3=p0; else p2->next=p0; p0->next=p1; } else { //return p1->next=p0; p0->next=NULL; } } N2=N2+1; intos();} void dels(int num2)//学生信息管理子函数(删除学生信息){ void intos(); struct student *p1,*p2; if(head3==NULL) { printf(“n没有该学生信息,无法删除!n”); goto end; } p1=head3; while(num2!=p1->num2 && p1->next!=NULL) { p2=p1; p1=p1->next; } if(num2==p1->num2) { if(p1==head3)head3=p1->next; else p2->next=p1->next; printf(“已删除该学生信息!n”); N2=N2-1; } else printf(“无该学号的学生!n”); intos(); end:;} void managements()//学生信息管理主函数 { struct student * incouse; int i,num2; printf(“ttt学生信息管理n”); printf(“1.新增学生信息n”); printf(“2.删除学生信息n”); printf(“3.返回主菜单n”); printf(“请选择(1~3):n”); scanf(“%d”,&i); switch(i) { case(1): { incouse=(struct student *)malloc(sizeof(struct student)); incouse->nelen=0; incouse->nelenum[0]=0; printf(“学生学号t学生姓名n”); scanf(“%d%s”,&incouse->num2,incouse->name2); inserts(incouse); break; } case(2): { printf(“请输入要删除学生的学号:n”); scanf(“%d”,&num2); dels(num2); break; } case(3):system(“cls”);return;break; //return } } void elect(struct student * s)//选课 { void intos(); struct couse * p; int num1,i; printf(“请输入要选课的编号:n”); scanf(“%d”,&num1); for(i=0;s->nelenum[i]!=0;i++); s->nelenum[i]=num1; (s->nelen)++; p=head1; while(p->num1!=num1)p=p->next; (p->nelepeo)++; intos();} void cheak()//学生选课子函数(查询可选课程){ char e; struct couse * c; struct student * s; int num2,i,j=0,t=0; printf(“请输入你的学号:”); scanf(“%d”,&num2); s=head3; while((s->num2!=num2)&&(s->next!=NULL))s=s->next; if(s->num2!=num2) { printf(“不存在你的信息,请进入主菜单录入你的信息!n”); goto end; } c=head1; printf(“你的可选课程编号:n”); while(c!=NULL) { for(t=0,i=0;s->nelenum[i]!=0;i++) { if(c->num1==s->nelenum[i])t=1; } if(t==0 &&(c->nelepeo!=c->Melepeo)) { printf(“%dn”,c->num1); j++; } c=c->next; } if(j==0) { printf(“你已选完所有课程,无法再多选!n”); goto end; } printf(“选课(y/n)?:n”); getchar(); e=getchar(); i=0; while((e=='y')||(e=='Y')) { elect(s); printf(“继续选课(y/n)?:n”); getchar(); e=getchar(); } end:;} void back(struct student * p)//退课 { void intos(); struct couse * p1; int num1,i,j; printf(“请输入你要退掉的课程编号:n”); scanf(“%d”,&num1); p1=head1; while(p1->num1!=num1)p1=p1->next; for(i=0;p->nelenum[i]!=num1;i++); for(j=i;p->nelenum[j]!=0;j++)p->nelenum[j]=p->nelenum[j+1]; p->nelenum[--j]=0; (p1->nelepeo)--; printf(“退课成功!n”); intos();} void hcheak()//学生选课子函数(查询已选课程){ char c; struct couse * p0; struct student * p; int num2,i,f=0; printf(“请输入学号:n”); scanf(“%d”,&num2); p=head3; while(p->num2!=num2 && p!=NULL)p=p->next; if(p==NULL) { printf(“不存在你的信息,请回主菜单录入信息:n”); goto end; } printf(“已选课程编号:n”); if(p->nelenum[0]==0) { printf(“你还没选课!n”); goto end; } for(i=0;p->nelenum[i]!=0;i++) { printf(“%dn”,p->nelenum[i]); p0=head1; while(p0->num1!=p->nelenum[i])p0=p0->next; f=f+p0->score; } printf(“总学分:%dn”,f); printf(“是否进行退课(y/n)?”); getchar(); c=getchar(); while((c=='y')||(c=='Y')) { back(p); printf(“继续退课(y/n)?”); getchar(); c=getchar(); (p->nelen)--; } end:;} void elective()//学生选课主函数 { int i; printf(“ttt学生选课n”); printf(“1.查询可选课程n”); printf(“2.查询已选课程n”); printf(“3.返回主菜单n”); printf(“请输入(1~3):n”); scanf(“%d”,&i); switch(i) { case(1):cheak();break; case(2):hcheak();break; case(3): system(“cls”);return;break; // return } } void listc()//输出课程信息 { struct couse * p; p=head1; printf(“课程编号 课程名称 学分 课程已选人数 课程人数上限n”); while(p!=NULL) { printf(“%-8d%10s%6d%8d%12dn”,p->num1,p->name1,p->score,p->nelepeo,p->Melepeo); p=p->next; } } void lists()//输出学生信息 { struct student * p; p=head3; printf(“学生学号 学生姓名 已选课程数量n”); while(p!=NULL) { printf(“%-4d %10s %6dn”,p->num2,p->name2,p->nelen); p=p->next; } } void intoc()//存储课程信息 { FILE * fp; struct couse * p; char filepath[30]; if((fp=fopen(“课程信息.dat”,“a+”))==NULL) { printf(“n保存失败!”); exit(0); } p=head1; while(p!=NULL) { fprintf(fp,“%d %s %d %d %dn”,p->num1,p->name1,p->score,p->nelepeo,p->Melepeo); p=p->next; } fclose(fp); printf(“课程信息已保存成功!n”);} void intos()//存储学生信息 { int i; FILE * fp; struct student * p; char filepath[30]; if((fp=fopen(“学生信息.dat”,“a+”))==NULL) { printf(“n保存失败!”); exit(0); } p=head3; while(p!=NULL) { fwrite(p,sizeof(struct student),1,fp); p=p->next; } fclose(fp); printf(“学生信息已保存成功!n”); printf(“ntttt选择菜单:”); printf(“ntttt1.继续添加ntttt2.返回主菜单:”); printf(“请选择:”); scanf(“%d”,&i); switch(i) { case 1:inputs();break; case 2:teacher();break; default:printf(“n输入有误!n”);} } void store()//信息主函数 { int i; printf(“tt系统信息查看及存储n”); printf(“1.查看课程信息n”); printf(“2.查看学生信息n”); printf(“3.返回主菜单n”); printf(“请输入(1~3):n”); scanf(“%d”,&i); switch(i) { case(1):listc();break; case(2):lists();break; case(3):system(“cls”);return;break; } } int main()//主函数 //retuen { int i; FILE *fp; printf(“nttt欢迎使用学生选课系统!n”); printf(“n请选择菜单:”); printf(“ntttt1.教师登陆ntttt2.学生登陆n”); printf(“请选择:”); scanf(“%d”,&i); switch(i) { case 1:teacher();break; case 2:student();break; default:printf(“输入有误!”); } } int student() { int i; printf(“ntttt1.学生选课n”); printf(“ntttt2.系统信息查看及存储n”); printf(“ntttt3.退出系统n”); printf(“请选择:”); scanf(“%d”,&i); switch(i) { case 1: { system(“cls”); elective(); break; } case 2: { system(“cls”); store(); break; } default:printf(“输入有误!”); } } int teacher() { FILE *fp; int i; printf(“菜单:n”); printf(“1.录入课程信息n”); printf(“2.课程管理n”); printf(“3.录入学生信息n”); printf(“4.学生信息管理n”); printf(“5.系统信息查看n”); printf(“6.退出系统n”); if((fp=fopen(“课程信息.dat”,“rb”))==NULL) { printf(“n打开系统文件失败! n”); //fp=fopen(“信息.dat”,“rb”)); // } // if(feof(fp)) // { printf(“n还未添加课程信息,请添加课程信息!n”); inputc(); } while(!feof(fp)) { emp1=(struct couse*)malloc(sizeof(struct couse)); if(emp1==NULL) { printf(“n分配内存失败!n”); return; } fread(emp1,sizeof(struct couse),1,fp); if(feof(fp))break; if(head1==NULL) { head1=emp1; head2=emp1; } else{ head2->next=emp1; head2=emp1; } head2->next=NULL; } fclose(fp); fp==NULL; if((fp=fopen(“学生信息.dat”,“rb”))==NULL) printf(“n打开系统文件失败!n”); // //if(feof(fp)==1) // { printf(“还未添加学生信息,请添加学生信息!”); inputs(); while(!feof(fp)) { emp1=(struct student*)malloc(sizeof(struct student)); if(emp2==NULL) { printf(“n分配内存失败!n”); return; } fread(emp2,sizeof(struct student),1,fp); if(feof(fp))break; if(head3==NULL) { head3=emp2; head4=emp2; } else{ head4->next=emp2; head4=emp2; } head4->next=NULL; } fclose(fp); fp==NULL; printf(“n请输入菜单选项(1~6):n”); scanf(“%d”,&i); switch(i) { case(1): { system(“cls”); inputc(); break; } case(2): { system(“cls”); managementc(); break; } case(3): { system(“cls”); inputs(); break; } case(4): { system(“cls”); managements(); break; } case(5): { system(“cls”); store(); break; } case(6): { system(“cls”); printf(“感谢使用本系统!nn再见!n”); } } return 1; } 前言 让自己所学的知识应用于实际生活中,理论联系生活,学以致用,我们将更好服务于民。我们是新一代的年轻人,要想将来在社会上更好的立足,就必须让自己强大起来,努力的学习新东西,了解新事物,跟上时代的步伐,这样我们才能与时俱进,不被社会所淘汰。C语言在大学里是一门很重要的课程,也是一门很实用的课程,学好C语言在当今的信息时代是一个很好的敲门砖。而且,我们是电子信息工程专业的,更应该学好C语言,这对我们以后走向社会有很大的帮助,为我们以后大学毕业去求职提升竞争力。从C语言产生到现在,它已经成为最重要和最流行的编程语言之一。在各种流行编程语言中,都能看到C语言的影子,如Java的语法与C语言基本相同。学习、掌握C语言是每一个计算机技术人员的基本功之一。C语言具有高级语言的强大功能,却又有很多直接操作计算机硬件的功能(这些都是汇编语言的功能),因此,C语言通常又被称为中级语言。学习和掌握C语言,既可以增进对于计算机底层工作机制的了解,又为进一步学习其他高级语言打下了坚实的基础。需求分析 当今社会是信息社会,谁的信息越快速越准确,谁就会更好的生活在这个社会上,他的人生也将走向成功。信息业正在21世纪扮演着越来越重要的角色,也是中国十二五规划中的重要一环,因此,我们应该努力的去学习好这门课程,力争在以后的生活工作中大展身手。现在的社会日新月异,各种信息在不断的传递交流,谁最先获取了信息谁就会成功。所以,作为我们这类专业的人才,在毕业以后一定会大显身手,实现自己的人生价值。 2.1 课程设计目的 本课程设计为信息类公共课《计算方法与程序设计》配套的课程设计。是该课程的理论学习的延伸。通过本课程设计有助于锻炼综合运用C语言相关知识设 为1;若n大于1,则开始循环运算(见图3.22流程图),直到i小于n不成立时结束循环。在循环运算的过程中,要调用两个函数即函数pit1和函数pit2(见图3.23流程图)。在调用函数pit1和函数pit2中,这两个函数进行相互递归调用。最后将调用函数pit1和pit2的值返回主函数main函数中,再输出高能质子数目t3和低能质子数目t4。 3.1 系统流程图 程序一系统流程图(如图3.11所示): 开始输入nt1=3,t2=1,i=1否n==0否是n==1是否i 3.2主要模块的流程图 程序一模块流程图如图3.21所示: 否i 图3.21流程图 程序二模块流程图如图3.22和图3.23所示: i=1否i 图3.22流程图 } {t3=3*t1+2*t2;t4=t1+t2;t1=t3;t2=t4;} printf(“n the high=%d the low=%dn”,t3,t4); 程序代码4.1 程序二代码如下所示: #include “stdio.h” int pit1(int a){ if(a==1) } int pit2(int b){ if(b==1) } main(){ int n,i,t3,t4;printf(“n input n”);scanf(“%d”,&n);if(n==0){ return(1);return(pit1(b-1)+pit2(b-1));else return(3);return(3*pit1(a-1)+2*pit2(a-1));else 图5.11 程序二运行结果:如图5.12(程序运行时,当输入时间变量n是3时,输出高能粒子是41,低能粒子是15。) 图5.12 参考文献 [1 ]张福祥.C语言程序设计[M].辽宁大学出版社,2008.[2] 张福祥,王萌.C语言程序设计习题解答与实验实训.沈阳:辽宁大学出版社,2008. [3] 牛莉,刘远军等.计算机等级考试辅导教程[M].北京:中国铁道出版社,2008. [4]李勇帆,谢兵.大学计算机应用教程.北京:中国铁道出版社,2009. [5]田淑清.全国计算机等级考试二级教程.北京:高等教育出版社,2011. [6]杨振山,龚沛曾.大学计算机基础.北京:高等教育出版社,2006. [7]卢湘鸿.信息技术应用基础.北京:高等教育出版社,2004. 致 谢 在这次课程设计的撰写过程中,我得到了许多人的帮助。首先我要感谢我的老师在课程设计上给予我的指导、提供给我的支持和帮助,这是我能顺利完成这次报告的主要原因,更重要的是老师帮我解决了许多技术上的难题,让我能把系统做得更加完善。在此期间,我不仅学到了许多新的知识,而且也开阔了视野,提高了自己的设计能力。其次,我要感谢帮助过我的同学,他们也为我解决了不少我不太明白的设计商的难题。同时也感谢学院为我提供良好的做毕业设计的环境。最后再一次感谢所有在设计中曾经帮助过我的良师益友和同学。第三篇:C语言课程设计范文
第四篇:C语言课程设计
第五篇:C语言课程设计