数据结构课程设计--大数相乘

合集下载

大数相乘课程设计

大数相乘课程设计

大数相乘课程设计一、课程目标知识目标:1. 学生能掌握多位数乘一位数的计算法则,并熟练运用到实际计算中。

2. 学生理解大数相乘的算理,能够解释大数相乘的过程和方法。

3. 学生了解乘法与加法的关系,并能运用分配律进行简便计算。

技能目标:1. 学生能够正确、迅速地进行多位数乘一位数的笔算。

2. 学生通过实际操作,培养解决生活中大数相乘问题的能力。

3. 学生能够运用所学知识,解决相关的大数相乘应用题。

情感态度价值观目标:1. 学生培养对数学学习的兴趣,认识到数学在生活中的重要性。

2. 学生在解决问题的过程中,培养合作、交流的良好习惯,增强团队意识。

3. 学生通过大数相乘的学习,培养严谨、细心的学习态度,提高解决问题的能力。

课程性质:本课程为小学四年级数学课程,旨在帮助学生掌握多位数乘一位数的计算方法,提高计算速度和准确性。

学生特点:四年级学生具备一定的数学基础,对乘法有初步的认识,但需进一步巩固和拓展。

教学要求:教师需注重学生的个体差异,以引导、启发为主,关注学生的动手操作和实践应用能力,使学生在轻松愉快的氛围中学习。

教学过程中,将课程目标分解为具体的学习成果,便于后续的教学设计和评估。

二、教学内容1. 教学大纲:a. 引入大数相乘的概念,回顾乘法的基本原理。

b. 讲解多位数乘一位数的计算法则,演示具体计算过程。

c. 通过实例和练习,让学生掌握多位数乘一位数的计算方法。

d. 引导学生运用分配律简化大数相乘的计算过程。

e. 分析和解决生活中的大数相乘问题。

2. 教学内容安排与进度:a. 第一课时:引入大数相乘,回顾乘法基本原理,讲解多位数乘一位数的计算法则。

b. 第二课时:通过实例和练习,巩固多位数乘一位数的计算方法。

c. 第三课时:引导学生运用分配律简化大数相乘计算,提高计算速度和准确性。

d. 第四课时:分析生活实例,培养学生解决大数相乘问题的能力。

3. 教材章节与内容:a. 第四章第三节:多位数乘一位数的计算法则及应用。

大数阶乘数据结构算法课程设计---副本

大数阶乘数据结构算法课程设计---副本

实习题目一线性表及其应用【问题描述】大数运算——计算n的阶乘(n>=20)。

【基本要求】(1)数据的表示和存储;(1。

1)累积运算的中间结果和最终的计算结果的数据类型要求是整型——这是问题本身的要求;(1。

2) 试设计合适的存储结构,要求每个元素或节点最多存储数据的3位数值。

(2)数据的操作及其实现:基于设计的存储结构实现乘法操作,要求从键盘上输入n值,在屏幕上显示最终计算结果。

【实现提示】(1)设计数据的存储结构:介于阶乘运算的精确性以及实型数据表示的不精确性,本题不能采用实型表示累积运算的中间结果和最终的计算结果,而只能用整型.然而由于普通整型和长整型所能表述数的范围受其字长的限制,不能表示大数阶乘的累积结果,故必须设计一个合适的数据结构实现对数据的存储,例如可以让每个元素或节点存储数据的若干位数值.从问题描述不难看出n值为任意值,故为使程序尽量不受限制,应采用动态存储结构。

(2)数据的操作及其实现:(2。

1)累积运算的特点是当前的计算结果是下次乘法运算的乘数;(2.2)实现两个数的乘法运算须考虑:(1)乘数的各位数都要与被乘数进行乘法运算;(2)乘法过程中的进位问题及其实现;(3)因每个元素或节点最多存储数据的3位数值,故当元素或节点中的数值大于999,需向前一个元素或节点进位.【实现结构】(1)采用链式存储结构实现(普通单链表,循环单链表,普通双项链表和双向循环链表中任选一种结构)。

(2)采用动态数组实现。

【实现程序】#include ”stdafx。

h"#include 〈iostream〉using namespace std;template<class T>class Chain;template<class T〉class ChainNode{friend Chain<T〉;private:T data;ChainNode〈T〉*link;};template〈class T〉class Chain{public:Chain(){first=0;};~Chain();bool IsEmpty()const{return first==0;}int Length()const;bool Find(int k,T&x) ;Chain〈T〉&Insert(int k,const T&x);Chain〈T>& Change(int k,T x);Chain<T>&Delete(int k,T &x);Chain〈T>& Search(const T&x)const;int OutPut();private:ChainNode<T〉*first;};/**************析构函数(删除链表的所有节点)********************/template<class T>Chain〈T〉::~Chain(){ChainNode〈T>*next;while(first){next=first-〉link;delete first;first=next;}}/**********************确定链表的长度*****************************/template<class T〉int Chain<T>::Length()const{ChainNode<T>*current=first;int len=0;while(current){len++;current=current-〉link;}return len;}/*********************在链表中查找第K个元素*************************/template<class T〉bool Chain〈T〉::Find(int k,T &x){ChainNode<T〉*current=first;int index=0;while(index〈k&&current){current=current-〉link;index++;}if(current) {x=current—〉data;return true;}return false;}/*********************向链表中插入元素*************************/template〈class T>Chain〈T>& Chain〈T>::Insert(int k,const T&x){ChainNode<T〉*p=first;for(int index=1;index〈k&&p;index++)p=p—>link;ChainNode<T>*y=new ChainNode<T〉;y—>data=x;if(k){y-〉link=p—>link;p—〉link=y;}else {y—>link=first;first=y;}return *this;}/********************改变链表第k个元素的值***********************/template〈class T〉Chain〈T〉&Chain<T〉::Change(int k,T x){ChainNode〈T〉*p=first;for(int index=0;p&&index<k;index++){p=p—〉link;}if (p)p—>data=x;return *this;}/********************删除链表第k个元素***********************/template<class T>Chain〈T>&Chain〈T>::Delete(int k, T &x){if(k=0){first=first-〉link;}elseChainNode<T〉* p = first;ChainNode〈T>*q = first;for(int index=1;index〈k-1&&q;index++){q=q—〉link;p=q-〉link;q-link=p—〉link;x=P—>data;delete p;return *this;}}/************************搜索第k个元素***************************/template〈class T>Chain<T>&Chain<T>::Search(const T&x)const{ChainNode<T〉*current=first;int index=1;while(current &&current-〉data !=x){current = current->link;index ++;}if(current)return index;}/***********************倒序输出链表************************/template<class T>int Chain〈T>::OutPut(){ChainNode〈T〉*current=first;int index=0;int len=0;while(current){len++;current=current-〉link;}int *arry=new int[len];current=first;while(current){arry[index]=current->data;current=current—〉link;index++;}index=index—1;cout<<arry[index];index=index-1;for(index;index〉=0;index--){cout。

数据结构课程设计报告--大数相乘

数据结构课程设计报告--大数相乘

数据结构课程设计报告学号:12207010137:王建春班级:信息一班教师:容:大数相乘日期:2014年6月30日课题名称:大数相乘1.问题描述计算机的存有限,而且各个函数类型的围有限,如果要计算两个更大的乘数,就会超出围,得到不精确的数,如何得到更精确的数,而又不受计算机存空间的限制,本程序就可以解决大数相乘的问题。

2.设计思路这个程序的关键是如何保存大数的各个数字,以及如何处理大数乘法的进位问题。

本人是运用栈的思想做的,先定义一个整型的栈,大数传入栈的整型数组中,在乘法运算函数中,先从一个栈中取出一个大数S1的个位上的数字a,再从另一个大数S2取出一个个位数字b,再将a*b+d(d为进位数)的个位数字压到栈S中,十位上进位的数字先保存到d中,再从S2中取出一个十位数,与a相乘,得到的个位数字再压到栈S中,再从S2中取出一个数字,以此类推,直到S2中的数字被a乘完,得到一个新的大数S,将该栈保存到A栈中,将S销毁,再从S1中取出大数的十位数字,与S2的各个数字相乘,得到一个新的大数压到S中,将S保存到B中,将B移位处理后,然后与A 相加得到另一个大数,以此类推,最终可相加得到想要的结果。

这其中还用到了大数相加的原理。

3.数据结构设计前面提到,要用到栈的操作,这里,由于一个大数的最大长度是一定的,且大数最多执行的操作是插入和删除操作,所以顺序存储结构可以带来更大益处。

为了便于大数相加,将大数的各个数字存入到整型数组中。

#define MAXSIZE 1500typedef struct node{int data[MAXSIZE];int top;}SeqStack,*PSeqStack;4.功能函数设计(1)栈初始化函数Init_SeqStack(char *ch)此函数是将传入的字符处理成0~9的整数存入整型数组中。

将*ch-’0’转化为整数存入S->data[i]中,结束标志是*ch不等于’\0’(2)首尾倒置函数Convert_SeqStack(PSeqStack A)此函数是将栈中的数值首尾颠倒,比如以前是1234,现在变成4321。

课程设计大数相乘

课程设计大数相乘

课程设计大数相乘一、教学目标本节课的教学目标是让学生掌握大数相乘的基本方法和技巧,能够熟练地进行大数的乘法运算。

具体来说,知识目标包括:理解大数相乘的原理和方法,掌握竖式乘法的步骤和技巧;技能目标包括:能够独立进行大数的乘法运算,正确快速地计算出结果;情感态度价值观目标包括:培养学生的耐心和细心,提高学生对数学的兴趣和自信心。

二、教学内容本节课的教学内容主要包括竖式乘法的方法和步骤。

首先,引导学生回顾加法和减法的运算规则,为学生提供乘法运算的基础知识。

然后,通过讲解和示例,让学生掌握竖式乘法的具体步骤和技巧,包括相同数位对齐、从个位乘起、进位等。

最后,通过练习题和作业,让学生巩固所学内容,提高大数乘法的运算能力。

三、教学方法为了激发学生的学习兴趣和主动性,本节课将采用多种教学方法。

首先,通过讲解和示例,让学生理解大数相乘的原理和方法。

然后,学生进行小组讨论和合作,让学生互相交流和分享学习心得。

同时,利用多媒体资料和实验设备,为学生提供直观的学习体验,增强学生的理解和记忆。

最后,通过练习题和作业,巩固所学内容,提高学生的运算能力。

四、教学资源为了支持教学内容和教学方法的实施,本节课将选择和准备适当的教学资源。

教材方面,将使用《数学》课本作为主要教学资源,引导学生学习大数相乘的相关知识。

参考书方面,将提供一些相关的数学资料和练习题,帮助学生深入理解和巩固所学内容。

多媒体资料方面,将利用投影仪和电脑,展示和大数相乘相关的动画和视频,为学生提供直观的学习体验。

实验设备方面,将准备一些计算器和纸笔,方便学生进行运算和实践。

五、教学评估本节课的教学评估主要包括平时表现、作业和考试三个部分。

平时表现主要评估学生在课堂上的参与程度、提问回答等情况,通过观察和记录,对学生的学习态度和积极性进行评价。

作业方面,将布置一些相关的练习题,评估学生对大数相乘的理解和掌握程度。

考试方面,将设计一份综合性的考试题,评估学生的知识运用和解决问题的能力。

leetcode 大数乘法

leetcode 大数乘法

leetcode 大数乘法LeetCode是一个在线编程平台,提供了许多算法和数据结构的题目,其中也包括了大数乘法。

大数乘法是指对于超过计算机数据类型范围的大整数进行乘法运算的方法。

在日常生活中,我们经常会遇到需要计算大整数乘法的情况,比如在金融领域进行精确计算、在密码学中进行加密算法的实现等。

由于计算机的数据类型有限,无法直接处理超过其范围的大整数,因此需要使用特殊的方法进行计算。

大数乘法的思想是将大整数拆分成多个小整数相乘的形式,然后再将结果相加得到最终的乘积。

具体来说,可以将两个大整数A和B 分别拆分成n位小整数的形式,即A = A1 * 10^(n/2) + A0和B = B1 * 10^(n/2) + B0,其中A1和B1为高位部分,A0和B0为低位部分。

然后,可以使用递归的方法将大整数的乘法转化为小整数的乘法。

即计算A1 * B1、A0 * B0和(A1 + A0) * (B1 + B0)的结果。

然后将这三个结果相加得到最终的乘积。

在这个过程中,需要注意进位的处理。

当计算两个小整数的乘积时,如果结果超过了小整数的表示范围,就需要将进位部分加到高位部分中。

同样,在计算(A1 + A0) * (B1 + B0)时,也需要考虑进位的情况。

为了更好地理解大数乘法的过程,我们可以通过一个简单的例子来说明。

假设我们要计算123456789 * 987654321,首先将这两个大整数拆分成小整数的形式:A1 = 1234,A0 = 56789,B1 = 9876,B0 = 54321。

然后,我们可以计算A1 * B1、A0 * B0和(A1 + A0) * (B1 + B0)的结果:A1 * B1 = 1234 * 9876 = 12186984A0 * B0 = 56789 * 54321 = 3087159849(A1 + A0) * (B1 + B0) = (1234 + 56789) * (9876 + 54321) = 69123 * 64197 = 4436342431将这三个结果相加得到最终的乘积:12186984 * 10^8 + 3087159849 * 10^4 + 4436342431 = 1219326311371234569通过以上的计算过程,我们可以得到123456789 * 987654321 = 1219326311371234569的结果。

大数据相乘课程设计

大数据相乘课程设计

大数据相乘课程设计内容:一、课程目标知识目标:1. 让学生掌握大数据相乘的基本概念和运算规则,理解其在现实生活中的应用。

2. 使学生能够运用所学知识解决大数据相乘的实际问题,提高数据处理能力。

技能目标:1. 培养学生运用计算器或编程软件进行大数据相乘运算的能力。

2. 培养学生分析问题、解决问题的能力,提高逻辑思维和数据分析能力。

情感态度价值观目标:1. 激发学生对大数据相乘的兴趣,培养积极主动探索科学知识的热情。

2. 培养学生的团队合作精神,学会与他人分享、交流、合作,共同解决问题。

3. 增强学生的数据安全意识,认识到数据真实性和准确性的重要性。

课程性质:本课程为数学学科选修课程,旨在拓展学生的知识面,提高实际应用能力。

学生特点:六年级学生具有一定的数学基础和逻辑思维能力,对新鲜事物充满好奇,但注意力容易分散。

教学要求:结合学生特点,采用生动有趣的教学方法,注重理论与实践相结合,提高学生的参与度和积极性。

将课程目标分解为具体的学习成果,以便于教学设计和评估。

二、教学内容1. 大数据概念介绍:通过案例分析,使学生了解大数据的基本概念及其在现代社会中的应用。

2. 相乘运算规则:回顾整数、小数的乘法运算规则,引入大数据相乘的特殊性及运算方法。

3. 大数据相乘运算方法:讲解使用计算器、编程软件(如Excel、Python等)进行大数据相乘的方法,分析不同方法的优缺点。

4. 大数据相乘在实际问题中的应用:结合实际案例,让学生学会运用所学知识解决实际问题,提高数据处理和分析能力。

5. 数据安全与真实性:强调数据安全意识,教育学生认识到保证数据真实性和准确性的重要性。

教学大纲安排:第一课时:大数据概念介绍,相乘运算规则回顾。

第二课时:大数据相乘运算方法,计算器与编程软件的应用。

第三课时:实际案例分析,大数据相乘在实际问题中的应用。

第四课时:数据安全与真实性教育,总结与拓展。

教学内容与教材关联性:本课程教学内容以教材中“数的运算”章节为基础,结合大数据相关知识,拓展学生的知识面和实际应用能力。

大整数地运算大数据结构课程设计

大整数地运算大数据结构课程设计

目录一、题目概述(内容及要求) (2)二、功能分析 (2)三、设计 (3)四、运行与测试 (4)五、总结 (21)六、参考文献 (21)一、题目概述(内容及要求)内容:请设计一个有效的算法,可以进行两个n位大整数的四则运算。

①长整数长度在二十位以上。

②实现两长整数的加、减、乘、除操作。

要求:1.设计数据结构,存储结构;2.在c兼容环境完成上述题目的代码编写与调试;3.程序运行界面交互性好;4.软件运行,给出测试数据。

二、功能分析1.设计一个实现长整数进行四则运算的程序,长整数长度在二十位以上,有正负数的区别。

2.输入每四位一组,组间用逗号隔开,长整数位数没有上限,以分号结束长整型数据的输入。

用lnode结点数据结构存储数据。

每一个数据有一个头结点,它的data域用来放数据的正负数。

其余结点的数都为正整数。

3.程序包含数据的输入,判断,运算,输出和主函数。

4.具体程序执行的命令包括:a)输入函数:inputa();inputb();//的输入并建立双向循环链表b)判断函数:compare();//比较数据的大小c)运算函数:unsigndeadd();//无符号的加法a)unsigndesub();//无符号的减法b)add();sub();mul();div();//加减乘除四则运算d)输出函数:divput();//除法结果的输出函数a)putoutc();//其余结果的输出函数e)主函数:main();5.系统功能结构框图图2.1 系统功能结构框图三、设计首先要考虑的是如何表示长整型数。

可以4位数形成1组,而一个长整型数可能会有很多组这种4位数,而每节之间是有先后顺序的,因此我们可以考虑用数组和链表来存储数据。

(1)再考虑到每个长整型数的长度在输入之间是无法预知的,因此使用链表在存储空间的分配上更方便一些。

(2)在输入数据时总是从高位到低位地存储,而计算时总是从低位向高位运算,因此采用双向链表更方便,而为了从头结点方便地转到尾结点可以采用循环链表。

大数相乘课程设计

大数相乘课程设计

大数相乘课程设计一、教学目标本节课的教学目标是让学生掌握大数相乘的基本方法和技巧,能够熟练地进行大数相乘的运算。

具体分为三个部分:知识目标:使学生了解大数相乘的概念和原理,理解大数相乘的运算规则和方法。

技能目标:使学生能够运用所学的知识,正确地进行大数相乘的运算,提高学生的计算能力和解决问题的能力。

情感态度价值观目标:培养学生对数学学科的兴趣和热情,使学生能够积极主动地参与数学学习,培养学生的团队合作意识和探究精神。

二、教学内容本节课的教学内容主要包括大数相乘的概念、原理和运算方法。

具体分为三个部分:1.大数相乘的概念和原理:介绍大数相乘的定义和运算规则,使学生了解大数相乘的基本概念和原理。

2.大数相乘的运算方法:讲解大数相乘的具体方法和步骤,包括列竖式、进位、相乘等,使学生能够熟练掌握大数相乘的运算技巧。

3.大数相乘的应用:通过实例分析和练习,使学生能够将所学的知识运用到实际问题中,提高学生的计算能力和解决问题的能力。

三、教学方法为了达到本节课的教学目标,我将采用以下教学方法:1.讲授法:通过讲解大数相乘的概念、原理和运算方法,使学生了解大数相乘的基本知识。

2.案例分析法:通过分析实例,使学生能够将所学的知识运用到实际问题中,提高学生的计算能力和解决问题的能力。

3.实验法:通过小组合作实验,使学生能够动手实践,加深对大数相乘的理解和掌握。

四、教学资源为了支持本节课的教学内容和教学方法的实施,我将准备以下教学资源:1.教材:提供给学生基础的知识和理论,作为学习的参考。

2.参考书:提供给学生更多的学习资料和案例,帮助学生深入理解和掌握大数相乘的知识和方法。

3.多媒体资料:通过PPT、视频等多媒体资料,使学生能够更直观地了解大数相乘的原理和运算方法。

4.实验设备:提供给学生实验所需的设备,如纸笔、计算器等,使学生能够动手实践,加深对大数相乘的理解和掌握。

五、教学评估为了全面、客观地评估学生对本章节大数相乘知识的学习成果,我将采用以下评估方式:1.平时表现:通过观察学生在课堂上的参与程度、提问回答、小组讨论等表现,评估学生的学习态度和理解程度。

大数相乘问题课程设计

大数相乘问题课程设计

大数相乘问题 课程设计一、课程目标知识目标:1. 学生能够掌握多位数乘一位数和多位数乘多位数的笔算方法,理解乘法各部分之间的关系。

2. 学生能够运用所学知识解决实际生活中的大数相乘问题,正确进行计算。

3. 学生了解乘法在实际问题中的应用,理解乘法与加法的关系。

技能目标:1. 学生通过大数相乘的练习,提高运算速度和准确性。

2. 学生能够运用乘法运算解决实际问题,培养解决问题的能力。

3. 学生在小组讨论中,学会倾听他人意见,提高团队协作能力。

情感态度价值观目标:1. 学生在解决大数相乘问题的过程中,体验数学学习的乐趣,增强学习数学的兴趣。

2. 学生通过自主探究、合作交流的方式,培养勇于探索、积极进取的精神。

3. 学生在学习过程中,养成独立思考、认真细致的学习态度,树立正确的价值观。

二、教学内容本节课教学内容主要包括以下两个方面:1. 多位数乘一位数的笔算方法:- 熟练掌握多位数乘一位数的计算法则。

- 通过实例演示和练习,让学生理解乘法各部分之间的关系,如乘数、被乘数、积等。

- 教材章节:第三章第一节《多位数乘一位数》。

2. 多位数乘多位数的笔算方法:- 学习多位数乘多位数的计算法则,并能熟练运用。

- 分析多位数乘多位数的算理,理解竖式计算的方法。

- 通过实际例题和练习,让学生掌握多位数乘多位数的计算步骤。

- 教材章节:第三章第二节《多位数乘多位数》。

教学安排和进度:1. 第一课时:多位数乘一位数的笔算方法,配合教材实例和练习题进行讲解和练习。

2. 第二课时:多位数乘多位数的笔算方法,结合教材中的例题和练习题进行讲解和练习。

教学内容确保科学性和系统性,旨在帮助学生掌握大数相乘的计算方法,为后续学习打下坚实基础。

三、教学方法为了提高学生的学习兴趣和主动性,本节课将采用以下多样化的教学方法:1. 讲授法:教师通过生动的语言和形象的表达,为学生讲解多位数乘一位数和多位数乘多位数的笔算方法。

结合教材中的例题,让学生理解乘法运算的规则和各部分之间的关系,为学生提供清晰的知识框架。

数据结构课程设计报告大数相乘与多项式相乘

数据结构课程设计报告大数相乘与多项式相乘

数据结构课程设计报告大数相乘与多项式相乘一、引言数据结构是计算机科学中非常重要的一门课程,它涉及到数据的存储、组织和处理方法。

在本次课程设计报告中,我们将重点讨论大数相乘和多项式相乘两个问题,并给出相应的解决方案。

二、大数相乘1. 问题描述大数相乘是指两个超过计算机所能表示范围的整数相乘的问题。

在实际应用中,大数相乘时常浮现在密码学、数值计算和科学计算等领域。

2. 解决方案为了解决大数相乘的问题,我们可以采用分治算法。

具体步骤如下:- 将两个大数分别划分为高位和低位部份,例如将大数A划分为A1和A0,将大数B划分为B1和B0。

- 分别计算A1 * B1、A0 * B0和(A1 + A0) * (B1 + B0)的结果。

- 将上述三个结果通过适当的位移和加法运算得到最终的结果。

3. 算法实现下面是使用分治算法实现大数相乘的伪代码:```function multiply(A, B):if A 或者 B 是小数:直接返回 A * Belse:将 A 和 B 分别划分为高位和低位部份A1, A0 = 高位部份B1, B0 = 低位部份X = multiply(A1, B1)Y = multiply(A0, B0)Z = multiply(A1 + A0, B1 + B0)结果 = (X << n) + ((Z - X - Y) << n/2) + Y返回结果```4. 实例分析以A = 123456789 和 B = 987654321为例,我们可以通过上述算法得到它们的乘积为 121932631137021795。

三、多项式相乘1. 问题描述多项式相乘是指两个多项式相乘的问题。

在实际应用中,多项式相乘时常浮现在信号处理、图象处理和机器学习等领域。

2. 解决方案为了解决多项式相乘的问题,我们可以采用传统的乘法算法。

具体步骤如下:- 将两个多项式分别表示为系数和指数的形式,例如多项式A可以表示为A =a0x^0 + a1x^1 + ... + anx^n。

大数据结构大数相乘

大数据结构大数相乘

大数据结构大数相乘大数相乘是指在计算机程序中对两个非常大的整数进行乘法运算。

由于计算机的内存空间有限,无法存储太大的整数,所以在处理大数相乘时需要采用特定的数据结构和算法。

在大数据结构中,常用的数据结构有数组、链表、栈和队列。

对于大数相乘这个问题,最常用的数据结构是数组或者字符串。

由于数组在内存中是连续存储的,可以有效地表示大整数,所以在实际编程中常常使用数组来存储大整数。

1.将两个大整数分别表示为数组A和数组B,其中A和B的长度分别为n和m。

2.创建一个长度为n+m的数组C,用来存储中间结果和最终结果。

初始化数组C所有元素为0。

3.从B的最后一位开始,逐位与A中的所有位相乘,并将结果加到数组C的适当位置上。

具体操作如下:-将B的最后一位与A中的所有位逐位相乘,得到一个中间结果D,并将D加到数组C的适当位置上。

如果D的结果超过10,需要进位。

-将B的倒数第二位与A中的所有位逐位相乘,得到一个中间结果E,并将E加到数组C的适当位置上。

如果E的结果超过10,需要与C中对应位置的值相加,并判断是否需要进位。

-依此类推,将B的每一位与A中的所有位逐位相乘,并将结果加到数组C的适当位置上。

4.最后,将数组C中的所有结果整理成一个整数。

需要注意的是,在实际编程中,需要处理好进位的情况,并且要考虑到两个大整数可能不等长的情况。

此外,为了提高计算效率,可以采用分治法来进行大数相乘,将大整数划分为较小的子问题,并采用递归的方法解决,最后将子问题的解合并起来得到最终结果。

总结起来,大数相乘是一道经典的算法问题,解决这个问题需要运用到数据结构中的数组或者字符串,并且需要充分考虑到进位和长度不等的情况。

在处理大数相乘之前,需要将大整数转化为数组表示,并且可以借助分治法提高计算效率。

通过合理地选择数据结构和算法,可以高效地解决大数相乘的问题。

大整数的运算 数据结构课程设计

大整数的运算 数据结构课程设计

目录一、题目概述(内容及要求) (2)二、功能分析 (2)三、设计 (3)四、运行与测试 (4)五、总结 (21)六、参考文献 (21)一、题目概述(内容及要求)内容:请设计一个有效的算法,可以进行两个n位大整数的四则运算。

①长整数长度在二十位以上。

②实现两长整数的加、减、乘、除操作。

要求:1.设计数据结构,存储结构;2.在c兼容环境完成上述题目的代码编写与调试;3.程序运行界面交互性好;4.软件运行,给出测试数据。

二、功能分析1.设计一个实现长整数进行四则运算的程序,长整数长度在二十位以上,有正负数的区别。

2.输入每四位一组,组间用逗号隔开,长整数位数没有上限,以分号结束长整型数据的输入。

用lnode结点数据结构存储数据。

每一个数据有一个头结点,它的data域用来放数据的正负数。

其余结点的数都为正整数。

3.程序包含数据的输入,判断,运算,输出和主函数。

4.具体程序执行的命令包括:a)输入函数:inputa();inputb();//的输入并建立双向循环链表b)判断函数:compare();//比较数据的大小c)运算函数:unsigndeadd();//无符号的加法a)unsigndesub();//无符号的减法b)add();sub();mul();div();//加减乘除四则运算d)输出函数:divput();//除法结果的输出函数a)putoutc();//其余结果的输出函数e)主函数:main();5.系统功能结构框图图2.1 系统功能结构框图三、设计首先要考虑的是如何表示长整型数。

可以4位数形成1组,而一个长整型数可能会有很多组这种4位数,而每节之间是有先后顺序的,因此我们可以考虑用数组和链表来存储数据。

(1)再考虑到每个长整型数的长度在输入之间是无法预知的,因此使用链表在存储空间的分配上更方便一些。

(2)在输入数据时总是从高位到低位地存储,而计算时总是从低位向高位运算,因此采用双向链表更方便,而为了从头结点方便地转到尾结点可以采用循环链表。

数据结构课程设计36586

数据结构课程设计36586

2010-2011第二学期《数据结构》课程设计题目1:大数相乘题目2:马的遍历学院:计算机学院姓名:陈浩学号:099074140班级:软件091班评阅教师:汤亚玲2011年6月9日安徽工业大学一、目的加深对《数据结构》课程所学知识的理解,进一步巩固C语言语法规则。

学会编制结构清晰、风格良好、数据结构适当的C语言程序,从而具备解决综合性实际问题的能力。

题目一:大数相乘目录:系统功能分析 (3)基本要求 (3)功能需求 (3)开发工具 (3)程序说明 (3)大数相乘总括 (4)源程序 (4)测试与结论 (5)创新及难点 (6)程序设计总结心得体会 (6)2011-6-9正文内容如下:一、系统功能分析功能分析:大数相乘可以实现对两个任意大的正数相乘。

用户可以通过本程序对无法实现的两数进行相乘,其意在方便用户,方便群众。

二、1编写基本目的要求:分析程序开发过程的具体问题,构架程序的功能,同时使该程序的使用者对本程序有一定的了解,为实现功能的编码做好基础,对数据结构有一个更深入的了解。

1、背景:a.开发的软件系统的名称:大数相乘。

b.本项目的任务提出者汤亚玲;开发者:陈浩。

2、功能需求:根据大数相乘的实际需求,分析系统应该设计的功能,其中应该包括对于超过整型大数的输入,存储,运算,输出。

实现乘法的一般功能。

3、数据需求:运行环境及知识要求:运行环境要求:windows xp/visita/7知识要求:①熟悉vc++6.0编译系统②熟悉AISCC③熟练掌握字符与数字之间的转换4﹑分析及实现简介:由于大数相乘问题相对简单,我只写了一个主函数实现了其功能。

大数用字符数组存储,用AISCC数字之间转换进行运算。

二、程序的说明:首先定义两个字符数组存储两个大数,在定义两个数组,一个用与保存结果,另一个为辅助只用,具体的思想是a b 两个大数用b的个位一次乘a的每一位结果保存在辅助数组temp中,在进位取余得到正常的10进制数,用sum数组的temp的求和,用flag标记,以便temp的错位相加。

数据结构课程设计报告---大数阶乘运算

数据结构课程设计报告---大数阶乘运算

数据结构课程设计报告题目:专业:班级:学号:姓名:指导老师:时间:一、课程设计题目及所涉及知识点设计题目是:大数阶乘运算。

所涉及的知识点主要是:数组的运用、嵌套循环的使用、进数思想等二、课程设计思路及算法描述定义一个数组a[MAX]用来储存运算结果,通过更改MAX的数值来改变储存空间的大小以免造成内存的浪费以及内存不足的问题;首先把数组a[0]赋值为1;然后利用进数的思想进行阶乘计算;外加一个循环实现循环计算;三、课程设计中遇到的难点及解决办法难点:刚开始的时候储存不够合理造成了无法完成部分计算等解决办法:查阅相关资料以及咨询老师等通过多种途径终于解决了遇到的问题四、总结通过本次课程设计让我更加理解到只有当知识运用到实际中才会发现许多问题,以及发现本身知识的不足,本次课程设计使我受益匪浅,在完成老师布置的课业的同时也在不断地完善了自我。

五、附录—主要源程序代码及运行结果#include<stdio.h>#define MAX 100000int main(){int b;do{int n;printf("请输入要计算的阶乘数:\n");scanf("%d",&n);int a[MAX];int digit=1;a[0]=1;for(int i=2;i<=n;++i){for(int j=1,c=0;j<=digit;++j){int temp=a[j-1]*i+c;a[j-1]=temp%10;c=temp/10;}while(c){a[++digit-1]=c%10;c/=10;}}printf("结果是:\n%d!=",n);for( i=digit;i>=1;--i){printf("%d",a[i-1]);}printf("结果一共有%d位数!\n",digit);printf("是否要继续运算:是按1,否按2。

大数相乘

大数相乘

一、实验题目:用叠加法或分治法实现大整数的相乘二、实验内容:这种算法的思想是按照部分积的权值从低到高的顺序,每次计算出所有权值为i r的部分积,同时完成它们之间的累加,然后再计算权值更高的部分积,依次类推,直到计算出所有的部分积。

三、设计思想:叠加算法就是通用的笔算算法思想。

在两个大整数相乘中,它用第一个数的每一位去乘第二个数的每一位,再把运算结果按权值叠加,进位处理后,得到所求的结果四、代码:#define MAXLENGTH 1000#include <stdio.h>#include <string.h>void compute(char * a, char * b, char * c);void main(){char a[MAXLENGTH],b[MAXLENGTH],c[MAXLENGTH*2];puts("输入因数1:");gets(a);puts("输入因数2:");gets(b);compute(a,b,c);puts("积:");puts(c);getchar();}void compute(char * a,char * b,char * c){int i,j,m,n;long sum,carry;m=strlen(a)-1;n=strlen(b)-1;for (i=m;i>=0;i--)a[i]-='0';for (i=n;i>=0;i--)b[i]-='0';c[m+n+2]='\0';carry=0;for(i=m+n;i>=0;i--) /* i 为坐标和*/{sum=carry;if((j=i-m)<0)j=0;for(;j<=i&&j<=n;j++) /* j 为纵坐标*/sum+=a[i-j]*b[j]; /* 累计一组数的和*/c[i+1]=sum%10+'0'; /* 算出保留的数字*/carry=sum/10; /* 算出进位*/}if((c[0]=carry+'0')=='0') /* if no carry, */c[0]='\040'; /* c[0] equals to space */}五、实验结果(截图):六、实验心得:这次实习让我学习到了好多东西,也认识到了自己好多方面的不足,我一定在今后的学习还是生活中更加的努力,不要让自己落后与人。

课程设计用栈大数相乘csdn

课程设计用栈大数相乘csdn

课程设计用栈大数相乘csdn一、教学目标本章节的教学目标是使学生掌握大数相乘的算法,理解并能够运用栈的数据结构来实现大数相乘。

具体目标如下:1.理解大数相乘的基本概念。

2.理解栈的数据结构及其基本操作。

3.掌握利用栈实现大数相乘的算法原理。

4.能够使用栈来实现大数相乘。

5.能够分析并优化大数相乘的算法。

情感态度价值观目标:1.培养学生的逻辑思维能力。

2.培养学生的问题解决能力。

3.培养学生对计算机科学的学习兴趣。

二、教学内容本章节的教学内容主要包括大数相乘的基本概念、栈的数据结构及其基本操作,以及利用栈实现大数相乘的算法。

具体内容包括:1.大数相乘的基本概念和算法。

2.栈的数据结构及其基本操作。

3.利用栈实现大数相乘的算法原理和实现。

4.大数相乘算法的优化。

三、教学方法为了达到本章节的教学目标,将采用以下教学方法:1.讲授法:讲解大数相乘的基本概念、算法原理和实现。

2.讨论法:引导学生讨论大数相乘算法的优化方法。

3.案例分析法:分析实际案例,让学生理解并掌握利用栈实现大数相乘的算法。

4.实验法:让学生动手编写代码,实现大数相乘的算法。

四、教学资源为了支持本章节的教学内容和教学方法的实施,将准备以下教学资源:1.教材:提供大数相乘和栈的相关理论知识。

2.参考书:提供大数相乘算法的详细介绍和优化方法。

3.多媒体资料:提供大数相乘算法的动画演示和案例分析。

4.实验设备:提供计算机让学生动手编写代码和进行实验。

五、教学评估本章节的教学评估将采用多元化的评估方式,以全面、客观、公正地评价学生的学习成果。

评估方式包括:1.平时表现:通过课堂参与、提问、讨论等环节,评估学生的学习态度和积极性。

2.作业:布置相关的编程作业,评估学生对大数相乘算法的理解和掌握程度。

3.考试:设计考试题目,评估学生对大数相乘算法和栈数据结构的知识点和技能掌握情况。

六、教学安排本章节的教学安排将根据学生的实际情况和需要进行合理规划。

毕业设计-设计并实现大整数(超过十位的整数)的加减乘除运算

毕业设计-设计并实现大整数(超过十位的整数)的加减乘除运算

目录第1章课题概述 (1)1.1课题的目的 (1)1.2课题的要求 (1)1.2.1 输入输出的要求 (1)1.2.2 程序实现的功能要求 (1)第2章概要设计 (3)2.1整个程序的模块结构及流程 (3)2.2大整数存储结构的选择 (3)2.3输入数据合法性的检测及初步处理 (4)2.4各个操作算法的描述 (5)2.4.1 相加算法 (5)2.4.2 相减算法 (7)2.4.3 相乘算法 (8)2.4.4 相除算法 (10)第3章程序功能的实现 (16)3.1主函数的实现 (16)3.2主要功能模块的实现 (18)3.2.1 加法的实现 (18)3.2.2 减法的实现 (19)3.2.3 乘法的实现 (22)3.2.4 除法的实现 (23)第4章调试及发现问题的解决 (29)第5章程序测试及分析 (31)第6章总结 (37)参考文献 (39)第1章课题概述本次数据结构课程设计的题目是设计并实现大整数(超过十位的整数)的加减乘除运算。

1.1 课题的目的整数的加减乘除运算是日常生活中常见的四则数学运算。

在不借助计算器的手工条件下,人们往往会通过列竖式的形式来计算结果。

当借助计算机来运算时,虽然不用列竖式那么麻烦了,但是由于计算机对于整数的存储往往只有2B或4B 的空间,因此能够表示的整数存储范围比较有限。

即使采用四个字节来存储整数,它所能表示的范围为:[-2147483648,+2147483647]。

一般称超过十位以上的十进制整数为大整数,这类大整数在C语言系统中因超界溢出,是不能直接用基本数据类型来表示和计算的。

因此,采用特定的数据结构和算法,通过编写计算机程序的方式来实现这些功能,无疑具有较大的实际意义。

1.2 课题的要求1.2.1 输入输出的要求(1)程序运行后应首先输出一个主菜单,并将所有的加、减、乘、除等功能罗列在主菜单上供用户进行选择,以便进行相应的操作。

(2)运算对象应能够从键盘输入,并且运算过程中可以不断更新运算的输入数据。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构课程设计报告学号:姓名:班级:教师:内容:大数相乘模拟计算器马的遍历日期:2013年7月1日课题名称:模拟计算器1.问题描述如果让我们计算4+2*(8-5)-4/2=?我们该怎么计算?为了实现这个功能,特地做了这个计算器,可以对包含加、减、乘、除的运算符的任意整型式进行求解。

2.设计思路这个程序的关键就是如何将输入的中缀表达式转化为后缀表达式,然后再对后缀表达式进行求值运算。

对于中缀表达式转为后缀表达式,在参数先定义两个指针型字符串infixexp和postfixexp,infixexp是传入的中缀表达式字符串,postfixexp是传出的后缀表达式字符串,再定义一个栈,当栈顶元素不等于’#’时,然后判断infixexp中的每一个字符是不是数,如果是数,传入postfiexp中,否则进一步判断w是不是’)’,若不是判断栈顶元素的优先级,将操作符压入栈中,以此类推,最终得到后缀表达式。

对于后缀表达式的运算,主要判断是不是数字还是操作符,如果是数字压到栈中,如果是操作符,从栈中取出两个数字运算。

本人对于本程序还设计了一个操作界面,用的是MFC语言设计的,操作界面主要有一个文本框和19个按钮组成,有清零按钮,删除按钮,加减乘除按钮,以及各个操作数按钮,’=’按钮,这些按钮大部分都是传入相应的字符串到文本框中,当按下’=’号按钮时,再从文本框中得到字符串,对字符串进行处理,然后运算出结果。

3.数据结构设计主要建立了一个CCaculatordlg的类,该类继承MFC中CDialog的特征,这样可以在MFC中建立一个单文档对话框,这个对话框可以添加一些控件来做成一个计算器界面,如何对于该计算器操作,就要看控制各个控件函数怎么实现的。

这里的类如下:class CCaculatorDlg : public CDialog{// Constructionpublic:int postfix_exp(char *A);int infix_exp_value(char *infixexp,char *postfixexp);int priority(char op);int IsNum(char c);//int infix_exp_value(char *infix,char *postfixexp);double num;//char CalculateExpre;//double CalculateResult;//double CalculateNum;char ch[50],ch1[10],ch2[10],op;char text[50];//stack<int> S;CCaculatorDlg(CWnd* pParent = NULL); // standard constructor// Dialog Data//{{AFX_DATA(CCaculatorDlg)enum { IDD = IDD_CACULATOR };// NOTE: the ClassWizard will add data members here//}}AFX_DATA// Overrides// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CCaculatorDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL// Implementationprotected:// Generated message map functions//{{AFX_MSG(CCaculatorDlg)afx_msg void OnAdd();afx_msg void OnBtn1();afx_msg void OnBtn0();afx_msg void OnBtn2();afx_msg void OnBtn3();afx_msg void OnBtn4();afx_msg void OnBtn5();afx_msg void OnBtn6();afx_msg void OnBtn7();afx_msg void OnBtn8();afx_msg void OnBtn9();afx_msg void OnClear();afx_msg void OnDivide();afx_msg void OnEquals();afx_msg void OnMinus();afx_msg void OnMultiply();afx_msg void OnReset();virtual BOOL OnInitDialog();afx_msg void OnRbrackets();afx_msg void OnLbrackets();//}}AFX_MSGDECLARE_MESSAGE_MAP()};4.功能函数设计(1)按键0函数CCaculatorDlg::OnBtn0( )先得到文本框字符串,然后将该字符串末尾处加0,再将所有的字符串显示到文本框中(2)按键1函数CCaculatorDlg::OnBtn1( )先得到文本框字符串,然后将该字符串末尾处加1,再将所有的字符串显示到文本框中(3)按键2函数CCaculatorDlg::OnBtn2( )先得到文本框字符串,然后将该字符串末尾处加2,再将所有的字符串显示到文本框中(4)按键3函数CCaculatorDlg::OnBtn3( )先得到文本框字符串,然后将该字符串末尾处加3,再将所有的字符串显示到文本框中(5)按键4函数CCaculatorDlg::OnBtn4( )先得到文本框字符串,然后将该字符串末尾处加4,再将所有的字符串显示到文本框中(6)按键5函数CCaculatorDlg::OnBtn5( )先得到文本框字符串,然后将该字符串末尾处加5,再将所有的字符串显示到文本框中(7)按键6函数CCaculatorDlg::OnBtn6( )先得到文本框字符串,然后将该字符串末尾处加6,再将所有的字符串显示到文本框中(8)按键7函数CCaculatorDlg::OnBtn7( )先得到文本框字符串,然后将该字符串末尾处加7,再将所有的字符串显示到文本框中(9)按键8函数CCaculatorDlg::OnBtn8( )先得到文本框字符串,然后将该字符串末尾处加8,再将所有的字符串显示到文本框中(10)按键9函数CCaculatorDlg::OnBtn9( )先得到文本框字符串,然后将该字符串末尾处加9,再将所有的字符串显示到文本框中(11)按键加函数CCaculatorDlg::OnAdd( )先得到文本框字符串,然后将该字符串末尾处加’+’字符,再将所有的字符串显示到文本框中(12)按键减函数CCaculatorDlg::OnMinus( )先得到文本框字符串,然后将该字符串末尾处加’-’字符,再将所有的字符串显示到文本框中(13)按键乘函数CCaculatorDlg::OnMultiply( )先得到文本框字符串,然后将该字符串末尾处加’*’,再将所有的字符串显示到文本框中(14)按键除函数CCaculatorDlg::OnDivide( )先得到文本框字符串,然后将该字符串末尾处加’\’,再将所有的字符串显示到文本框中(15)按键清除函数CCaculatorDlg::OnClear( )先得到文本框字符串,然后将该字符串的最后一个字符删除,再将所有的字符串显示到文本框中(16)按键左括号函数CCaculatorDlg::OnRbrackets()先得到文本框字符串,然后将该字符串末尾处加’(’,再将所有的字符串显示到文本框中(17)按键又括号函数CCaculatorDlg::OnLbrackets()先得到文本框字符串,然后将该字符串末尾处加’)’,再将所有的字符串显示到文本框中(18)按键左括号函数CCaculatorDlg::OnReset()将文本框中的字符串清零(19)判断是否是数字CCaculatorDlg::IsNum(char c)如果传入的字符在0~9范围内则是数字(20)优先级函数CCaculatorDlg::priority(char op1)根据传入的字符判断优先级(21)将中缀表达式转为后缀表达式CCaculatorDlg::infix_exp_value(char *infixexp, char *postfixexp) Infixexp是传入的中缀表达式,即从文本框得到的字符,而postfixexp 是后缀表达式,将要传出去的字符串(22)计算后缀表达式的值postfix_exp(char *A)将转化后的后缀表达式的字符串,传入该函数中,可以运算出结果(23)按键等于函数CCaculatorDlg::OnEquals()先从文本框中得到字符串,再将字符串通过infix_exp_value转华为后缀表达式,再通过postfix_exp转化为数值,将计算所得的数值转化为字符显示到文本框中。

5.编码实现#include "stdafx.h"#include "Chess.h"#include "CaculatorDlg.h"#include "math.h"#include <stack>using namespace std;#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CCaculatorDlg dialogCCaculatorDlg::CCaculatorDlg(CWnd* pParent /*=NULL*/) : CDialog(CCaculatorDlg::IDD, pParent){//{{AFX_DATA_INIT(CCaculatorDlg)// NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT}void CCaculatorDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CCaculatorDlg)// NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CCaculatorDlg, CDialog)//{{AFX_MSG_MAP(CCaculatorDlg)ON_BN_CLICKED(IDC_ADD, OnAdd)ON_BN_CLICKED(IDC_BTN_1, OnBtn1)ON_BN_CLICKED(IDC_BTN_0, OnBtn0)ON_BN_CLICKED(IDC_BTN_2, OnBtn2)ON_BN_CLICKED(IDC_BTN_3, OnBtn3)ON_BN_CLICKED(IDC_BTN_4, OnBtn4)ON_BN_CLICKED(IDC_BTN_5, OnBtn5)ON_BN_CLICKED(IDC_BTN_6, OnBtn6)ON_BN_CLICKED(IDC_BTN_7, OnBtn7)ON_BN_CLICKED(IDC_BTN_8, OnBtn8)ON_BN_CLICKED(IDC_BTN_9, OnBtn9)ON_BN_CLICKED(IDC_CLEAR, OnClear)ON_BN_CLICKED(IDC_DIVIDE, OnDivide)ON_BN_CLICKED(IDC_EQUALS, OnEquals)ON_BN_CLICKED(IDC_MINUS, OnMinus)ON_BN_CLICKED(IDC_MULTIPLY, OnMultiply)ON_BN_CLICKED(IDC_RESET, OnReset)ON_BN_CLICKED(IDC_RBRACKETS, OnRbrackets)ON_BN_CLICKED(IDC_LBRACKETS, OnLbrackets)//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CCaculatorDlg message handlersvoid CCaculatorDlg::OnAdd(){// TODO: Add your control notification handler code here UpdateData();int len;GetDlgItem(IDC_EDIT1)->GetWindowText(text,50);len=strlen(text);/*text[len]='$';text[len+1]='+';text[len+2]='\0';*/text[len]='+';text[len+1]='\0';GetDlgItem(IDC_EDIT1)->SetWindowText(text);UpdateData(FALSE);}void CCaculatorDlg::OnBtn0(){// TODO: Add your control notification handler code here UpdateData();int len;GetDlgItem(IDC_EDIT1)->GetWindowText(text,50);len=strlen(text);text[len]='0';text[len+1]='\0';GetDlgItem(IDC_EDIT1)->SetWindowText(text);UpdateData(FALSE);}void CCaculatorDlg::OnBtn1(){// TODO: Add your control notification handler code here UpdateData();int len;GetDlgItem(IDC_EDIT1)->GetWindowText(text,50);len=strlen(text);text[len]='1';text[len+1]='\0';GetDlgItem(IDC_EDIT1)->SetWindowText(text);UpdateData(FALSE);}void CCaculatorDlg::OnBtn2(){// TODO: Add your control notification handler code here int len;GetDlgItem(IDC_EDIT1)->GetWindowText(text,50);len=strlen(text);text[len]='2';text[len+1]='\0';GetDlgItem(IDC_EDIT1)->SetWindowText(text);UpdateData(FALSE);}void CCaculatorDlg::OnBtn3(){// TODO: Add your control notification handler code here int len;GetDlgItem(IDC_EDIT1)->GetWindowText(text,50);len=strlen(text);text[len]='3';text[len+1]='\0';GetDlgItem(IDC_EDIT1)->SetWindowText(text);}void CCaculatorDlg::OnBtn4(){// TODO: Add your control notification handler code here int len;GetDlgItem(IDC_EDIT1)->GetWindowText(text,50);len=strlen(text);text[len]='4';text[len+1]='\0';GetDlgItem(IDC_EDIT1)->SetWindowText(text);}void CCaculatorDlg::OnBtn5(){// TODO: Add your control notification handler code here int len;GetDlgItem(IDC_EDIT1)->GetWindowText(text,50);len=strlen(text);text[len]='5';text[len+1]='\0';GetDlgItem(IDC_EDIT1)->SetWindowText(text);}void CCaculatorDlg::OnBtn6(){// TODO: Add your control notification handler code hereint len;GetDlgItem(IDC_EDIT1)->GetWindowText(text,50);len=strlen(text);text[len]='6';text[len+1]='\0';GetDlgItem(IDC_EDIT1)->SetWindowText(text);}void CCaculatorDlg::OnBtn7(){// TODO: Add your control notification handler code hereint len;GetDlgItem(IDC_EDIT1)->GetWindowText(text,50);//if(GetDlgItem(IDC_EDIT1)->GetWindowText(text,50)=='+'||GetDlgItem(IDC_ EDIT1)->GetWindowText(text,50)=='-'//||GetDlgItem(IDC_EDIT1)->GetWindowText(text,50)=='*'||GetDlgItem(IDC_ED IT1)->GetWindowText(text,50)=='/')// {// GetDlgItem(IDC_EDIT1)->SetWindowText("");// GetDlgItem(IDC_EDIT1)->GetWindowText(text,50);// }len=strlen(text);text[len]='7';text[len+1]='\0';GetDlgItem(IDC_EDIT1)->SetWindowText(text);}void CCaculatorDlg::OnBtn8(){// TODO: Add your control notification handler code hereint len;GetDlgItem(IDC_EDIT1)->GetWindowText(text,50);len=strlen(text);text[len]='8';text[len+1]='\0';GetDlgItem(IDC_EDIT1)->SetWindowText(text);}void CCaculatorDlg::OnBtn9(){// TODO: Add your control notification handler code hereint len;GetDlgItem(IDC_EDIT1)->GetWindowText(text,50);len=strlen(text);text[len]='9';text[len+1]='\0';GetDlgItem(IDC_EDIT1)->SetWindowText(text);}void CCaculatorDlg::OnClear(){// TODO: Add your control notification handler code hereint len;GetDlgItem(IDC_EDIT1)->GetWindowText(text,50);len=strlen(text);text[len-1]='\0';GetDlgItem(IDC_EDIT1)->SetWindowText(text);}void CCaculatorDlg::OnDivide(){// TODO: Add your control notification handler code hereUpdateData();int len;GetDlgItem(IDC_EDIT1)->GetWindowText(text,50);len=strlen(text);/*text[len]='$';text[len+1]='/';text[len+2]='\0';*/text[len]='/';text[len+1]='\0';GetDlgItem(IDC_EDIT1)->SetWindowText(text);UpdateData(FALSE);}//DEL void CCaculatorDlg::OnDot()//DEL {//DEL // TODO: Add your control notification handler code here//DEL//DEL }void CCaculatorDlg::OnEquals(){// TODO: Add your control notification handler code hereUpdateData();int num1,num2,num3,len,len1;GetDlgItem(IDC_EDIT1)->GetWindowText(text,50);len=strlen(text);/*text[len]='$';text[len+1]='#';text[len+2]='\0';*/text[len]='#';text[len+1]='\0';infix_exp_value(text,ch);//len1=strlen(ch);//ch[len1]='\0';//ch[len1+1]='\0';//计算后缀表达式的值num1=postfix_exp(ch);//num1=atoi(ch1);//num2=atoi(ch2);/*if(op=='+')num3=num1+num2;else if(op=='-'){//MessageBox("op=-");num3=num1-num2;}else if(op=='*')num3=num1*num2;else if(op=='/'){if(num2==0){MessageBox("亲,除数不能为零你知道不???");GetDlgItem(IDC_EDIT1)->SetWindowText("");}elsenum3=num1/num2;}*/itoa(num1,ch1,10);GetDlgItem(IDC_EDIT1)->SetWindowText(ch1);}void CCaculatorDlg::OnMinus(){// TODO: Add your control notification handler code here UpdateData();int len;GetDlgItem(IDC_EDIT1)->GetWindowText(text,50);len=strlen(text);/*text[len]='$';text[len+1]='-';text[len+2]='\0';*/text[len]='-';text[len+1]='\0';GetDlgItem(IDC_EDIT1)->SetWindowText(text);UpdateData(FALSE);}void CCaculatorDlg::OnMultiply(){// TODO: Add your control notification handler code here UpdateData();int len;GetDlgItem(IDC_EDIT1)->GetWindowText(text,50);len=strlen(text);/*text[len]='$';text[len+1]='*';text[len+2]='\0';*/text[len]='*';text[len+1]='\0';GetDlgItem(IDC_EDIT1)->SetWindowText(text);UpdateData(FALSE);}void CCaculatorDlg::OnReset(){// TODO: Add your control notification handler code here //char ch[10];//itoa(0,ch,10);GetDlgItem(IDC_EDIT1)->SetWindowText("");}BOOL CCaculatorDlg::OnInitDialog(){CDialog::OnInitDialog();// TODO: Add extra initialization herereturn TRUE; // return TRUE unless you set the focus to a control// EXCEPTION: OCX Property Pages should return FALSE }//DEL void CCaculatorDlg::OnCancelMode()//DEL {//DEL CDialog::OnCancelMode();//DEL//DEL // TODO: Add your message handler code here//DEL//DEL }int CCaculatorDlg::IsNum(char c){if(c>='0'&&c<='9')return 1;elsereturn 0;}int CCaculatorDlg::priority(char op1){switch(op1){case '#':return 1;case ')':return 2;case '+':case '-':return 3;case '*':case '/':return 4;case '(':return 5;//case '$':return 6;default:return 0;}}int CCaculatorDlg::infix_exp_value(char *infixexp, char *postfixexp)stack<char> S;char c,w,topelement;S.get_allocator();S.push('#');//topelement=S.top();w=*infixexp;while(S.top()!='#'||w!='#'){if(IsNum(w)){*postfixexp=w;postfixexp++;w=*(++infixexp);}else{if(S.top()=='('&&w==')'){S.pop();w=*(++infixexp);}elseif(S.top()=='('||priority(S.top())<priority(w)){S.push(w);w=*(++infixexp);}else{topelement=S.top();S.pop();*postfixexp=topelement;postfixexp++;}}}*postfixexp='#';*(++postfixexp)='\0';return 1;}void CCaculatorDlg::OnRbrackets()// TODO: Add your control notification handler code here UpdateData();int len;GetDlgItem(IDC_EDIT1)->GetWindowText(text,50);len=strlen(text);text[len]=')';text[len+1]='\0';GetDlgItem(IDC_EDIT1)->SetWindowText(text);UpdateData(FALSE);}void CCaculatorDlg::OnLbrackets(){// TODO: Add your control notification handler code here UpdateData();int len;GetDlgItem(IDC_EDIT1)->GetWindowText(text,50);len=strlen(text);text[len]='(';text[len+1]='\0';GetDlgItem(IDC_EDIT1)->SetWindowText(text);UpdateData(FALSE);}int CCaculatorDlg::postfix_exp(char *A){stack<int> S1;int Result,a,b,c,d,e;char cha;cha=*A++;//S1.get_allocator();while(cha!='#'){if(IsNum(cha))S1.push(cha-'0');/* else if(cha=='$'){d=S1.top();S1.pop();e=S1.top();S1.pop();S1.push(e*10+d);}*/else{b=S1.top();S1.pop();a=S1.top();S1.pop();switch(cha){case '+':c=a+b;break;case '-':c=a-b;break;case '*':c=a*b;break;case '/':c=a/b;break;}S1.push(c);}cha=*A++;}Result=S1.top();return Result;}6.运行与测试程序运行时,会出现一个窗体,如下图所示点击附件-->计算器,会弹出下面的对话框在文本框中输入表达式1+2*(8-5)-4/2,如下图当点击等于号的时候,会出现数字5在窗体的帮助一栏里可以看到本程序的版权信息7.设计中存在的问题及感想在设计本程序中,遇到了许多阻碍和瓶颈,比如MFC的界面如何设计,如何响应按钮函数,如何使计算器的功能完善,比如加法功能,我一开始想着在OnAdd函数中处理加法运算,可是只知道被加数不知道加数,直接运用加的计算功能是行不通的,后来才想到定义一个字符数组,将文本框中的字符串处理一下,先转为后缀表达式,再运算,这样实际运算时在按等号后计算的,这样解决了所有的问题。

相关文档
最新文档