美文网首页
2016年第七大题

2016年第七大题

作者: Tyihou | 来源:发表于2017-10-04 19:41 被阅读0次
    #include<stdio.h>
    #include<stdlib.h>
    float search(FILE *fp, int n, float k, int m);
    #pragma warning(disable:4996)
    int main()
    {
        FILE *fp;
        float  k, Q;
        //你的代码的这里没有声明Q,我这给你加上,以后记住每用一个变量之前都要想一下,自己是否声明过了
        int m, num = 0;
        fp = fopen("file.txt", "rb");
        //这里为了调试方便,我把fp写出来了,以后为了让代码易读,还是尽量写出来
        if (fp== NULL)
        {
            printf("无法打开文件\n");
            exit(0);
    
        }
        printf("请输入一个整数M:");
        scanf("%d",&m);
        //以后记住,像这种不是指针型变量用scanf函数的需要加上取地址符号&,但是数组不需要,因为数组其实也只是一个指针,下同
        printf("请输入一个数字K:");
        scanf("%f", &k);
        //获取文件中的字符个数
        while (!feof(fp)){
            fgetc(fp);
            num++;
        }
        //其实这里获取的num值并不是准确的文件中的字符的个数,因为再最后一次循环中,fgetc函数使文件指针移向文件末尾的时候num又自加了一次,然后才会进行while条件的判断
        Q = search(fp,num-1,k,m);
        /*这里我把num-1了,这样就是文件里边的真正的字符个数了,记住要把search函数需要的参数都传过去,
        比如说需要k,m参数,所有一定要把这些参数传过去,需要更改函数的定义和声明*/
        if (Q == -1) {
            printf("没有找到!\n");
                }
        printf("倒数第M个大于K的数字是:%f\n", Q);
        //Q的类型是float不能用%d进行输出,应该用%f
        return 0;
    }
    float search(FILE *fp,int n,float k,int m) {
        //修改定义和声明,增加传入的参数
        float s[100];
        //float s[m+1];
        /*这里因为我的编译器不支持c99标准,所以只能在定义数组的时候声明长度,考试的时候可以写float s[m+1];
        因为题中说最多存m+1个字符*/
        int i, j=0;
        for (i = 0; i < n; i++) {
            //这里不能 “=n”因为数组的索引是从0开始等于n的话就是需要循环n+1次,而文件中真实的字符个数为n个
            fseek(fp, -((long)i+1), SEEK_END);
            /*你这个函数用的不错,我都想不到,不过调用的时候尽量写标准,第一个参数传入一个文件-指针,这个你知道,
            第二个参数是long类型的,你定义的i是int型的,所有要进行强制类型转换,而题中说是从倒数开始查找,所以应该是输入一个负值,
            至于为什么要+1之后再取负,是因为要把文件指针移向倒数第一个字符,只有这样fgetc才能读取到字符,因为fgetc函数只能向后读取不能向前读取,
            最后一个参数可以用2也可以用SEEK_END*/
            char a = fgetc(fp);
            float b = (float)a-48;
            /*
            fgetc函数返回的char类型的,不能直接进行比较,需要转换,但是直接用float进行强制类型转换的时候,
            是转换为该字符串的acill码,比如说字符3转换后acill就变成51了,这样就失去了比较的价值了,所以我们根据acill码
            找到他原来的值,我们直接把整数的acill码减去48,就可以得该字符实际表示的整数值,
            我们这样计算计算之后得到了变量b,用变量b我们就可以与k进行比较了
            */
            printf("字符为:%c\t转为float型为:%f\t输入需要对比的字符为:%f\n", a, b,k);
            if (b>k)
            {
                s[j] = b;
                j++;
            }
        }
        //if ((float)strlen(s) < m)return -1;
        if ((float)sizeof(s)< m)return -1;
        //判断字符串数组的长度可以用strlen但是,判断数组的长度只能用sizeof进行计算得出
        return s[m-1];
        //要时刻牢记数组的元素是从0开始的,所以题上的说第m个,其实对应的数组上的m-1
    }
    
    运行结果.png file文件中的内容.png image.png image.png

    相关文章

      网友评论

          本文标题:2016年第七大题

          本文链接:https://www.haomeiwen.com/subject/nivcyxtx.html