2016年第七大题

2017-10-04  本文已影响0人  Tyihou
#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
上一篇下一篇

猜你喜欢

热点阅读