linux加法计算器程序,Linux下实现一个计算器程序
(集体内容详见ChinaUnix社区)
现在要在Linux下实现一个计算器程序, 它有如下的要求:
1. 能识别英文数字:比如 three hundred and ninety two, 要能转换为392.
2. 能识别英文的加减乘除: Add, minus, multiply, divide.
3. 能识别符号的加减乘除: +, -, *, /
例子如下:
输入:three hundred and ninety two multiply with 7
结果:2744
输入:12 minus 3
结果: 9
/* eng_cac.c */
/* english caculator */
#include #include #include
int skip_space(const char *p, int *io_index)
{
int index;
if (p == NULL || io_index == NULL) {
return -1;
}
index = *io_index;
if (index < 0) {
return -1;
}
if (!isspace(p[index])) {
return -1;
}
do {
++index;
}while (isspace(p[index]));
*io_index = index;
return 0;
}
int get_word(const char *p, int *io_index, int *o_start, int *o_len)
{
int index;
if (p == NULL || io_index == NULL || o_start == NULL || o_len == NULL) {
return -1;
}
index = *io_index;
if (index < 0) {
return -1;
}
if (isalpha(p[index])) {
do {
++index;
}while (isalpha(p[index]));
*o_start = *io_index;
*o_len = index - *io_index;
*io_index = index;
return 0;
}else if (ispunct(p[index])) {
++index;
*o_start = *io_index;
*o_len = 1;
*io_index = index;
return 0;
}else {
return -1;
}
}
int get_token(const char *tok, int len, const char *tok_tab[], int tab_len)
{
int i;
if (tok == NULL || tok_tab == NULL) {
return -1;
}
if (len <= 0 || tab_len <= 0) {
return -1;
}
for (i = 0; i < tab_len; ++i) {
if (strncmp(tok, tok_tab[i], len) == 0) {
if (tok_tab[i][len] == '\0') {
return i;
}
}
}
return -1;
}
int skip_word(const char *p, int *io_index, const char *s)
{
int index;
int start, len;
if (p == NULL || io_index == NULL || s == NULL) {
return -1;
}
index = *io_index;
if (index < 0) {
return -1;
}
skip_space(p, &index);
if (get_word(p, &index, &start, &len) == 0) {
if (strncmp(p + start, s, len) == 0) {
*io_index = index;
return 0;
}
}
return -1;
}
int get_english_number_bellow_twenty(const char *p, int *io_index, int *o_value)
{
static const char *digit20[20] = {
"zero",
"one",
"two",
"three",
"four",
"five",
"six",
"seven",
"eight",
"nine",
"ten",
"eleven",
"twelve",
"thirteen",
"fourteen",
"fifteen",
"sixteen",
"seventeen",
"eighteen",
"nineteen",
};
int index;
int start;
int len;
int tok;
if (p == NULL || io_index == NULL || o_value == NULL) {
return -1;
}
index = *io_index;
if (index < 0) {
return -1;
}
skip_space(p, &index);
if (get_word(p, &index, &start, &len) == 0) {
tok = get_token(p + start, len, digit20, 20);
if (tok != -1) {
*o_value = tok;
*io_index = index;
return 0;
}
}
return -1;
}
int get_english_number_decade(const char *p, int *io_index, int *o_value)
{
static const char *decades[8] = {
"twenty",
"thirty",
"forty",
"fifty",
"sixty",
"seventy",
"eighty",
"ninety",
};
int index;
int start, len;
int value;
int retn;
if (p == NULL || io_index == NULL || o_value == NULL) {
return -1;
}
index = *io_index;
if (index < 0) {
return -1;
}
skip_space(p, &index);
if (get_word(p, &index, &start, &len) == 0) {
retn = get_token(p + start, len, decades, 8);
if (retn != -1) {
value = retn * 10 + 20;
*o_value = value;
*io_index = index;
return 0;
}
}
return -1;
}
int get_english_number_bellow_hundred(const char *p, int *io_index, int *o_value)
{
int index;
int value;
int digit;
int decade_yes;
if (p == NULL || io_index == NULL || o_value == NULL) {
return -1;
}
index = *io_index;
if (index < 0) {
return -1;
}
decade_yes = 0;
if (get_english_number_decade(p, &index, &value) == -1) {
value = 0;
}else {
decade_yes = 1;
}
if (get_english_number_bellow_twenty(p, &index, &digit) == 0) {
if (decade_yes && digit == 0) {
return -1;
}
value += digit;
}else {
if (!decade_yes) {
return -1;
}
}
*o_value = value;
*io_index = index;
return 0;
}
int get_english_number_base(const char *p, int *io_index, int *o_base)
{
static const char *more[] = {
"thousand",
"million",
"billion",
};
static const int base[] = {
1000,
1000000,
1000000000,
};
int index;
int start,len;
int retn;
if (p == NULL || io_index == NULL || o_base == NULL) {
return -1;
}
index = *io_index;
if (index < 0) {
return -1;
}
skip_space(p, &index);
if (get_word(p, &index, &start, &len) == 0) {
retn = get_token(p + start, len, more, 4);
if (retn != -1) {
*o_base = base[retn];
*io_index = index;
return 0;
}
}
return -1;
}
int get_english_number_bellow_thousand(const char *p, int *io_index, int *o_value)
{
int index;
int value;
int sum;
if (p == NULL || io_index == NULL || o_value == NULL) {
return -1;
}
index = *io_index;
if (index < 0) {
return -1;
}
if (get_english_number_bellow_hundred(p, &index, &sum) == 0) {
if (sum > 0 && sum < 10) {
if (skip_word(p, &index, "hundred") == 0) {
sum *= 100;
if (skip_word(p, &index, "and") == 0) {
if (get_english_number_bellow_hundred(p, &index, &value) == -1) {
return -1;
}
if (value == 0) {
return -1;
}
sum += value;
}
}
}
*o_value = sum;
*io_index = index;
return 0;
}else if (skip_word(p, &index, "a") == 0) {
sum = 1;
if (skip_word(p, &index, "hundred") == 0) {
sum *= 100;
if (skip_word(p, &index, "and") == 0) {
if (get_english_number_bellow_hundred(p, &index, &value) == -1) {
return -1;
}
if (value == 0) {
return -1;
}
sum += + value;
}
}
*o_value = sum;
*io_index = index;
return 0;
}
return -1;
}
int get_english_number(const char *p, int *io_index, int *o_value)
{
int index;
int value;
int sum;
int base;
if (p == NULL || io_index == NULL || o_value == NULL) {
return -1;
}
index = *io_index;
if (index < 0) {
return -1;
}
sum = 0;
for (;;) {
if (get_english_number_bellow_thousand(p, &index, &value) == 0) {
if (value == 0) {
break;
}
if (get_english_number_base(p, &index, &base) == 0) {
value *= base;
if (sum > 0 && value >= sum) {
return -1;
}
sum += value;
continue;
}
sum += value;
}
if (sum == 0) {
return -1;
}
break;
}
*o_value = sum;
*io_index = index;
return 0;
}
int get_operator1(const char *p, int *io_index, int *o_op)
{
static const char *op_list[] = {
"positive",
"+",
"negative",
"-",
};
int index;
int start, len;
int retn;
if (p == NULL || io_index == NULL || o_op == NULL) {
return -1;
}
index = *io_index;
if (index < 0) {
return -1;
}
skip_space(p, &index);
if (get_word(p, &index, &start, &len) == 0) {
retn = get_token(p + start, len, op_list, 8);
if (retn != -1) {
*o_op = retn / 2;
*io_index = index;
return 0;
}
}
return -1;
}
int get_operator2(const char *p, int *io_index, int *o_op)
{
static const char *op_list[] = {
"plus",
"+",
"minus",
"-",
"multiply",
"*",
"divide",
"/",
};
int index;
int start, len;
int retn;
if (p == NULL || io_index == NULL || o_op == NULL) {
return -1;
}
index = *io_index;
if (index < 0) {
return -1;
}
skip_space(p, &index);
if (get_word(p, &index, &start, &len) == 0) {
retn = get_token(p + start, len, op_list, 8);
if (retn != -1) {
if ((retn & 1) == 0) {
skip_word(p, &index, "with");
}
*o_op = retn / 2;
*io_index = index;
return 0;
}
}
return -1;
}
int get_arab_number(const char *p, int *io_index, int *o_value)
{
int index;
int value;
if (p == NULL || io_index == NULL || o_value == NULL) {
return -1;
}
index = *io_index;
if (index < 0) {
return -1;
}
skip_space(p, &index);
if (isdigit(p[index])) {
value = 0;
do {
value = value * 10 + p[index] - '0';
index++;
}while (isdigit(p[index]));
*o_value = value;
*io_index = index;
return 0;
}
return -1;
}
int get_number(const char *p, int *io_index, int *o_value)
{
int index;
int value;
if (p == NULL || io_index == NULL || o_value == NULL) {
return -1;
}
index = *io_index;
if (index < 0) {
return -1;
}
if (get_english_number(p, &index, &value) == 0
|| get_arab_number(p, &index, &value) == 0) {
*o_value = value;
*io_index = index;
return 0;
}
return -1;
}
int get_oprand(const char *p, int *io_index, int *o_value)
{
int index;
int op;
int d1;
int result;
if (p == NULL || io_index == NULL || o_value == NULL) {
return -1;
}
index = *io_index;
if (index < 0) {
return -1;
}
/* one oprand operation */
if (get_operator1(p, &index, &op) == 0) {
if (get_number(p, &index, &d1) != 0) {
return -1;
}
switch (op) {
case 0:
result = d1;
break;
case 1:
result = -d1;
break;
default:
return -1;
}
}else {
if (get_number(p, &index, &result) != 0) {
return -1;
}
}
*o_value = result;
*io_index = index;
return 0;
}
int get_end(const char *p, int *io_index)
{
int index;
if (p == NULL || io_index == NULL) {
return -1;
}
index = *io_index;
if (index < 0) {
return -1;
}
skip_space(p, &index);
if (p[index] == '\0') {
*io_index = index;
return 0;
}
return -1;
}
int caculate(const char *exp, int *o_value)
{
int op; /* operator */
int d1, d2; /* oprand number */
int result; /* store the expression result */
int index;
if (exp == NULL || o_value == NULL) {
return -1;
}
index = 0;
if (get_oprand(exp, &index, &result) == -1) {
return -1;
}
/* conjunction operation */
while (get_end(exp, &index) == -1) {
/* two oprands operation */
d1 = result;
if (get_operator2(exp, &index, &op) == -1) {
return -1;
}
if (get_oprand(exp, &index, &d2) == -1) {
return -1;
}
switch (op) {
case 0:
result = d1 + d2;
break;
case 1:
result = d1 - d2;
break;
case 2:
result = d1 * d2;
break;
case 3:
if (d2 == 0) {
return -1;
}
result = d1 / d2;
break;
default:
return -1;
}
}
*o_value = result;
return 0; /* end of conjunction */
}
int read_line(char *buff, int buf_len)
{
int len;
if (buff == NULL || buf_len <= 0) {
return -1;
}
for (;;) {
if (fgets(buff, buf_len, stdin) == NULL) {
return -1;
}
len = strlen(buff) - 1;
if (buff[len] == '\n') {
buff[len] = '\0';
return 0;
}
/* check for last not terminated line in file */
if (fgets(buff, buf_len, stdin) == NULL) {
return 0;
}
/* line length is greater than buffer */
/* skip rest line content */
for (;;) {
len = strlen(buff) - 1;
if (buff[len] == '\n') {
return -2; /* buffer overflow, skip the whole line */
}
if (fgets(buff, buf_len, stdin) == NULL) {
return -1;
}
}
}
}
int main(void)
{
char cmd_line[1024];
int result;
puts("English Caculator");
puts("Enter an expression");
puts("Ctrl-Z to exit\n");
for (;;) {
printf(": ");
switch (read_line(cmd_line, sizeof(cmd_line))) {
case 0:
break;
default:
case -1:
puts("");
return 0;
case -2:
puts("Buffer Overflow");
continue;
}
if (caculate(cmd_line, &result) == 0) {
printf("'%s' = %d\n", cmd_line, result);
}else {
printf("'%s' = E, Invalid Expression\n", cmd_line);
}
}
}
linux加法计算器程序,Linux下实现一个计算器程序相关推荐
- linux应用程序的编写实验原理,操作系统实验 1.在linux下编写一个应用程序 联合开发网 - pudn.com...
操作系统实验 所属分类:Linux/Unix编程 开发工具:C/C++ 文件大小:1KB 下载次数:3 上传日期:2019-05-01 20:34:21 上 传 者:烟雨南风起 说明: 1.在lin ...
- 用java实现一个计算器程序_1.2第一个java程序——hello world
第一个java程序--hello world 实现一个java程序,主要有三个步骤:1.编写源代码,2.编译源代码,3.运行.java的源代码必须先编译,然后才能由JVM解析执行.所以我们程序员第一步 ...
- eclips下第一个java程序 hello world!
eclips下第一个java程序 hello world!
- PHP 程序员如何设计一个爬虫程序
A8U几年前接过一个项目,类似一个 PHP 爬虫程序,做一个微博舆情分析系统:要爬取新浪微博,用特定关键词搜索中的页面的微博内容. 那是我第一次接触网络爬虫,根本没有思路,也不了解什么Scrap ...
- 小程序多少钱?一个小程序多少钱?
对于需要开发小程序的企业来说,价格是最重要的.现在各大搜索引擎都有很多公司团队推荐小程序开发.那么小程序多少钱?一个小程序多少钱?让我们简单分析两种开发类型. 小程序多少钱?一个小程序多少钱? 一.中 ...
- 怎么创建小程序?如何创建一个小程序呢?
怎么创建小程序?如何创建一个小程序呢?关于怎么创建小程序,是对于一些初次接触小程序或者是想拥有小程序的企业商家来说首先想要搞清楚的问题,其实创建小程序的方法很简单,下面就给大家简单介绍一下怎么创建小程 ...
- 小程序教程1:初识小程序,快速搭建一个小程序项目
前言: 打算整理一个小程序系列的资料.如何快速搭建一个小程序项目,以及一个小程序项目应该有哪些内容. 相关资料: 微信公众平台微信公众平台,给个人.企业和组织提供业务服务与用户管理能力的全新服务平台. ...
- Linux下第一个java程序没有成功
当前是CentOS5.5: 进入vim编辑一个java helloworld程序: 系统自带OpenJDK 1.6.0: javac编译:提示没有javac命令: 找一下OpenJDK的安装目录:不知 ...
- Linux环境下编写一个shell程序,此程序的功能:随机生成一个1-100的数(答案)让用户猜
题目:编写一个shell程序,此程序的功能:随机生成一个1-100的数(答案)让用户猜,如果用户猜的数大于答案,则提示大了,如果用户猜的数小于答案,则提示小了.当用户猜对时提示:猜对了. #! /bi ...
最新文章
- 可以比较两个指针是否相等_算法一招鲜——双指针问题
- 九十四、一文带你玩转简单的flask
- 命令点无效怎么处理_怎么更好处理闲置包包,买包卖包都要记住这5点
- 河北省单招计算机类考试考英语吗,2019年河北省高职单招考试十类 和对口电子电工类、计算机类联考 专业基础考试(英语)考试大纲.doc...
- ES6的新特性(8)——数组的扩展
- 使用IDEA回退SVN到某个历史版本
- 华为手机root过程
- 反射 Reflect Modifier 修饰符工具类
- Technical support of ZYC-Roll Book
- TP5集成支付宝h5支付接口
- 解决上网认证系统 IP 更改后 Ubuntu 等 Linux 系统无法上网的问题
- 改变CEdit中字体大小与颜色
- 程序和进程的关系程序
- 如何看到laravel的版本号
- qbo_listen编译问题
- MSF Risk Management Discipline
- 基于CNN-LSTM及深度学习的风电场时空组合预测模型
- 坚定看好核电设备产业
- 奇虎360选择IPO “壳概念”很受伤
- redis的数据结构和拓容
热门文章
- 腾讯地图javascript API实现地图模糊搜索标记,经纬度输入及点击双向定位
- 10讲学会C语言之第一讲:编程前的准备
- 每日三省吾身:2014-1-16
- wget 和scp对比_Linux中curl命令和wget命令的使用介绍与比较
- java七牛云图片压缩_七牛云 CDN 历史图片批量压缩
- 用iLO在惠普服务器安装exsi6.5
- js中判断数据类型的方法
- 微信小程序中使用iconfont阿里巴巴矢量图标
- 【acwing】166. 数独****(DFS)
- 轻量级模型设计与部署总结(关键字定义/架构理解/高效CNN)