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