购物单原题
小明刚刚找到工作,老板人很好,只是老板夫人很爱购物。老板忙的时候经常让小明帮忙到商场代为购物。小明很厌烦,但又不好推辞。这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有打折优惠的。小明也有个怪癖,不到万不得已,从不刷卡,直接现金搞定。现在小明很心烦,请你帮他计算一下,需要从取款机上取多少现金,才能搞定这次购物。取款机只能提供100元面额的纸币。小明想尽可能少取些现金,够用就行了。你的任务是计算出,小明最少需要取多少现金。以下是让人头疼的购物单,为了保护隐私,物品名称被隐藏了。
**** 180.90 88折
**** 10.25 65折
**** 56.14 9折
**** 104.65 9折
**** 100.30 88折
**** 297.15 半价
**** 26.75 65折.............
本题中各个折扣和标价太多都需要进行输入处理,键盘输入太麻烦,可以将这几个数据自己手动写入到一个文件中,从文件中读取到代码里。
freopen函数介绍
在程序处理过程中我们会经常遇到需要读取大量数据的情况,在此时若用scanf进行键盘一个个输入,输入时间会过长,此时我们可以调用freopen()函数,即文件重定向技术,进行文件调用。
freopen函数声明:FILE*freopen(const char* filename,const char *mode,FILE*stream);
第一个参数const char* filename是文件路径,第二个参数是代表文件访问权限的字符串,常用的有“r”表示只读访问(读取文件数据时用),“w”表示只写访问(往文件里面写入数据时使用),第三个参数是需要被重新定义的文件流(stdin,stdout)。
注意文件流在调用时,需要在函数结束时进行fclose,将文件流调用关闭。
freopen函数具体的操作方法
首先鼠标右键点击新建进行文本文档的新建
然后打开文本文档,将数据进行输入,注意输入时要把数据进行处理,因为题目给的原始数据中既有数字也有中文,譬如中文半折要改成50,把中文折删去即可。数据在手动写入时也有技巧,因为在后面编程时考虑到要把价格放到一个数组里面,把折扣放在一个数组里,因此输入结果如下
进行输入过之后,就可以进行代码编程啦,但是首先是要找到创建文件的直接地址,我们可以右键点击文本文档,点击属性
文中红圈标记就是直接地址,后缀再加上文件名字即可,注意在编程时直接地址要加双杠,即是C:\\Users\\Lenovo\\Desktop\\新建文本文档.txt,下面开始编程
#include<stdio.h>
int main()
{
freopen("C:\\Users\\Lenovo\\Desktop\\新建文本文档.txt", "r", stdin);
int i=0,c=0;
float sum=0,price[100],discount[100];
while (scanf("%f %f", &price[i], &discount[i])!=EOF)//将文件中数据读取到两个数组里面
i++;
while (i--)
{
if (discount[c] < 10)
sum = sum+price[c] * discount[c] / 10;
else
sum = sum+price[c] * discount[c] / 100;
c++;
}
printf("%f", sum);
}
部分结果演示(头七件商品):