文档视界 最新最全的文档下载
当前位置:文档视界 › C语言课程设计报告_长整数四则运算

C语言课程设计报告_长整数四则运算

C语言课程设计报告_长整数四则运算
C语言课程设计报告_长整数四则运算

C语言课程设计说明书题目:长整型数四则运算

学院:

班级:

学生:

学号:

班内序号:

提交日期:年月日

目录

一、需求分析 (1)

二、设计思路 (1)

三、详细设计 (2)

1、主要函数 (2)

2、函数的主要调用关系图 (3)

四、调试分析及编程心得体会 (3)

五、用户手册 (3)

六、测试结果 (3)

七、源程序代码 (4)

1、 main.c 主控文件 (4)

2、IntFace.h 程序界面模块头文件 (5)

3、IntFace.c 程序界面处理模块文件 (6)

4、LongInt.h 长整型数输入输入及运算模块头文件 (9)

5、LongIO.c 长整型数输入输出处理模块文件 (9)

6、LongInt.c 长整型数运算处理模块文件 (11)

7、DuCiLink.h 双向循环链表处理模块头文件 (16)

8、DuCiLink.c 双向循环链表处理模块代码 (17)

一、需求分析

1、设计一个实现任意长的整数进行四则运算的程序。

2、输入和输出形式是按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开,长整数位数没有上

限,以分号结束长整型数据的输入。

3、程序执行的命令包括:

1)、输入长整数1;2)、输入长整数2;3)、输入执行的运算符;4)、计算并输出结果;5)、结束。

4、测试数据:(以加法为例)

(1)、0;0;+;应输出“0”。

(2)、-2345,6789;-7654,3211;+;应输出“-1,0000,0000”。

(3)、-9999,9999;1,0000,0000,0000;+;应输出“9999,0000,0001”.

(4)、1,0001,0001;-1,0001,0001;+;应输出“0”.

(5)、1,0001,0001;-1,0001,0000;+;应输出“1”。

(6)、-9999,9999,9999;-9999,9999,9999;+;应输出“-1,9999,9999,9998”.

(7)1,0000,9999,9999;1;+;应输出“1,0001,0000,0000”.

二、设计思路

我们首先要考虑的是如何表示长整型数。按照传统习惯要求每4位数形成1组,而一个长整型数可能会有很多组这种4位数,而每节之间是有先后顺序的,因此我们可以考虑用数组和链表来存储数据。(1)再考虑到每个长整型数的长度在输入之间是无法预知的,因此使用链表在存储空间的分配上更方便一些。(2)在输入数据时总是从高位到低位地存储,而计算时总是从低位向高位运算,(这样的话栈也很方便)因此采用双向链表更方便,而为了从头结点方便地转到尾结点可以采用循环链表。总之,为了实现上述功能,应以双向循环链表表示长整数,每个结点含一个整型变量,且仅绝对值不超过9999的整数,整个链表用十进制数表示。(3)对于每一个长整型数可以设置一个头结点,其中的数据域用来表示该长整型数的正负号及组数,该值的符号则表示该长整型数的符号,该数的绝对值表示该长整型数包含的4位数的组数。第一个存储4位数据组的结点称为首结点,而最后一个4位数据组结点称为尾结点。

为此需要两个结构数据类型:双向循环链表和长整数,两个类型采用相同的结构,只是双向循环链表用来存储数据,长整型用表示数据的运算。

1、双向循环链表的数据结构及操作定义如下:

typedef short ElemType; //定义基本数据类型,我们采用short来表示任意4位整数。

typedef struct DuCiLinkNode{ // 双向循环链表结点的存储结构

ElemType data;

struct DuCiLinkNode *prior; //指向上一结点

struct DuCiLinkNode *next; //指向下一结点

}DuCiLinkNode,*DuCiLinkList; //定义双向循环链表结点及链表的类型名

基本操作:

DuCiLinkNode *MakeNode(ElemType e); //以4位整数e构造1个双向循环链表结点

Status InitList(DuCiLinkList *L); //初始化1个双向循环链表,分配1个结点作头结点

//数据域赋初值0,上下结点指针指向自己void DestroyList(DuCiLinkList *L); //消毁1个双向循环链表,释放它所占用的所有内存空间

//并让链表*L指向NULL

void ClearList(DuCiLinkList L); //清除1个双向循环链表,释放数据结点所占用的内存空间

//保留头结点,并将数据域置为0,上下结点指针指向自己Status InsTail(DuCiLinkList L, ElemType e); //在双向循环链表L的尾结点之后加入1个以e为

//数据域的新结点,并返回OK; 否则返回ERROR。

Status InsFirst(DuCiLinkList L, ElemType e);

//将数据元素e插入在线性链表L头结点之后,并返回OK; 否则返回ERROR。

Status CopyList(DuCiLinkList L, DuCiLinkList C);

//将双向循环链表L复制到双向循环链表C中。

2、长整数的数据类型和和操作定义为:

typedef struct DuCiLinkNode LongIntNode,*LongInt;//采用双向循环链表为实际的存储结构void OutputNumber(LongInt a); //输出一个长整型数

void InputNumber(LongInt a,int OneOrTwo); //输入一个长整型数

void add(LongInt c,LongInt a,LongInt b); //长整型数 c = a + b

void sub(LongInt c,LongInt a,LongInt b); //长整型数 c = a - b

Status mul(LongInt c,LongInt a,LongInt b); //长整型数 c = a * b

void div(LongInt c,LongInt a,LongInt b); //长整型数 c = a / b (整除)

void rem(LongInt c,LongInt a,LongInt b); //长整型数 c = a % b (求余)

void power(LongInt c,LongInt a,int n); //长整型数 c = a ^ n (乘方)

3、本程序包含四个模块:

1)主程序模块:

void main() //main.c

{

初始化;

do{

接受命令;

处理命令;

}while(“命令”=“结束”)

2)程序界面模块//IntFace.c, IntFace.h

3)双向循环链表处理模块// DuCiLink.c,DuCiLink.h

4)长整型数的输入输出模块//LongIO.c, LongInt.h

5)长整数运算模块//LongInt.c LongInt.h

各模块之间的调用关系如下:

三、详细设计

1、主要函数

(1)、主控模块main.c

void DoCommand() //根据输入命令进行相应的处理

void Calculate() //执行计算功能

void ReSet() //重设系统环境

(2)、程序界面模块 IntFace.c

void InitiInterface(); //界面初始化

void GoToCmdxy(); //将光标定位到命令选项提示之后

void GoToPrompt(); //将光标定位到命令选项提示行首

void ShowMainPrompt(); //显示命令选项提示

void ClearScreen(); //以清除整个屏幕,并设置为黑底白字模式

void ClearPromptLine(); //清除提示行的显示

void ClearWorkSpace(); //清除工作区的显示

void InputNumberBox(int OneOrTwo);//指定两个输入数的输入窗口,如果超过这个范围文字将自动流动void ResultBox(); //指定计算结果的显示窗口,如果超过这个范围文字将自动流动

(3)、长整型数输入输出模块见二小节2分节

(4)、长整型数四则运算处理模块见二小节2分节

(5)、长整型数存储模块—双向循环链表模块见二小节1分节

2、函数的主要调用关系图

四、调试分析及编程心得体会

1、刚开始考虑进位问题过于简单,导致测试数据时多次出错。

2、刚开始时在输入方式中花了较大功夫,而且用户界面不够友好,程序容错性较差。

3、开始写程序时源程序没有严格按单元模块结构编写,可读性较差。

4、由于初次进行系统的程序设计,层次结构划分不太合理,应在以后的设计中强化此思维,逐渐与工程设计接轨。

…………………………………………

五、用户手册

1、本程序的运行环境为DOS操作系统,执行文件为LongInt.exe。

2、进入演示程序后即显示文本方式的用户界面

3、输入命令,执行相应的功能:

1 ––输入第1个整数o,O ––输入运算符r, R ––重置系统

2 ––输入第2个整数c,C ––执行运算q,Q ––退出系统

六、测试结果

(1)、0和0的四则运算:

(2)、-2345,6789;-7654,3211;+;应输出“-1,0000,0000”。

(3)、-9999,9999;1,0000,0000,0000;+;应输出“9999,0000,0001”.

(4)、1,0001,0001;-1,0001,0001;+;应输出“0”.

(5)、1,0001,0001;-1,0001,0000;+;应输出“1”。

(6)、-9999,9999,9999;-9999,9999,9999;+;应输出“-1,9999,9999,9998”. (7)1,0000,9999,9999;1;+;应输出“1,0001,0000,0000”.

略…………………………………

七、源程序代码

/*******************************************************

1、main.c 主控文件

*******************************************************/

#include "IntFace.h"/*界面模块头文件*/

#include "LongInt.h"/*长整型数处理模块头文件*/

char cmd; /* menu command */

char opt; /* operator */

int n; /* power */

LongInt a,b,c; /* Long integer numbers */

int flag_n1=0,flag_n2=0,flag_opt=0,flag_cal=0,flag_reset=1; /*标志位*/

void ReSet() /* Reset system */

{

ClearWorkSpace(); //清屏幕的工作区

flag_n1=0; //重置长整数1是否输入的标志

flag_n2=0; //重置长整数2是否输入的标志

flag_opt=0; //重置运算符是否输入的标志

flag_cal=0; //重置是否进行了运算的标志

flag_reset=1; //重置重置标志

}

void Calculate() //执行计算

{

int overflow = OK;

if (flag_n1*flag_n2*flag_opt == 0 ) return;

/*Input is not complete! 输入不完整则直接返回*/

switch (opt)

{

case '+': add(c,a,b); break;//执行加法运算

case '-': sub(c,a,b); break;//执行减法运算

case '*': mul(c,a,b); break;//执行乘法运算

case '/': overflow = div(c,a,b); break;//执行整除运算

case '%': rem(c,a,b); break;//执行求余运算

case '^': n = b->prior->data;power(c,a,n); break;

//暂时以长整数b的最后一组数据为幂,执行乘方运算

};

gotoxy(2,10); //定位到输出位置

cprintf(overflow==OK ? "Result = ":"DivideBy");//输出结果提示

ResultBox(); //控制输出范围,以免搞乱程序界面

OutputNumber(c); //输出运算结果

ClearList(c); //清空长整数c

window(1,1,80,25); //重新设置显示窗口为全屏幕

}

void DoCommand() //根据输入命令进行相应的处理

{

switch(cmd)

{

case '1':InputNumber(a,1);flag_n1=1;break; //输入第1个长整数case '2':InputNumber(b,2);flag_n2=1;break; //输入第2个长整数case 'O':

case 'o':opt=InputOperator();flag_opt=1;break; //输入运算符case 'C':

case 'c':Calculate();flag_cal=1;break; //执行运算

case 'R':

case 'r':ReSet(); //重设系统以便执行下一次运算}

}

void main()

{

InitiInterface();//初始化程序界面

InitList(&a); //初始化长整形数据a,b,c

InitList(&b);

InitList(&c);

do{

GoToCmdxy(); //将光标定位到输入命令处

cmd = getche(); //读取一个操作命令

DoCommand(); //执行相应的命令

}while(cmd!='q' && cmd != 'Q'); //如果输入的是Q或q则退出

DestroyList(&a); //销毁长整形数据a,b,c,释放它们所占的

DestroyList(&b);

DestroyList(&c);

ClearScreen(); //清除屏幕上的显示

}

/*******************************************************

2、IntFace.h 程序界面模块头文件

*******************************************************/

#include

#include

#define NofMenuItem 6

#define IntMenuItem 2

struct IntFaceType

{

int height; //界面高度

int width; //界面宽度

char ProgramName[30]; //程序名

char MenuItems[NofMenuItem][12];//功能选项

int MaxItemLength; //功能选项名最大长度

char prompt[40]; //命令选项提示

int backcolor; //界面背景

int textcolor; //文本颜色

int WaitCmdx; //功能选项输入坐标x

int WaitCmdy; //功能选项输入坐标y

};

void InitiInterface(); //界面初始化

void GoToCmdxy(); //将光标定位到命令选项提示之后

void GoToPrompt(); //将光标定位到命令选项提示行首

void ShowMainPrompt(); //显示命令选项提示

void ClearScreen(); //以清除整个屏幕,并设置为黑底白字模式

void ClearPromptLine(); //清除提示行的显示

void ClearWorkSpace(); //清除工作区的显示

void InputNumberBox(int OneOrTwo);//指定两个输入数的输入窗口,如果超过这个范围文字将自动流动void ResultBox(); //指定计算结果的显示窗口,如果超过这个范围文字将自动流动

/*******************************************************

3、IntFace.c 程序界面处理模块文件

*******************************************************/

#include "IntFace.h"

#include "dos.h"

/*界面长宽及菜单等数据,具体含义见头文件*/

struct IntFaceType IntFace = {14,40,"Long Integer Calcultor",

{"Number 1 ","Number 2 ","Operator ","Calculate","Reset ",

"Quit "},9,"Enter a hotkey: 1,2,O,C,R or Q:",BLUE,WHITE};

/*画界面框架、显示程序功能选项、输入提示等

┌─────────── Long Integer Calcultor ───────────┐

│ Number 1 Number 2 Operator Calculate Reset Quit │

├──────────────────────────────────┤

││

││

││

││

││

││

││

││

├──────────────────────────────────┤

│Enter a hotkey: 1,2,O,C,R or Q: │

└──────────────────────────────────┘*/

void DrawIntFace()

{

int i,j,LenProgramName,len;

putch(218); //画左上角的转角线

LenProgramName = strlen(IntFace.ProgramName); //计算程序名称的长度

len = (IntFace.width - 4 - LenProgramName)/2; //计算程序名称左右横线的长度

for(i=0;i

putch(' ');cputs(IntFace.ProgramName);putch(' ');//显示程序名

for(i=0;i

putch(191); //画右上角的转角线

gotoxy(1,2);putch(179); //画第2行首的竖线

for(i=0;i

for(j=0;j

{

cputs(IntFace.MenuItems[j]);

for(i=0;i

}

putch(179); //画第2行尾的竖线

gotoxy(1,3);putch(195); //画第3行首的三岔线

for(i=0;i

putch(180); //画第3行尾的三岔线

for(j=4;j

{

gotoxy(1,j); //到第j行首

putch(179); //画行首的竖线

for(i=0;i

putch(179); //画行尾的竖线

}

gotoxy(1,IntFace.height-2);putch(195); //画倒数第3行的横线

for(i=0;i

putch(180);

gotoxy(1,IntFace.height-1);putch(179); //显示倒数第2行的输入提示

len = strlen(IntFace.prompt);

cputs(IntFace.prompt);

for(i=0;i

putch(179);

gotoxy(1,IntFace.height);putch(192); //画最后一行的横线

for(i=0;i

putch(217);

}

void InitiInterface() //界面初始化

{

int i, len, lenprompt;

for(i=0;i

{

len = strlen(IntFace.MenuItems[i]);

if(len > IntFace.MaxItemLength) IntFace.MaxItemLength = len;

}

len = (IntFace.MaxItemLength + IntMenuItem) * NofMenuItem + IntMenuItem + 2;

lenprompt = strlen(IntFace.prompt); //输入提示的长度

if (len < lenprompt) len = lenprompt;

if (IntFace.width

if (IntFace.height < 9) IntFace.height = 9; //界面的最终高度

IntFace.WaitCmdx = lenprompt+2; //命令输入处的X坐标

IntFace.WaitCmdy = IntFace.height - 1; //命令输入处的Y坐标

clrscr(); //清屏,以便显示程序界面

textbackground(IntFace.backcolor); //设置界面的背景颜色

textcolor(IntFace.textcolor); //设置界面的文本颜色

DrawIntFace(); //画出界面

}

void ClearScreen()//以清除整个屏幕,并设置为黑底白字的DOS传统模式{

textbackground(BLACK);

textcolor(WHITE);

clrscr();

}

void ClearPromptLine()/* 清除提示行的显示 */

{

int i;

gotoxy(2,IntFace.height-1); //到倒数第2行首

for(i=0;i

GoToPrompt();

}

void ClearWorkSpace()/* 清除工作区的显示 */

{

int i,j;

for(j=4;j

{

gotoxy(2,j); //到第j行首

for(i=0;i

}

void GoToCmdxy() /* 将光标定位到命令选项提示之后 */

{

gotoxy(IntFace.WaitCmdx, IntFace.WaitCmdy);

}

void GoToPrompt() /* 将光标定位到命令选项提示行首 */

{

gotoxy(2,IntFace.height-1);

}

void ShowMainPrompt() /* 显示命令选项提示 */

{

ClearPromptLine();

cputs(IntFace.prompt);

}

void InputNumberBox(int OneOrTwo)

{ /*指定两个输入数的输入窗口,如果超过这个范围文字将自动流动*/ window(11,(OneOrTwo==1)?4:6,IntFace.width-1,(OneOrTwo==1)?5:7);

clrscr();

}

void ResultBox()

{ /*指定计算结果的显示窗口,如果超过这个范围文字将自动流动*/ window(11,10,IntFace.width-1,11);

clrscr();

}

/*******************************************************

4、LongInt.h 长整型数输入输出及运算模块头文件

*******************************************************/

#include "DuCiLink.h"

typedef struct DuCiLinkNode LongIntNode,*LongInt;//采用双向循环链表为实际的存储结构void OutputNumber(LongInt a); //输出一个长整型数

void InputNumber(LongInt a,int OneOrTwo); //输入一个长整型数

void add(LongInt c,LongInt a,LongInt b); //长整型数 c = a + b

void sub(LongInt c,LongInt a,LongInt b); //长整型数 c = a - b

void mul(LongInt c,LongInt a,LongInt b); //长整型数 c = a * b

Status div(LongInt c,LongInt a,LongInt b); //长整型数 c = a / b (整除)

void rem(LongInt c,LongInt a,LongInt b); //长整型数 c = a % b (求余)

void power(LongInt c,LongInt a,int n); //长整型数 c = a ^ n (乘方)

/*******************************************************

5、LongIO.c 长整型数输入输出处理模块文件

*******************************************************/

#include "Intface.h"

#include "LongInt.h"

#include

void OutputNumber(LongInt a) /*输出长整型数*/

{

LongIntNode *s;

s = a->next;

if(a->data < 0) printf("-");/*输出符号*/

/*第1节按实际位数显示*/

cprintf("%d%c",s->data,(s == a->prior)?'\0':',');

s = s->next;

while(s!=a)/*其它每节显示4位数,不足的以0补齐*/

{

cprintf("%04d%c",s->data,(s == a->prior)?'\0':',');

s = s->next;

}

}

void InputNumberMsg(int OneOrTwo)

{ /*显示输入两个长整型时提示 */

window(1,1,80,25);

ClearPromptLine();

cputs("Example:-1,0001,0001;");

gotoxy(2,(OneOrTwo==1)?4:6);

cprintf("Number %d:",OneOrTwo);

InputNumberBox(OneOrTwo);

}

void InputNumberErrMsg()

{ /*输入出错时的提示*/

window(1,1,80,25);

ClearPromptLine();

cprintf("One number out of [0-9999]! Please input the whole number again!");

getch();

}

void InputNumber(LongInt a,int OneOrTwo)

{ /*输入长整型数*/

char c; //记录输入时的逗号和分号

short e; //记录输入数据

short sign = 0; //记录长整型数的符号

short FirstSection = 1; //是否是第1个4位数据组

LongIntNode *pa,*s; //节点的临时指针

InputNumberMsg(OneOrTwo);//显示输入提示

ClearList(a); // 清空长整型数的存储空间

fflush(stdin); // 刷清输入缓冲区,以避免以前错误按键的残留

do{

cscanf("%d",&e);c = getche();//读取数据

if (FirstSection) //如果是第1个组,则设置整型数的符号

{

if(e>=0) sign = 1;

if(e<0) {sign = -1;e *= -1;}

FirstSection = 0;

}

if(e<0 || e>9999)

{ //如果每组的数值不在0-9999之内则报错并要求重输整个长整型数

InputNumberErrMsg();

InputNumberMsg(OneOrTwo);

FirstSection = 1;

ClearList(a);

fflush(stdin);/*刷清输入缓冲区*/

c=',';

}

else//如果本组数值符合要求则加入到长整型数据中

{

InsTail(a,e); //在长整型数尾端加入本组数据

a->data++; //组数加1

}

}while(c!=';');

pa = a->next; //pa指向首结点

while (pa->data == 0 && pa->next != a) //数值为0且不是尾结点则删除

{ /*输入时可在前几节输入多个0,需要删除,但又不能将0删除完*/

s = pa; pa = pa->next; //s指向当前结点,pa指向下结点

a->next = pa; //断开对s的链接

pa->prior = a;

free(s); //释放s

a->data--; //组数减1

}

a->data *= sign; //设置长整型数的符号

InputNumberMsg(OneOrTwo); //以正规格式显示长整数1

OutputNumber(a);

window(1,1,80,25); //重置显示窗为整个屏幕

ShowMainPrompt(); //回到功能选项等待命令输入

}

char InputOperator() //输入运算符

{

char opt;

window(1,1,80,25);

ClearPromptLine();

cputs("Input the operation type ( + - * / % ^ )");

gotoxy(2,8);

cprintf("Operator:");

fflush(stdin); //刷清输入缓冲区

do{

opt = getche();

gotoxy(11,8); //回退1格以便再次输入

}while(opt!='+' && opt!='-' && opt!='*'

&& opt!='/' && opt!='%' && opt!='^');//输入字符是否符合要求ShowMainPrompt(); //回到功能选项等待命令输入

return opt;

}

/*******************************************************

6、LongInt.c 长整型数运算处理模块文件

*******************************************************/

#include "LongInt.h"

Status UnsignedAdd(LongInt c,LongInt a,LongInt b)

{ /*无符号数相加,是普通加减法的基础*/

short sum,carry=0; //进位

LongIntNode *pa,*pb;

pa = a->prior; /*pa,pb分别指两个加数的尾结点*/

pb = b->prior;

while(pa!=a && pb!=b)/* a 和 b 中都有没加的组时,执行加法*/

{

sum = pa->data + pb->data + carry;

carry = sum / 10000; /*进位*/

sum = sum % 10000; /*余数,为当前组的数值*/

if (!InsFirst(c,sum)) return ERROR;/*加到和长整型数的首位*/

pa = pa->prior; /*下一组*/

pb = pb->prior;

c->data++; /*组数加1*/

}

while(pa!=a)/* a 中还有没加的组时,补到和上去*/

{

sum = pa->data + carry;

carry = sum / 10000;

sum = sum % 10000;

if (!InsFirst(c,sum)) return ERROR;

pa = pa->prior;

c->data++;

}

while(pb!=b)/* b 中还有没加的组时,补到和上去*/

{

sum = pb->data + carry;

carry = sum / 10000;

sum = sum % 10000;

if (!InsFirst(c,sum)) return ERROR;

pb = pb->prior;

c->data++;

}

if(carry)/* 如果还有进位*/

{

if (!InsFirst(c,carry)) return ERROR;

c->data++;

}

return OK;

}

Status UnsignedSub(LongInt c,LongInt a,LongInt b)

{ /*无符号数相减,总是用绝对值大的数减绝对小的数

是普通加减法的基础*/

short diff,borrow=0;

LongIntNode *pa,*pb,*pc,*s;

pa = a->prior;

pb = b->prior;

while(pa!=a && pb!=b)

{

diff = pa->data - borrow - pb->data;

if (diff <0 ){borrow = 1; diff += 10000;}else borrow = 0;

if (!InsFirst(c,diff)) return ERROR;

pa = pa->prior;

pb = pb->prior;

c->data++;

}

while(pa!=a)

{

diff = pa->data - borrow;

if (diff <0 ){borrow = 1; diff += 10000;}else borrow = 0;

if (!InsFirst(c,diff)) return ERROR;

pa = pa->prior;

c->data++;

}

if(borrow || pb!=b) return PleaseExchange;

/* 不够减,提请调用程序交换a,b */

pc = c->next;

while (pc->data == 0 && pc->next != c)

{/*相减可能造成前几节数据为0,需要删除,但结果为零时又不能将0删除完*/ s = pc; pc = pc->next;

c->next = pc;

pc->prior = c;

free(s);

c->data--;

}

return OK;

}

void add(LongInt c,LongInt a,LongInt b)

{

if ((a->data * b->data) > 0)

{ /*两数同号,则执行无符号加法,零为当成正数处理*/

UnsignedAdd(c,a,b);

c->data *= (a->data>=0)?1:-1;

}

else /*两数异号,则执行无符号减法*/

{ /*总是用绝对值大的数减绝对小的数*/

if(UnsignedSub(c,a,b) == PleaseExchange)

{ /* a不够b减,则交换a,b的顺序再减*/

ClearList(c);

UnsignedSub(c,b,a);

c->data *= (b->data>=0)?1:-1;

}

else/* a够b减 */

{

c->data *= (a->data>=0)?1:-1;

}

}

}

void sub(LongInt c,LongInt a,LongInt b)

{ /*变减法为加法*/

b->data *= -1;

add(c,a,b);

b->data *= -1;

}

void mul(LongInt c,LongInt a,LongInt b)

{

long product,carry=0; //进位

short sum;

LongIntNode *pa,*pb,*pcend,*pccur,*pc,*s;

pa = a->prior; /*从a的尾结点,即最后一个4位组开始*/

pcend = c; /*记录a的每一组与b相乘时最低位应加到积的哪一组之前*/ while(pa!=a) /*只要a中还有结点未纳入运算,则循环*/

{

if (pa->data == 0) /*如果a的当前4位组为0,则直接加0*/

{

InsFirst(c,0);

c->data++;

}

else

{

pccur = pcend->prior;/*记录乘数应加到积的哪一组*/

pb = b->prior; /*取b的每组与a的当前组相乘*/

while(pb!=b)

{ /*特别注意两个0-9999以内的数相乘需要用long来记录,否则会有溢出*/ product = carry + (long)pa->data * (long)pb->data;

carry = product / 10000;/*进位*/

product = product % 10000;/*余数,也即当前组的值*/

if (pccur == c) /*需要新的结点来存放数据*/

{

InsFirst(c,(short)product);

pccur = c->next;

c->data++;

}

else /*以前的运算已经插入过本4位组,则增加到当前组上*/

{

sum = pccur->data + (short)product;

if (sum > 9999){carry++; sum -= 10000;}

pccur->data = sum;

}

pccur = pccur->prior; /*移动乘积数的当前指针*/

pb = pb->prior; /*移动被乘数的当前指针*/

}/*如果还有进位,则加上去*/

if(carry>0) InsFirst(c,(short)carry);

carry = 0;c->data++;/*清空进位器,并将4位数组数加1*/

}

pcend = pcend->prior; /*乘积数的最低位上移一组*/

pa = pa->prior; /*乘数上移一组*/

}

c->data *= ((a->data * b->data)>=0)?1:-1;

pc = c->next;

while (pc->data == 0 && pc->next != c)

{ /*相乘可能造成前几节数据为0,需要删除,但结果为零时又不能将0删除完*/ s = pc; pc = pc->next;

c->next = pc;

pc->prior = c;

free(s);

c->data--;

}

}

void Addn(LongInt c, short n)

{ /*一个正的长整型加一个最大为20000的正数*/

short carry = n,sum;

LongIntNode *pc;

pc = c->prior;

while(carry != 0 && pc != c)

{

sum = pc->data + carry;

carry = sum / 10000;

sum = sum % 10000;

pc->data = sum;

pc = pc->prior;

}

while(carry != 0)/*如果进位不为零说明需要新的结点*/

{

sum = carry;

carry = sum / 10000;

sum = sum % 10000;

InsFirst(c,sum);

c->data++;

}

}

Status div(LongInt c,LongInt a,LongInt b)/*整除*/

{ //变除为减可以较容易地实现整除,但实际中的意义可能不大LongInt d,e;

short i = 0,EnoughSub;

short adata = a->data, bdata = b->data;

if(b->data == 1 && b->next->data == 0) return OVERFLOW;

if (a->data <0) a->data *= -1;

if (b->data <0) b->data *= -1;

InitList(&d);InitList(&e); /*使用临时长整型数*/

CopyList(a,e); /* e = a */

EnoughSub = UnsignedSub(d,e,b); /* d = e - b */

while(EnoughSub == OK)

{

i++;

if (i == 20000)/*多次相减后再才保存*/

{

Addn(c,i);

i = 0;

}

ClearList(e);CopyList(d,e);ClearList(d);

EnoughSub = UnsignedSub(d,e,b);

/*若采用自减运算则可能没有这样复杂*/

}

Addn(c,i);/*将最后的尾数补上*/

a->data = adata; b->data = bdata;

c->data *= ((adata*bdata >= 0)?1:-1);

DestroyList(&d);DestroyList(&e);

return OK;

}

void rem(LongInt c,LongInt a,LongInt b)/*求余*/

{ //变除为减可以较容易地实现整除,但实际中的意义可能不大LongInt e;

int EnoughSub;

short adata = a->data, bdata = b->data;

if (a->data < 0) a->data *= -1;

if (b->data < 0) b->data *= -1;

InitList(&e);

CopyList(a,c);

EnoughSub = UnsignedSub(e,c,b);

while(EnoughSub == OK)

{ /*若采用自减运算则可能没有这样复杂*/

ClearList(c);CopyList(e,c);ClearList(e);

EnoughSub = UnsignedSub(e,c,b);

}

a->data = adata; b->data = bdata;

if(adata < 0) c->data *= -1;

DestroyList(&e);

}

void power(LongInt c,LongInt a,int n)

{ /*乘方运算,变乘方为累乘*/

int i;

LongInt b;

if (n==0){InsFirst(c,0);return;}

else if(n==1){CopyList(a,c);return;}

InitList(&b);

CopyList(a,b);

for(i=0;i

{

mul(c,a,b);

ClearList(b);

CopyList(c,b);

ClearList(c);

}

mul(c,a,b);

DestroyList(&b);

}

/*******************************************************

7、DuCiLink.h 双向循环链表处理模块头文件

*******************************************************/

#include

#include

#define TRUE 1 //定义一些常数

#define FALSE 0

#define OK 1

#define ERROR 0

#define INFEASIBLE -1

#define OVERFLOW -2

#define PleaseExchange 22

typedef int Status; //定义函数返回值的类型

typedef short ElemType; //定义基本数据类型,我们采用short来表示任意4位整数。typedef struct DuCiLinkNode{ // 双向循环链表结点的存储结构

ElemType data;

struct DuCiLinkNode *prior; //指向上一结点

struct DuCiLinkNode *next; //指向下一结点

}DuCiLinkNode,*DuCiLinkList; //定义双向循环链表结点及链表的类型名

DuCiLinkNode *MakeNode(ElemType e); //以4位整数e构造1个双向循环链表结点

Status InitList(DuCiLinkList *L); //初始化1个双向循环链表,分配1个结点作头结点

//数据域赋初值0,上下结点指针指向自己

void DestroyList(DuCiLinkList *L); //消毁1个双向循环链表,释放它所占用的所有内存空间

//并让链表*L指向NULL

void ClearList(DuCiLinkList L); //清除1个双向循环链表,释放数据结点所占用的内存空间

//保留头结点,并将数据域置为0,上下结点指针指向自己Status InsTail(DuCiLinkList L, ElemType e); //在双向循环链表L的尾结点之后加入1个以e为

//数据域的新结点,并返回OK; 否则返回ERROR。Status InsFirst(DuCiLinkList L, ElemType e);

//将数据元素e插入在线性链表L头结点之后,并返回OK; 否则返回ERROR。

Status CopyList(DuCiLinkList L, DuCiLinkList C);//将双向循环链表L复制到双向循环链表C中。/*******************************************************

8、DuCiLink.c 双向循环链表处理模块代码

*******************************************************/

#include "DuCiLink.h"

DuCiLinkNode *MakeNode(ElemType e)

{ /*以e为数据申请并构造一个结点*/

DuCiLinkNode *s;

s = (DuCiLinkNode *)malloc(sizeof(DuCiLinkNode));

if (s) s->data = e;

return s;

}

Status InitList(DuCiLinkList *L)

{ /*初始化1个双向循环链表,分配1个结点作头结点数据域赋初值0,上下结点指针指向自己*/ (*L) = (DuCiLinkNode *)malloc(sizeof(DuCiLinkNode));

if (!(*L)) return OVERFLOW; //存储分配失败

(*L)->data = 0;

(*L)->prior = (*L);

(*L)->next = (*L);

return OK;

}

void DestroyList(DuCiLinkList *L)

{ /*消毁1个双向循环链表,释放它所占用的所有内存空间并让链表*L指向NULL*/ DuCiLinkNode *p,*s;

p = (*L)->prior;

(*L)->prior = NULL;

while(p){s = p; p = p->prior; free(s);}

(*L) = NULL;

}

void ClearList(DuCiLinkList L)

{ /*清除1个双向循环链表,释放数据结点所占用的内存空间

保留头结点,并将数据域置为0,上下结点指针指向自己*/

DuCiLinkNode *p,*s;

p = L->prior;

while(p!=L){s = p; p = p->prior; free(s);}

L->data = 0;

L->prior = L;

L->next = L;

}

Status CopyList(DuCiLinkList L, DuCiLinkList C)

{ /*将双向循环链表L复制到双向循环链表C中。*/

DuCiLinkNode *p,*s;

C->data = L->data;

p = L->prior;

while(p!=L)

{

s = (DuCiLinkNode *)malloc(sizeof(DuCiLinkNode));

if (!s) return OVERFLOW; //存储分配失败

s->data = p->data;

C->next->prior = s;

s->next = C->next;

s->prior = C;

C->next = s;

p = p->prior;

}

return OK;

}

Status InsTail(DuCiLinkList L, ElemType e)

{ /*在双向循环链表L的尾结点之后加入1个以e为

数据域的新结点,并返回OK; 否则返回ERROR。*/

DuCiLinkNode *s;

s = (DuCiLinkNode *)malloc(sizeof(DuCiLinkNode));

if (!s) return OVERFLOW; //存储分配失败

s->data = e;

s->prior = L->prior;

s->next = L;

L->prior->next = s;

L->prior = s;

return OK;

} // InsTail

Status InsFirst(DuCiLinkList L, ElemType e)

{// 将数据元素e插入在线性链表L头结点之后,并返回OK; 否则返回ERROR。

DuCiLinkNode *s;

s = (DuCiLinkNode *)malloc(sizeof(DuCiLinkNode));

if (!s) return OVERFLOW; //存储分配失败

s->data = e;

L->next->prior = s;

s->next = L->next;

s->prior = L;

L->next = s;

return OK;

} // InsTail

c语言课程设计报告·图书管理系统

第一章 §题目描述 图书管理系统设计: 【要求】图书管理信息包括:图书名称、图书编号、单价、作者、存在状态、借书人姓名、性别、学号等。试设计一图书管理系统,使之能提供以下功能: (1)新图书基本信息的输入; (2)图书基本信息的查询; (3)对撤销图书信息的删除; (4)办理借书手续; (5)办理还书手续; 【提示】建立图书馆里信息结构体,结构体成员包括图书名称、图书编号、单价、作者、存在状态、借书人姓名、性别、学号。存在状态设为整型,可用不同数字代表借还状态。借书和还书手续要注意修改结构体的成员变量存在状态的值。 §算法设计 1.设计思想: 在整个系统编写的过程中,涉及了较多C语言知识点,对于不同的数据类型、程序控制结构、数据结构作以分析和总结,并结合这个课题进行综合的应用,在一定程度上做到了对所学知识融会贯通。由此进一步加深、巩固了所学的课程的基本理论知识,培养了综合分析问题、解决问题的能力。在设计程序时,参考了学校图书馆的图书管理系统,实现了程序的模块化、结构化。在主函数中调用各种函数,操作界面简单,易操作,人机互动性较强。 2.实现注释: 这个实用的小型图书管理系统程序以结构体数组指针操作完成,并实现文件信息的录入、修改和保存等功能,所有信息以磁盘文件方式保存,方便用户使用。本图书管理系统分为管理员和学生两个部分,其基本功能包括了对图书信息的存储、查询、添加、删除和借书、还书手续办理等。查询时可按书名、编号等方式查询,找到后输出这本书的所有信息。可查询图书的在库状态,方便用户进行借书、还书操作。在借书还书成功后图书的在库状态自动改变,并更新信息到数据库。系统中主要的数据结构就是图书名称、图书编号、单价、作者、存在状态、借书人姓名、性别、学号等。在处理过程中各项可以作为一本图书的不同属性来进行处理。 3.结构体系设计 图:主函数结构;图:新书信息录入流程;图:图书信息查询(管理员)流程;图:图书信息查询(学生)流程;图:图书信息删除流程;图:办理借书手续流程;图:办理还书手续流程; §程序设计及代码分析 1.程序设计: 下面,我大致介绍一下我的系统的主要功能和注意事项: 当运行此程序时,首先进入系统主界面,然后可以选择[1].管理员登陆(密码:123),[2].学生登陆,[0].退出系统; 选择[1]后进入管理员系统,验证密码成功后显示管理员功能菜单,按数字键选择所需服务。管理员功能菜单中,[1].新书信息录入,[2].图书信息查询,[3].图书信息删除,[4].返回主菜单,[0].退出系统;当出现“请选择”时,输入选项前的数字,输完之后按回车(下同)。首次运行系统需要先选择[1]录入库存书籍信息,图书各信息项须用空格键隔开,输入完毕后信息自动储存并更新至数据库,然后再选择其他操作。当选择[3]时会进入图书信息删除,在这里可以选择删除图书信息等操

C语言课程设计报告-游戏2048

东华理工大学C语言课程设计报告 学院:国际教育学院学院专业:电子信息工程 班级:1420606 学号:201420060638 姓名:钟天运

一、课程设计题目:游戏2048 二、课程设计要求: a)使用C语言编写2048这款游戏 b)能够正常运行,拥有游戏界面。 c)能正常进行游戏从开始到结束。 d)用户操作方便 三、设计思路: a)游戏介绍: i.2048是一款简单的数字类游戏,界面是一个 4*4的方形格子。每个格子里可以为空或者有 一个2^n的数值。 ii.用户可以输入4种指令,分别是:上下左右,游戏会根据用户的指定的方向,将格子中 的数值向对应方向进行移动,直至移动到最边 上的格子或者有其他数值占用,如果碰到等大 数值,将会进行合并。此外,成功移动后,会 在一个空格子随机生成一个2或者4 iii.游戏目标是合成2048这个数值或者更大的数值。 b)实现思路: i.可以使用二维数组来保存4*4格子中的数值 ii.指令,可以通过输入字符函数,读取用户

在键盘上的方向键,进行判断执行对应的代 码。 iii.游戏界面,可以使用简单的特殊制表符,来实现,并通过清屏函数来进行反复同位置打 印界面。 iv.需要判断游戏结束的函数,以及记录游戏分数和步骤的变量 v.当游戏结束时,能够询问用户是否重新开始。 vi.随机生成一个新数,可以调用随机函数,使用时间做种子。 c)实现难点: i.打印游戏界面,要实现灵活能根据棋盘数组里 面的数据灵活打印。 ii.执行操作时,数值的移动和合并。

四、流程图

五、C语言源代码 // 游戏2048.c #include "windows.h" #include "time.h" #include "stdio.h" #include "conio.h" #include "string.h" //宏定义常量方向键值 //const int LEFT = 75, UP = 72, RIGHT = 77, DOWN = 80; #define LEFT 75 #define UP 72 #define RIGHT 77 #define DOWN 80 const char error_str[] = "您上次输入的指令无法识别,请重新输入。"; struct board { int place[4][4]; long int stepn; long int num; //存储游戏分数 long int time; int dtk; //direction key 记录方向键,及操作方向 int over; int zeronum; }; //该函数为游戏运行函数,当只是玩游戏的时候。进入该函数,游戏控制函数。int main() { //place数组为棋盘,其中为零代表空,-1代表不能合并的牌,其他2的倍数值为本身含义,初始化为全0。 struct board board1, board_backup; int newgame(struct board *, int), show(struct board *), operate(struct board *); char str[100] = "首次运行游戏"; //用于记录系统返回给用户的信息,例如:上一步执行向左合并,按键有误等 newgame(&board1, 0); //调用函数为新局初始化,第二个

数据结构长整数四则运算(DOC)

实习1 1.4长整数四则运算 实习报告 题目:设计一个实现任意长的整数进行加法运算的演示程序。 一、需求分析 1.本演示程序中,利用双向循环链表实现长整数的存储,每个结点含一个整型变量任何整型变量的范围是-(215-1)—(215-1)。在每个结点中仅存十进制数的4位,即不超过9999的非负整数,整个链表表示为万进制数。输入和输出形式按中国对于长整数的习惯,每四位一组,组间用逗号隔开。 2.演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据(滤去输入数据中的非法字符)和运算结果显示在其后。 3.程序执行的命令包括: (1)构造链表;(2)输入数据;(3)数据处理;(4)结束 4.测试数据 (1)0;0;应输出0。 (2)-2345,6789;-7654,3211;应输出-1,0000,0000. (3)-9999,9999;1,0000,0000,0000;应输出9999,0000,0001 (4)1,0001,0001;-1,0001,0001;应输出0。 (5)1,0001,0001;-1,0001,0000;应输出1. (6)-9999,9999,9999;-9999,9999,9999;应输出-1,9999,9999,9998。 (7)1,0000,9999,9999;1;应输出1,0001,0000,0000。 二、概要设计 struct LinkNode //定义结构体LinkNode { int data; //记录每个节点的整数(小于10000) LinkNode *next; //记录下一个节点的地址 LinkNode *pre; //记录前一个节点的地址 }; class LinkList //定义类LinkList

整数和小数四则运算的意义和法则练习

整数和小数四则运算的意义和法则练习 一、说一说下面算式表示的意义。 1、654+32表示()。 2、432÷32表示()。 3、4.32×32表示()。 4、432-32.2表示()。 二、直接写得数。 1.17+0.06= 1.89-0.06= 2.3+3= 1.92-0.2= 6.4-2.8= 3-0.6= 0.9×3= 1.3×0.4= 1.8×0.5= 5.2÷13= 0.54÷3= 0.91÷7= 2.06÷0.2= 0.25×0.4= 0.84÷0.12= 27.27÷27= 3.49+0= 0÷578= 48÷0.06= 2.4×5= 三、不计算,在○里填上“>”、“<”或“=”。 0.75÷3○0.75 7.625○7.625÷1.01 0.8×6.9○6.9 1.23×0.3○1 2.3×0.03 758÷1000○758×0.001 6.7×4.8○(6.7×12)×(4.8÷12) 4.78÷0.93○4.78

四、计算下面各题,并且验算。 325+4379 47.5-7.65 18.4×75 587.1÷0.57 五、根据43×78=3354,直接写出下面各题的得数。 43×0.78= 0.43×7.8= 33.54÷0.78= 3354÷0.43= 六、填空。 1、一道减法算式,被减数、减数和差相加的和是156,这道题的被减数是()。 2、一角、二角硬币合计3元6角,两种硬币枚数相等,那么这两种硬币共()枚。 3、两个数相除商17余8,这两个数加上商与余数的总和是927,这两个数分别是()和()。 4、一个数扩大4倍后再增加50,然后缩小2倍,再减去24,得30。这个数是()。 5、两个数相除的商是0.02,如果被除数扩大10倍,除数缩小10倍,那么商是()。 6、□÷18=3……□,要使余数最大(),被除数应该是()。

c语言课程设计报告书--学生成绩管理

C 语言程序设计报告 课题:学生成绩管理 时间:

一、需求分析 任务要求: 自学C语言中有关链表及外部文件的内容,设计出学生成绩管理。具体要求如下: 1.主要功能: (1)能按学期、按班级完成对学生成绩的录入、修改 (2)能按班级统计学生的成绩,求学生的总分及平均分,并能根据学生的平均成绩进行排序 (3)能查询学生成绩,不及格科目及学生名单 (4)能按班级输出学生的成绩单 系统功能需求分析: 1、定义一个结构体类型,成员包括学期、班级、各科成绩、建立链表,定义该结构体类型的指针,用于指向各结点; 2、分别建立具有添输入、修改、查询、总分及平均分、排序等功能的子函数,完成相应功能,对程序实现模块化。 二、概要设计 系统总体设计框架: 对程序进行模块化,建立输入、修改、查询、查找和显示功能的子函数,各子函数中运用链表存储数据。 系统功能模块图:

三、详细设计 主要功能模块的算法设计思路如下: 1、输入信息函数 (1)定义指向结构体变量的指针; (2)移动指针,找到插入结点; (3)在要插入的结点输入信息; (4)返回头指针。 2、修改信息 (1)定义指向结构体变量的指针; (2)用指针检验链表中是否有记录,若没记录,出现报错,然后要求重新输入; (3)根据要修改的编号查找对应结点; (4)修改信息;

(5)修改成功。 3、排序函数 (1)定义所要排序的班级和链表的头指针为形参; (2)调用排序函数,把班级和链表的头指针赋给形参; (3)在子函数中进行排序; (4)输出排序结果。 4、显示学生成绩信息(void Disp(Link l)) (1)选择想要查询的项目(学生各科成绩、不及格科目、班级成员);(2)用指针检验是否有记录; (3)若无记录,输出提示信息,返回主函数; 若有记录,移动指针,依次输出记录; 5、查询班级成绩信息(void Find(Link l)) (1)选择所要查询的班级; (2)输入班级: (3)在链表中寻找相应结点; (4)输出结点信息。 以上各个函数的流程图如下:

c语言课程设计报告学生成绩信息管理系统源代码

实验报告 一、问题陈述及其需求分析 (一)问题陈述 学生信息管理系统是对学生信息的基本管理,其中包括以下及模块: (1)增加一个学生的信息(需输入要增加学生的所有信息); (2)统计本班学生总人数及男女生人数。 (3)分别按照学号查找学生的信息;若找到则输出该学生全部信息,否则输出查找不到的提示信息。 (4)按学号对所有学生信息排序,并输出结果; (5)删除一个学生的信息(需指定要删除学生的学号);同时显示删除后的结果。( 二) 功能需求分析 学生信息管理系统设计 学生信息包括:学号,姓名,性别,出生年月,电话 使之提供以下功能: 1、系统以菜单方式工作 2、建立链表并显示 3、插入新的学生信息 4、删除某学号的学生信息 5、查找某学号的学生信息 6、对学生信息排序 7、统计学生人数 8、输出学生信息 二总体设计 (一)模块 依据程序的数据结构,描述该程序的层次结构,如下图:

1、建立链表并显示 void createlist(struct stucode **r); 2、插入新的学生信息 void insert(struct stucode **r); 3、删除某学号的学生信息 void del(struct stucode **r); 4、查找某学号的学生信息 void search1(struct stucode *r); 5、对学生信息排序 void sort(struct stucode **r); 6、统计学生人数 void search2(struct stucode *r); 7、输出学生信息 void out(struct stucode *r); 1 建立链表并显示 2 添加学生信息 3 删除学生信息 息 4 按学号查找学生信 5 对学生信息排序 6统计学生人数 7输出学员信息 8 学生信息写入文件 0退出 main() 菜单函数

新苏教版四年级 整数四则混合运算练习题

整数四则混合运算题 姓名: 40+160÷40 288-144÷18+35 (58+37)÷(64-9×5)95÷(64-45)478-145÷5×6+46 122-36×4÷12+35 85+14×(14+208÷26)21+(327-23)÷19 539-513÷(378÷14) 74-3094÷17÷13 19+(253-22)÷21 50+129×28-42 (23+23)×24-597 (110-10)÷10-10 54-24+14×14 304-275÷(275÷25) (70+10)÷(18-10) 120÷12×18-54 44+15×16-32 (10-100÷10)×11 (53-588÷21)×36 (60+10)÷(17-10) 17+(233-43)÷10 110÷10×10-97

424-437÷19×16 22+(374-10)÷26 (245-11)÷18-11 22-(10+100÷10) (252-14)÷17-10 35-13+10×15 (346-10)÷16-12 215-198÷(121÷11) (45-651÷21)×33 19+192÷12-10 572÷22×23-158 19+56-1224÷34 (714-12)÷27-19 14+(21-19)×14 18-(13+15)÷262 736÷(43-20)×23 (227+11)÷(31-14) 36+19×14-23 828÷23×12-48 18-15+10×18 (31-154÷11)×12 (1369-37)÷37-32 160÷(22-12)×22 357÷21×13-213 985-728÷26×35 (438-39)÷21-12 (20+18)×11-239

四则运算法则

一、整数四则运算法则。 整数加法计算法则: 1)要把相同数位对齐,再把相同计数单位上的数相加; 2)哪一位满十就向前一位进。 整数减法计算法则: 1)要把相同数位对齐,再把相同计数单位上的数相减; 2)哪一位不够减就向前一位退一作十。 整数乘法计算法则: 1)从右起,依次用第二个因数每位上的数去乘第一个因数, 乘到哪一位,得数的末尾就和第二个因数的哪一位对个因数的哪一位对齐; 2)然后把几次乘得的数加起来。(整数末尾有0的乘法:可以先把0前面的数相乘,然后看各因数的末尾一共有几个0,就在乘得的数的末尾添写几个0。) 整数的除法计算法则 1)从被除数的高位起,先看除数有几位,再用除数试除被除数 的前几位,如果它比除数小,再试除多一位数; 2)除到被除数的哪一位,就在那一位上面写上商;(如果哪一位不够商“1”,就在哪一位上商“0”。) 3)每次除后余下的数必须比除数小。

二、小数四则运算法则 (一)小数加、减法的计算法则: 1)计算小数加、减法,先把各数的小数点对齐(也就是把相同数位上的数对齐), 2)再按照整数加、减法的法则进行计算,最后在得数里对齐横线上的小数点,点上小数点。 (得数的小数部分末尾有0,一般要把0去掉。) (二)小数乘法法则: 先按照整数乘法法则算出积,再看因数中一共有几位小数,就从积的右边向左数出几位,点上小数点。 (三)小数的除法运算法则 (1)除数是整数的小数的除法除数是整数的小数除法,可按照以下步骤进行计算: ①先按照整数除法的法则去除; ②商的小数点要和被除数的小数点对齐; ③除到被除数的末尾仍有余数时,就在余数后面添0,再继续除。2)除数是小数的小数除法 除数是小数的小数除法,可按照以下步骤进行计算: ①先把除数的小数点去掉使它变成整数; ②看除数原来有几位小数,就把被除数小数点向右移动相同的几位(位数不够时补0占位);

c语言课程设计报告书

课程设计报告书 所属课程:c语言 项目:库函数模拟系统 指导老师:邹姝稚 班级:软件1401 姓名:江闯 学号:141403107 分数:

1.任务描述: 本系统开发的代码模拟了下列库函数的功能: (1).模拟gets和puts的功能:能接收一个字符串,将其写入ASCII文件,并且可以读出显示。 (2).在不使用字符串库函数的条件下,编程实现字符串的拷贝,连接,求长,倒置功能。 (3).字符串加密功能:将一段明文建立到一个ASCII文件中,按加密的算法加密后写入密文文件,最终实现将明文和密文文件都显示出来。 (4).编程实现字符串与对应数字的相互转换功能。 2.总体设计: 模块调用图: 图1

函数调用图: 图2 函数功能: (1)函数gp( ):模拟gets和puts的功能 (2)函数kaobei( ):实现字符串的拷贝 (3)函数lianjie( ):实现字符串的连接 (4)函数qiuchang( ):实现字符串的求长 (5)函数daozhi( ):实现字符串的倒置 (6)函数jiami( ):实现字符串的加密功能,最后将明文和密文文件都显示出来 (7)函数zhuanhuan1( ):将数字字符串转换为对应的数字 (8)函数zhuanhuan2( ):将数字转换为对应的数字字符串 3.详细设计: (1).模仿gets和puts功能: gets和puts功能与scanf和printf函数的功能相似,但是也不是完全相同,本系统模拟功能的程序总共运用了两次函数调用技术,模拟gets运用了一次,模拟puts运用了一次。 (2)..字符串的拷贝功能: 字符串的拷贝功能程序设计源于strcpy的功能,其中运用了字符串数组和指针的相关技术,还运用了一组while语句,实现语句的循环,从而将一个字符串拷贝到一个空数组中。

c语言课程设计报告

C语言程序设计B 课程设计报告 设计题目:学生成绩管理系统年级班级: 学号: 姓名: 指导教师: 2020 年 6 月 18 日

目录 一、设计目的 (3) 二、课程设计内容和要求 (4) 三、总体设计 (5) 四、主要步骤 (12) 五、功能实现 (13) 六、功能测试 (64) 七、评价程序 (83) 八、课程设计体会 (84)

一、设计目的 程序设计能力是当代理工类大学生的必备能力,当学生学习了C语言之后,编程能力远远不能达到开发实际应用程序的要求,特备是对其中的指针、结构体、链表和文件部分的理解和应用都比较弱。 程序设计的目的是通过对面向过程的学习,将C语言的主要知识点进行综合,针对提高学生C语言程序设计能力,强化编写较大的应用软件能力,熟练运用已掌握的知识解决实际需要解决的问题,以达到更加熟知指针、链表、结构体、文件读取、标准库的使用。 主要目的为以下几点: 1、熟练掌握面向过程(结构化)程序设计基本知识; 2、综合运用所学知识解决实际问题; 3、受到面向过程(结构化)程序设计的基本训练; 4、体会面向过程(结构化)开发程序的过程。

二、课程设计内容和要求 1.课程设计内容: 学生通过使用C语言进行编写算法,开发学生成绩管理系统,以实现对学生成绩的管理。 2.课程设计要求 1)具有菜单,可以在菜单上进行选择; 2)能实现学生数据录入、修改、删除、查询; 3)能实现数据排序; 4)有数据输出功能; 5)有数据读取与存储功能; 6)一个学生的数据(称为:每条记录)包含姓名、学号、语文、数 学、英语、总分、名次等信息; 7)以结构方式存储每条记录; 8)多条记录以链表方式存储到内存; 9)随时可将全部数据存储到磁盘文件中,方便下次从磁盘读取数据。

实验报告长整数四则运算

实验报告:长整数四则运算 实验者:唐怡04120082 题目:设计一个实现任意长的整数进行加法运算的演示程序 一.需求分析 1.本演示程序中,长整数为任意长的带符号的长整数的输入及求加法后输出的长整数形式为每四位一组,组间用逗号隔开,输入以“回车符”为结束标志。 2.程度执行的命令包括:1)构造整数1,2)构造整数2,3)做加法运算,4)结束3.测试数据 (1)0;0;应输出“0” (2)-2345,6789;-7654,3211;应输出“-1,0000,0000” (3)-9999,9999;1,0000,0000,0000;应输出“9999,0000,0001” (4)1,0001,0001;-1,0001,0001;应输出“0” (5)1,0001,0001;-1,0001,0000;应输出“1” (6)-9999,9999,9999;-9999,9999,9999;应输出“-1,9999,9999,9998” (7)1,0000,9999,9999;1;应输出“1,0001,0000,0000”。 二.概要设计 为实现上述程序功能,应以有序表实现长整数的存储,为此,需要抽象数据类型:有序表 1.有序表的抽象数据类型定义为: ADT Dulinklist{ 数据对象:D={ai|ai为带符号整数,1,2,…,n,n>=0} 数据关系:R1={|ai-1,ai属于集合D,ai-1

C语言课程设计图书管理系统课程设计报告

C语言课程设计 图书管理系统 Books Management System 学生姓名张朝柱 学院名称徐州工程学院学号140 班级13计转本 专业名称计算机科学与技术 指导教师李子龙 2016年5月10日

一、需求分析 为了满足图书管理的要求,通过计算机技术给图书管理人员和读者借、还书带来便利。使用c语言编写了图书管理系统。本系统主要实现图书信息管理的功能,通过此系统可对图书馆库存图书信息进行管理和维护操作。实现了图书馆内管理的一般功能,包括查询、借书、还书、添加、删除、修改图书信息等。所设计的系统以菜单方式工作,为用户提供清晰的使用提示,依据用户的选择来进行各种处理,并且在此过程中能够尽可能的兼容用户使用过程中可能出现的异常情况。图书信息包括编号、书名、作者、数量、在库状态等。图书信息的录入和显示要求有一定的规范格式,录入的图书信息用文件形式保存,并可以对其进行浏览、查询、借阅、还书等基本操作。整个程序实现顺序表操作,对图书信息的操作逐个地进行,一个图书信息的更改不应影响其他的图书记录。 二、算法设计: 1.设计思想: 整个系统制造的而过程中,涉及了较多C语言知识点,对于不同的数据类型、程序控制结构、数据结构作以分析和总结,并结合这个课题进行综合的应用,在一定程度上做到了对所学知识融会贯通。进一步加深、巩固了所学的专业的基本理论知识,培养了综合分析问题、解决问题的能力。在设计程序时,实现了程序的模块化、结构化。在主函数中调用各种子函数,操作界面简单,易操作。 2,设计表示: (1)、整个系统除了主函数外,另外还有各种功能子函数,利用无限次循环语句while()和选择语句swithch()实现各个子函数的调用,系统根据输入的数字选项来调用相应的函数,以实现相应的功能。主要实现了图书的录入、存储、查询、借书、还书、显示库存等功能。 (2)、void Book_Entering(struct SqList &SL);这是一个录入图书信息的函数,它主要实现了顺序表的创建,并且在创建过程中从文件读取信息到顺序表中,以用于后面其他函数的操作。它引用了一个顺序表SL。其他函数调用时只需传入顺序表头即可。 (3)、int main(void);这五个函数时整个图书管理系统的全部菜单函数,Book_Entering();为系统主界面,进入时可选择进入程序和退出程序。menu1();为进入程序时显示的功能菜单,在此菜单可以选择录入、保存图书信息,也可选择进入其他子系统。Book_Inquire();此菜单为进入图书管理系统的菜单,在此可以选择添加、删除、修改图书等操作。cxmenu();为查询系统的菜单,在此可以选择按书名、编号、作者等方式进行查询图书。jhmenu();为借书还书的子菜单,在此可以选择借书还书操作。操作完成后按提示信息进行文件的保存操作。 (4)、void Book_Inquire(struct SqList &SL);这个函数为顺序表的输出函数,把顺序表的头传给函数后,可输出整个顺序表的所有信息。、

C语言课程设计报告-模板

C语言课程设计报告 班级:16 物联网 一、题目说明 (1)读取输入信息,能正确进行数字运算

(2)拥有记忆功能,可查询最近几次计算结果并继续进行数字运算。 二、基本功能实现 (1)能实现两个数之间的加减,乘,除,乘方,开方等运算。 (2)实现记忆功能,可保留近十位结果,可用#键查看。(3)*键作为清0键,清除当前屏幕上的值为0表示重新开三、设计流程(可以画流程图,可以直接写说明)

四、代码 #include #include #include #include double yunsuan(double a, char operate, double b); //处理数值之间的运算void PutRes(double array[], double res, int *i); //保存该次运算结果 int main() { char str[40]; double a = 0; double b = 0; double res = 0; double history[10] = {0,0,0}; char opt; int i = 0; printf("欢迎进入计算功能(eg: 1 \n+ 1 ; '#':查询历史结果; 'q':退出程序)·\n"); while(1){

fgets(str,40,stdin); //将从键盘的一整行标准输入保存在字符串str中 if(sscanf(str,"%lf", &a) == 1){ //将str以长浮点型的格式放入a中,如果返回值为1,说明输入的是数值, scanf("%c %lf", &opt, &b); //获取操作符的值和另外一个操作数的值 res = yunsuan(a,opt,b); //调用yunsuan()函数计算,并将结果给res printf("%lf %c %lf = %lf\n\n",a, opt, b, res); PutRes(history, res, &i); //调用函数PutRes()将本次结果保存到数组history中(i用引用传递) // printf("%d\n", i); }else if(sscanf(str,"%c",&opt) == 1){ //将str以字符型的格式放入opt中,如果返回值为1,说明输入的是字符 if(opt == '#'){ //如果opt为‘#’,则显示history 中的数值 int j = 0; for(j = 0; j < i; ++j){ //i为history中存放的数值个数 printf(" %lf ", history[j]); } printf("\n");

四年级整数四则混合运算200题

四年级整数四则混合运算200 题 2100-21 X 53+2255 800-(2000-9600 - 8) (488+344) - (202-194) 605X(500-494)-1898 9125-(182+35X 22) 3800-136X 9-798 918 - 9 X (108-99) (2944+864) - (113-79) (5011-43X 85)+3397 816 - (4526-251 X 18) (28+172)- (24+16) 86 X (35+117 - 9) 16X 4+6X 3 24X 4-42- 3 56- 4+72- 8 920-1680- 40- 7 148+3328- 64-75 2100-94+48X 54 4215+(4361-716)- 81 36-720 -(360 - 18) (528+912)X 5-6178 (103-336- 21)X 15 40X48-(1472+328)-5 2940- 28+136X 7 (2886+6618) - (400-346) (154-76)X (38+49) (104+246)X (98- 7) (8645+40X 40)- 5 8080- 1877+1881-3 2300-1122- (21-15) (7353+927)- (801-792) 950-28X 6+666 2500+(360-160- 4) 39- 3+48- 6 7X 6-12X 3 2940- 28X 21 690+47X 52-398 360X 24- 32+730 51+(2304-2042)X 23

c语言语言课程设计报告

上海应用技术学院 课程设计 2011~ 2012学年第二学期 设计题目成绩记录簿 院(系)计算机科学与信息工程学院 专业计算机应用技术 班级 11104114 学号 1110411414 学生姓名蒋佳琴 设计时间 2012.06.25 -2012.07.06 指导教师马智娴 提交日期 2012.07.06

上海应用技术学院课程设计任务书 指导教师(签名):马智娴教研室主任(签名):马智娴2012年6 月25日2012年6月25日

目录 1 设计目的 (5) 2 功能描述 (5) 2.1模块功能 (5) 2.2流程图 (6) 3 总体设计 (13) 3.1 功能模块设计 (13) 3.2 数据结构设计 (13) 3.3 函数功能描述 (13) 4 程序实现 (14) 4.2 运行结果 (25) 5课程设计总结 (28)

成绩记录簿 1. 设计要求: 基本功能 a) 添加成绩 b) 删除成绩 c) 查询学生成绩 d) 查询班级成绩 e) 退出 拓展功能 a) 写入文件 b) 读取文件 创新(自拟)功能: 程序实现的其它功能由个人自拟。 2. 设计要求具体说明 基本功能: 成绩记录簿中记录以下数据: 学号、姓名、课程编号、课程名称、成绩、学分,所有成绩都以百分制计分; 输入信息时要检查数据项学号、课程编号、成绩、学分的合法性,学号:8位数字;课程编号:5位数字;成绩:0 ~ 100 之间的整数,学分: 1~ 5之间的实型数。 添加成绩:需要输入学生的学号或姓名、课程编号及成绩,如已有该门课程成绩给出提示; 查询(班级或个人)成绩: a) 查询个人成绩:以学号或姓名作为关键字,可查询一个学生的所有成绩,和已完成 的总学分。 b) 查询班级成绩:以课程编号为关键字,成绩表后面要统计平均分、及格率及全班同 学不同课程在不同分数段分布的人数及百分比。 拓展功能: a) 程序启动时先从文件读入数据,如果文件中没有数据则给出提示; b) 每次修改的数据写入文件。 3. 提示 定义合适的结构体类型,使用链表或数组的方式组织数据。

大数据结构课程设计(长整数四则运算)

一、需求分析 1.本程序实现计算任意长的整数的四则运算. 以用户和计算机对话的方式,先后输入数字的最多位数,然后程序就计算并显示出这两个数的运算。 2. 利用双向循环链表现实长整数的存储,每个结点含一个整形变量。输入的形式以回车结束,可以直接输入正数或负数,程序会过滤掉无效的字符。按中国对于长整数的表示习惯,每四位一组,除数字和位于首位置的负号外,其它一切字符都将作为分隔符,连续多个分隔符当一个处理。但不使用分隔符也不影响结果。 3.测试数据(1)0; 0; 输出“0”; (2)-2345,6789; -7654,3211; 输出“-1,000,000”; (3)-9999,9999; 1,0000,0000,0000; 输出“9999,0000,0001”; (4)1,0001,0001; -1,0001,0001; 输出“0”; (5)1,0001,0001; -1,0001,0001; 输出“1”; (6)-9999,9999,9999; -9999,9999,9999; 输出“-1,9999,9999,9998”; (7)1,0000,9999,9999; 1; 输出"1,0001,0000,0000". 二、概要设计 为实现上述程序功能,应以双向循环链表表示长整数。为此,需要定义一个抽象数据类型。 1. 抽象数据类型定义为:

ADT OrderedList{ 数据对象:D={ai|ai∈int,i=1,2,...n, n≥0} 基本操作: init(&a,digit4) 操作结果:构造一个位数是digit4*4长整数。 pass(&a,&b,&c) 初始条件:a,b,c都已存在 操作结果:c等于a和b的和。nep(&a) 初始条件:a已存在。 操作结果:a变为输入参数的相反数。printlong(&a) 初始条件:a已存在。 操作结果:按四位一组,分隔符为","的格式,在屏幕上输出a。ston(&S,&a) 初始条件:a已存在。 操作结果:把字符串形式的长数字赋给a。}ADT OrderedList 2.本程序包含两个模块: 1)主程序模块:V oid main(){ 选择操作: 1:帮助。 2:加法。 3:减法。

C语言课程设计报告烟花绽放

课程设计报告书设计题目烟花绽放 系别计算机工程系 专业计算机科学与技术 班级 姓名 指导教师 设计任务下达日期2011年 12 月 24 日 设计时间2011年12月26日至 2010年12月30日 课程设计任务书

一、目的和意义 本课程设计是《C语言程序设计》课程的后继教学环节, 通过研究C语言中图形编程技术或者声音控制等其它方面的多媒体编程技术,一方面拓展学生在这些领域的C语言知识,另一方面使学生在运用所学理论知识进行实践开发,更好的培养学生综合学习能力和实践能力。本次课程设计学生可以根据喜好,可以利用复杂的数据类型实现成绩管理系统等小型的综合应用程序。 二、题目(可从下面题目中任选一个) 1、C语言的图形编程应用 设计实现如菜单、图形的显示,再如动画和小游戏。 2、简易电子琴模拟程序的实现 为实现在键盘模拟电子琴设计的程序。由学生自行设计并且实现。 3、成绩管理程序 学生本人设计具体方案,然后改进和编码实现。 三、课程设计报告书应包括的主要内容 1、介绍概要的思路和设计方案,程序的总体功能和模块划分。 2、主要算法的介绍及流程图,主要功能的实现手段的说明文档。 3、对于有设想但最终未实现的功能的大致编程思路的阐述和设计过程中的启发。 四、进度要求 1、设计时间:2011年12月19日至2011年12月25日 2、编写课程设计报告书:2011年12月26日至2011年12月29日 3、提交报告及答辩时间:2011年12月30日 专科 四、进度要求 1、设计时间:2011年12月26日至2011年12月28日 2、编写课程设计报告书:2011年12月29日 3、提交报告及答辩时间:2011年12月30日 目录

含有中括号的整数四则混合运算练习题

四则混合运算练习540÷﹙30×15÷50﹚ 6×58-﹙174+89﹚ ﹙75+49﹚÷﹙75-44﹚ 25×﹙22+576÷32﹚ 84÷[﹙8+6﹚×2] 42×[169-﹙78+35﹚] 72÷[960÷﹙245-165﹚] 540÷[﹙3+6﹚×2] 180÷[36÷﹙12+6﹚] 75×12+280÷35 48×﹙32-17﹚÷30 ﹙564-18×24﹚÷12 490÷[210÷﹙750÷25﹚] 576÷﹙33+15﹚ ﹙736÷16+27﹚×18 902-17×45 ﹙87+16﹚×﹙85-69﹚ 680+21×15-360 [175-﹙49+26﹚]×23 972÷18+35×19 ﹙29+544÷34﹚×102 26×﹙304-286﹚÷39 756÷[4×﹙56-35﹚] 36+300÷12 848-800÷16×12 ﹙132+68﹚×﹙97-57﹚ 972÷﹙720-21×33﹚ 450÷[﹙15+10﹚×3] ﹙45+38-16﹚×24 500-﹙240+38×6﹚ [64-﹙87-42﹚]×15

﹙7100-137-263﹚÷100 250+240÷8×5 840÷40+40×40 960-720÷8×9 2400÷[1200÷﹙600÷15﹚] 520+22×﹙15+45﹚ 160+740÷20-37 900÷[2×﹙320-290﹚] [492-﹙238+192﹚]×26 972-﹙270+31×9﹚ 600-﹙165+35×3﹚[196+﹙84-12﹚]×5 7100-137-263+300 675-600÷15×12 720÷[﹙187+18﹚÷41] 14×[﹙845-245﹚÷12] [668-﹙132+245﹚]÷97 12×[﹙76+57﹚÷19] 840÷﹙320÷80﹚ ﹙28+32﹚×﹙90-40﹚ 480÷[4×﹙50-40﹚] 72÷36+29×3 320-50×4÷25 12×﹙34+46﹚÷32 ﹙53+47﹚×﹙86-24﹚ 720+34×18-340 ﹙120-54﹚×﹙42+98﹚ [203-﹙25+75﹚]×16 380÷[240÷﹙36÷3﹚] 120÷24-20÷4 900÷﹙120-20×3﹚

整数四则运算解决问题练习

解决问题练习姓名 1、果园里的苹果树和桃树共有840棵,其中苹果树有15行,每行24棵。如果桃树 有8行,平均每行多少棵? 2、王师傅用3小时加工了105个零件。照这样计算,王师傅再工作5小时一共可以 加工多少个零件? 3、一把椅子售价55元,一张桌子的售价比椅子的2倍还多30元。买一套这样的桌 椅需要多少元? 4、一把椅子售价55元,一张沙发的售价比椅子的7倍还多5元。一把椅子的售价 比一张沙发便宜多少元? 5、一条裤子108元,一件上衣比裤子贵67元,买3套这样的衣服需要多少元? 6、给一个房间的地面贴地砖。如果用长3分米,宽2分米的长方形地砖,160块正 好贴满。如果改用边长是4分米的正方形地砖,需要多少块? 7.为“希望小学”捐图书,三年级捐152本,四年级捐的是三年级的2倍少12本,五年级捐的是三、四年级总和的2倍,五年级捐书多少本?8.公园里有菊花100盆,比月季花少35盆,郁金香是月季花的3倍还多15盆。公园里有郁金香多少盆? 9.水果店运来香蕉180千克,梨120千克,苹果比梨多50千克,西瓜的质量与香蕉和苹果的总质量同样多。运来西瓜多少千克? 10.水果店运来香蕉180千克,橘子是香蕉的2倍,苹果比香蕉、橘子的总数少65千克,运来苹果多少千克? 11.植树节六(1)班种了47棵树,六(2)班比六(1)班少种12棵,六(3)班种的是六(1)、六(2)总数的2倍,六(3)班种树多少棵? 12.修一条长5400米的公路,甲队独修要6天,乙队独修要9天,甲队比乙队平均每天少修多少米? 13.某玩具厂计划30天生产玩具840套,实际24天就完成了,实际比计划每天多生产多少套? 14.幼儿园买来苹果和橘子各10筐,苹果每筐32千克,橘子每筐20千克,买来的苹果比橘子多多少千克?

C语言程序设计报告书

一、实践的目的和要求 加深对C语言课程所学知识的理解,进一步巩固C语言算法规则.学会编制结构清晰.风格良好.数据结构适当的C程序,从而具备解决综合性问题的能力. 二、内容 在熟练掌握C语言的基础知识:数据类型(整型.实型.字符型.指针.数组.结构等); 运算类型(算术运算.逻辑运算.自增自减运算.赋值运算等);程序结构(顺序结构.判断选择结构.循环结构);大程序的功能分解方法(即函数的使用)等.进一步掌握各种函数的应用以及文件的读写操作等. 三、实验任务:通讯录 设计要求:实现菜单设计,使用数据文件保存和修改,应用结构体和指针 功能要求:通讯录信息生成,存储,查询,修改,插入,删除,打印等. 四、设计思路 1.通讯录的主要信息包括:编号,姓名,性别,联系电话.住址,邮编. 2.用结构体数组来存储信息,有Data_Input函数来实现信息的录入,用Data_Show函 数来显示打印信息,用Data_Sreach函数来查找信息,用Data_Insert函数来插入信 息,用Data_Alter 函数来修改信息,用Data_Delete函数来删除信息,用Data_Save 函数来保存信息,用Exit函数来退出通讯录. 3.小组分工,每个人分配几个函数,按情况进行分配任务. 五、程序代码 #include/*字符函数和字符串函数*/ #include/*字符模式函数(调用getch()函数)*/ #include/*输入输出函数*/ int i; struct friend/*电子通讯录结构定义*/ { char num[5]; /*编号*/ char name[11]; /*名字*/ char sex[2]; /*性别*/ char phone[12]; /*电话*/ char address[26]; /*地址*/ char post_num[11]; /*邮编*/ }friends[50]; FILE *fp; void Data_load() /*数据载入函数*/ {int j;

相关文档
相关文档 最新文档