大一C语言结课设计之《简单计算器》

/*===============================================***	设计目的:简单计算器,计算形如10*(20.2-30.6)+5.0/2的表达式值
**	简要原理:中缀式转逆波兰式(后缀式)
**	IDE:Dev-Cpp 4.9.9.2
**	注意事项:括号必须是英文状态的
**	时间: 2014-6-17
\*===============================================*/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define maxn 1000
char buf[maxn], str[maxn], signStack[maxn], ch[2];
int len, id, idSign, idAns, i, n;
double ans[maxn];

void checkSign(char sign){
	if(sign == '(') signStack[idSign++] = sign;
	else if(sign == '*' || sign == '/'){
		while(idSign && (signStack[idSign-1] == '*' || signStack[idSign-1] == '/'))
			str[id++] = signStack[--idSign];
		signStack[idSign++] = sign;
	}else if(sign == ')'){
		while(signStack[idSign-1] != '(') str[id++] = signStack[--idSign];
		--idSign;
	}else{
		while(idSign && signStack[idSign-1] != '(') str[id++] = signStack[--idSign];
		signStack[idSign++] = sign;
	}
	str[id++] = ' ';
}

int check(double a, char sign){
	if(a == 0 && sign == '/'){
		printf("除数不能为0!,程序结束。\n");
		system("pause");
		exit(EXIT_FAILURE);
	}
	return 1;
}

double cal(double a, double b, char sign){
	switch(sign){
		case '+': return a + b;
		case '-': return a - b;
		case '*': return a * b;
		case '/': return a / b;
	}
}

int main(){	

	printf("\t\t\t\t简单计算器\n\n");
	printf("\t\t   ======================================\n");
	printf("\t\t  ||  支持+ - * / ( ) 等符号和负数输入  ||\n");
	printf("\t\t   ======================================\n");
	printf("\t\t\t\t\t\t原创作者:邱正钢\n");
	printf("\t\t\t\t\t\t完成时间:2014年6月17日\n");
	printf("\t\t\t\t\t\tEmail:[email protected]\n");

	printf("请输入一个表达式,如 -10*(20.2-30.6)+5.0/2\n以回车结束:\n");
	do{
		gets(buf); id = idSign = idAns = 0;
		if((len = strlen(buf)) == 0) continue;

		int flag = 0; //这个是用来判断'-'字符是负号还是减号的。1表示数字,0表示 +*/(
		/*判断原理:如果第一次读取就碰到-,那么一定是负号,若最近一次读取是+*-/(那么
			也一定是负号,如果是右括号或数字那么是减号*/

		for(i = 0; i < len; ++i){
			if(buf[i] == ' ') continue;
			if(buf[i] >= '0' && buf[i] <= '9' || buf[i] == '.' || buf[i] == '-' && !flag){
				 str[id++] = buf[i]; flag = 1;
			}
			else {
				str[id++] = ' '; checkSign(buf[i]);
				if(buf[i] != ')') flag = 0;
				else flag = 1;
			}
		}
		while(idSign) str[id++] = signStack[--idSign];

		for(i = 0, n = 0; i < id; ++i){
			if(str[i] == ' ') continue;
			/*用增加空格的方式判断‘-’字符是负号还是减号,若‘-’后面挨着数字或小数点,那么一定是负号*/
			if(str[i] >= '0' && str[i] <= '9' || str[i] == '.' || str[i] == '-'
				&& (str[i+1] >= '0' && str[i+1] <= '9' || str[i+1] == '.')){
				sscanf(str + i, "%lf%n", &ans[idAns++], &n);
				i += n - 1;  continue;
			}else if(check(ans[idAns-1], str[i])){
				ans[idAns-2] = cal(ans[idAns-2], ans[idAns-1], str[i]);
				--idAns;
			}
		}
		printf("结果是 %.2lf\n", ans[0]);
		printf("输入Y 继续, N 退出: ");
		scanf("%s", ch);
	}while(ch[0] == 'Y' || ch[0] == 'y');
	printf("感谢您的使用!再见\n");
	system("pause");
	return 0;
}

大一C语言结课设计之《简单计算器》

时间: 2024-11-11 23:55:41

大一C语言结课设计之《简单计算器》的相关文章

大一C语言结课设计之《学生信息管理系统》

第一次写这么长的程序,代码仅供參考,有问题请留言. /* ** 学生信息管理系统 ** IDE:Dev-Cpp 4.9.9.2 ** 2014-6-15 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <algorithm> #include <vector> using std::sort; using std::vector; /*==存储单元节点=

数据结构课程设计论文--学生信息管理系统

数据结构课程设计论文--学生信息管理系统 1.学生成绩分析问题 (1)问题描述.录入并保存一个班级学生多门课程的成绩,并对成绩进行分析. (2)基本要求.a)通过键盘输入各学生的多门课程的成绩,建立相应的文件input.dat.b)对文件input.dat中的数据进行处理,要求具有如下功能:按各门课程成绩排序,并生成相应的文件输出:计算每个人的平均成绩,按平均成绩排序,并生成文件:求出各门课程的平均成绩.最高分.最低分.不及格人数.60~69分人数.70~79分人数.80~89分人数.90分以上

C语言课程设计之学生信息管理系统

#include"stdio.h"        //标准的输入输出函数文件头部说明 #include"math.h"              // 数学函数头部说明 #include"string.h" #include"stdlib.h"    //通过该函数头部里的函数,改变控制台的背景和颜色 #include"windows.h"    //头文件声明,下文用到了改变控制台的宽度和高度 #defi

java课程设计(学生信息管理系统)

1.需求分析 功能要求: 1)需要管理的学生信息有:学号.姓名.性别.出生日期.政治面貌.家庭住址.电话.宿舍号. 2)实现查询.增.删.改等功能. 数据存储:数据库或文件. 2.本组课题及本人任务 本组的课题是学生信息管理系统,我负责的任务是完成学生信息管理系统的图形界面. 3.总体设计(概要设计) 本组完成的是学生信息管理系统,主要的功能有增,删,查,改,管理的学生信息有学号.姓名.性别.出生日期.政治面貌.家庭住址.电话.宿舍号.并且使用数据库来储存学生信息. 小组成员 翁华辉:负责完成学

JAVA语言课堂测试试卷01学生信息管理系统

1.源程序思路:将成绩录入.成绩修改.计算绩点.退出系统分别写成四个函数,主函数利用switch以及while循环完成调用和循环. 2.程序源代码: package Studen; //定义ScoreInformation类class ScoreInformation { private String stunumber; private String name; private double mathematicsscore; private double englishiscore; pri

学术休假-学生信息管理系统v1.0

这是第一个学术休假的项目,主体部分在回家时的火车上完成的,隔了几天继续加工,今天终于完成,这是学生管理系统的beta版本,后续还将继续完善. 学生信息包括:学号,姓名,年龄,性别,出生年月,地址,电话,E-mail等.试设计一学生信息管理系统,使之能提供以下功能: (1)系统以菜单方式工作 (2)学生信息录入功能(学生信息用文件保存)---输入 (3)学生信息浏览功能---输出 (4)查询.排序功能 按学号查询 按姓名查询 (5)学生信息的删除与修改(可选项) /* *Copyright (c)

C语言编写学生信息管理系统

学完C语言,自己想着编写一个学生信息管理系统,既可以巩固C语言知识,也能体验怎么合理地设计和实现一个项目. 设计比较简陋,希望各位大佬多多批评,多多指教! 这个系统最重要的便是主要功能框架,在主函数中用switch()多分支选择结构实现. 我是链表实现,代码如下: 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<malloc.h> 5 #include<s

C语言练手自己编写学生成绩管理系统

#include<stdio.h> #include<stdlib.h> /*定义学生结构体*/ struct Student { char ID[20]; char Name[20]; float Mark1; float Mark2; float Mark3; float Avarage; }; /*声明学生数组及学生数量*/ struct Student students[1000]; int num=0; /*计算平均成绩*/ float Avg(struct Studen

【转载】C语言综合实验1—学生信息管理系统

http://www.cnblogs.com/Anker/archive/2013/05/06/3063436.html 实验题目:学生信息管理系统 实验要求:用户可以选择1-7可以分别进行学生信息的查看.添加.删除,修改,计算平均成绩,保存,退出系统操作. 提示:用一个结构体类型表示学生信息 typedef struct node /*定义结构体*/ { int num; //学号 char name[15];//姓名 char sex[9]; //性别 int age; //年龄 int e