任务描述
请编写一个程序:把程序build后生成的可执行文件(假设文件名为mycal.exe)放到C盘根目录下,在命令行提示符下,转到c:\下 ,键入mycal 100+200 运行的结果为 300.00;键入mycal 100*200 运行的结果为20000.00 等。 程序中的运算符与C语言中的运算符在字符上保持一致。计算结果保留小数点后两位有效数字。
相关知识
为了完成本关任务,你需要掌握:
(1)main函数中参数的有关知识
(2)字符串及字符指针数组
main函数中参数的有关知识
(1)main函数是程序执行的入口。
(2)main函数可以有返回值,也可以无返回值。
(3)main函数可以带参数,也可以不带参数。
例: void main(); int main(); int main(int argc,char* argv[]);
以下代码是main函数带参数情形下的一个典型的例子,弄懂了它,本关你就容易通过了一半:
//argc:表示字符指针数组argv的元素的个数,其最小值为1
//argv:字符串数组,该数组的每一个元素都是一个字符串,
//argv[0]:表示该程序所在的完整路径,这个参数的值由操作系统传入,用户通常不能更改
//argv[1],argv[2]...为用户通过命令行运行该程序时输入的用户参数,都是字符串。
#include<stdio.h>
int main(int argc, char* argv[])
{
int k;
printf("参数个数:%d\n", argc);
for (k = 0; k < argc; k++)
{
printf("参数%d:", k);
puts(argv[k]);
}
getchar();
return 0;
}
大家可以复制以上这段代码到你的本地开发环境,build后,双击生成的可执行文件(假设为project1.exe),将会显示类似如下的运行结果界面。
直接双击运行可执行文件,相当于用户没有给main传入任何参数,因此参数个数就是默认的1,argv[0]存储就是第1个参数的值,就是当前应用程序的完整路径(含文件名) 若用户想传入参数,就必须在命令行下运行该程序,其操作如下: 第1步:系统“开始”菜单,在搜索文本框中输入“cmd”,如图:
第2步:假设你的程序在D盘(d:\myapp\project1.exe),输入D:,回车,然后输入: cd d:\myapp,将会把project1.exe文件所在目录设为当前目录
此时,你可以在命令行下运行该程序了。如下图所示。
按照上面照本宣科的练习测试,你应该能够搞懂带参数的main的用法了。 也就是说,用户通过命令行传入给main的第1个参数为argv[1],它是一个字符数组(或字符串),针对本题,你的程序代码无非就是对该字符串进行解析,得到其中的运算符和左右两边的操作数,从而做相应的运算,输出结果即可。
编程要求
本程序的源文件包含两个,1个是main函数所在的源文件main.c,另一个是对一个字符串进行解析的函数的定义源文件myfun.c,你只需要在理解main.c中代码的基础上,在右侧代码区给定的地方完成myfun.c中的代码即可(你也可以删除已有代码,按照你的思路从零开始)。main.c的代码如下:
#include<stdio.h>
void processUserInputStr(char* s);
int main(int argc, char* argv[])
{
processUserInputStr(argv[1]);
return 0;
}
代码实现
#include<string.h>
#include <stdlib.h>
//s:一个形如a[运算符]b的字符串,例如:4.5+9,6-9,4/5,8*7...
//该函数经过处理,输出数的运算结果,例如若s为"20.3+1",则该函数在屏幕上输出21.30(保留小数点后面2位有效数字
//此函数内部操作的基本算法为:
//第1步:找到运算符对应的位置索引
//第2步:根据运算符位置,将其前面的字符串复制到strA,后面的字符串复制到strB
//第3步:将strA,strB转换为数值(使用函数atof,具体用法请百度)a,b
//第4步:根据运算符,对a,b进行相应的运算
//第5步:输出运算结果result
void processUserInputStr(char* s)
{
int len=strlen(s); //s中有效字符的个数
//rA,strB分别用于存放两个操作数对应的字符串
char strA[100],strB[100];
//a,b分别用于存放将字符串转换后的数,result用于保存运算结果
double a,b,result;
char op;//用于存储s中的运算符对应的字符串
int k,posOp;//posOp:符号的位置索引
/**********begin**********/
for(k=0;s[k]!='+' && s[k]!='-' && s[k]!='*' && s[k]!='/';k++)
{
strA[k]=s[k];
}
op=s[k];int j,i;
for(i=0,j=k+1;s[j]!='\0';i++,j++)
{
strB[i]=s[j];
}
a=atof(strA);
b=atof(strB);
switch(op){
case '+':result=a+b;break;
case '-':result=a-b;break;
case '*':result=a*b;break;
case '/':result=a/b;break;
default:printf("input wrong");
}
printf("%.2lf",result);
/**********end**********/
}