zoukankan      html  css  js  c++  java
  • 讨论文件输入输出

     输入不超过1000的若干整数,输出最大、最小、平均值:

    关键在于,输入数字个数是不确定的

    一,利用scanf函数的返回值就是返回输入数字的个数,的,这个特性判断输入终止。

    #include"iostream"
    #include"ctime"
    using namespace std; 
    
    int main()
    {
        int x,n=0,min,max,s=0;
        while(scanf("%d",&x)==1){
            s+=x;
            if(x<min)min=x;
            if(x>max)max=x;
            ++n;
        } 
        printf("%d %d %d",min,max,(double)s/n);
        return 0;
    }

    这样子做可以输入无限多的数,但问题是,如何结束输入呢?

    enter+ctrl z+enter可以结束输入.

    另外值得注意的是,定义min与max时并未赋初值,如果直接将他们输出,会看出此时他们的值其实是任意的;所幸的是,我的电脑上min=41,max=0,还比较靠谱;如果min随机到了-100000,max随机到了100000,在这种情况下,当我们输入的数据都既不太小又不太大时,最大最小值就都得不到正确答案。

    所以最好还是为min与max赋初值,例如定义INF=2147483648(2^32),max=-INF,min=INF-1.

    二,利用文件读写

    1.输入输出重定向:在main函数入口处加:

    freopen("intput.txt","r",stdin);
    freopen("output.txt","w",stdout);

    这样,scanf函数将从input.txt中读入,printf写入文件output.txt。这样子一个巨大的好处就是,当题目需要输入很多数字,你一遍遍的验证自己的程序是否正确时,再也不用一遍遍的输入了,剩下好多时间!

    但是,有些比赛不允许通过文件重定向来读写文件,这时可以用“开关”来控制是否使用文件重定向。

    当定义了LOCAL,就执行 #ifdef LOCAL 与 #endif 之间的语句,因此,在提交时删除掉#define LOCAL即可。这使得我们可以继续享受输入输出重定向带来的便捷。

    另还,还可以在编译选项里定义这个LOCAL符号,参考紫书附录A

    #define LOCAL
    #include"iostream"
    #include"ctime"
    using namespace std; 
    
    int main()
    {
        #ifdef LOCAL
        freopen("intput.txt","r",stdin);
        freopen("output.txt","w",stdout);
        #endif
        int x,n=0,min,max,s=0;
        while(scanf("%d",&x)==1){
            s+=x;
            if(x<min)min=x;
            if(x>max)max=x;
            ++n;
    } printf(
    "%d %d %d",min,max,(double)s/n); return 0; }

    2.当比赛要求一定要用文件输入输出,但禁止用重定向的方式时,程序如下

    阅读程序可了解具体语法

    #include"iostream"
    #include"ctime"
    using namespace std; 
    
    #define INF 1000000000
    
    int main()
    {
        FILE *fin,*fout;
        fin=fopen("data.in","rb");
        fout=fopen("data.out","wb");
        int x,n=0,min=INF,max=-INF,s=0;
        while(fscanf(fin,"%d",&x)==1)
        {
            s+=x;
            if(x<min)min=x;
            if(x>max)max=x;
            n++
        }
        fprintf(fout,"%d %d %.3f
    ",min,max,(double)s/n);
        fclose(fin);
        fclose(fout);
        return 0;
    }

     

    柳暗花明又一村
  • 相关阅读:
    spring @component的作用
    Spring 开启Annotation <context:annotation-config> 和 <context:component-scan>诠释及区别
    servlet中实现页面跳转return “r:”和return “f:
    MyEclipse中SVN的使用方法 此博文包含图片 (2012-04-19 12:18:35)
    MyEclipse使用总结——MyEclipse10安装SVN插件
    javaweb学习总结(九)—— 通过Servlet生成验证码图片
    Spring-springmvc-mybatis整合
    MyBatis连接SQLServer数据库
    mybatis入门基础(二)----原始dao的开发和mapper代理开发
    MyBatis入门基础(一)
  • 原文地址:https://www.cnblogs.com/ucandoit/p/8229018.html
Copyright © 2011-2022 走看看