#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");
//這里為了調(diào)試方便愕提,我把fp寫出來了惜傲,以后為了讓代碼易讀判没,還是盡量寫出來
if (fp== NULL)
{
printf("無法打開文件\n");
exit(0);
}
printf("請輸入一個整數(shù)M:");
scanf("%d",&m);
//以后記住袱耽,像這種不是指針型變量用scanf函數(shù)的需要加上取地址符號&蚁趁,但是數(shù)組不需要扶踊,因為數(shù)組其實也只是一個指針泄鹏,下同
printf("請輸入一個數(shù)字K:");
scanf("%f", &k);
//獲取文件中的字符個數(shù)
while (!feof(fp)){
fgetc(fp);
num++;
}
//其實這里獲取的num值并不是準(zhǔn)確的文件中的字符的個數(shù),因為再最后一次循環(huán)中秧耗,fgetc函數(shù)使文件指針移向文件末尾的時候num又自加了一次备籽,然后才會進行while條件的判斷
Q = search(fp,num-1,k,m);
/*這里我把num-1了,這樣就是文件里邊的真正的字符個數(shù)了分井,記住要把search函數(shù)需要的參數(shù)都傳過去车猬,
比如說需要k,m參數(shù)尺锚,所有一定要把這些參數(shù)傳過去珠闰,需要更改函數(shù)的定義和聲明*/
if (Q == -1) {
printf("沒有找到!\n");
}
printf("倒數(shù)第M個大于K的數(shù)字是:%f\n", Q);
//Q的類型是float不能用%d進行輸出,應(yīng)該用%f
return 0;
}
float search(FILE *fp,int n,float k,int m) {
//修改定義和聲明瘫辩,增加傳入的參數(shù)
float s[100];
//float s[m+1];
/*這里因為我的編譯器不支持c99標(biāo)準(zhǔn)伏嗜,所以只能在定義數(shù)組的時候聲明長度,考試的時候可以寫float s[m+1];
因為題中說最多存m+1個字符*/
int i, j=0;
for (i = 0; i < n; i++) {
//這里不能 “=n”因為數(shù)組的索引是從0開始等于n的話就是需要循環(huán)n+1次伐厌,而文件中真實的字符個數(shù)為n個
fseek(fp, -((long)i+1), SEEK_END);
/*你這個函數(shù)用的不錯承绸,我都想不到,不過調(diào)用的時候盡量寫標(biāo)準(zhǔn)挣轨,第一個參數(shù)傳入一個文件-指針军熏,這個你知道,
第二個參數(shù)是long類型的卷扮,你定義的i是int型的荡澎,所有要進行強制類型轉(zhuǎn)換,而題中說是從倒數(shù)開始查找晤锹,所以應(yīng)該是輸入一個負(fù)值衔瓮,
至于為什么要+1之后再取負(fù),是因為要把文件指針移向倒數(shù)第一個字符抖甘,只有這樣fgetc才能讀取到字符热鞍,因為fgetc函數(shù)只能向后讀取不能向前讀取,
最后一個參數(shù)可以用2也可以用SEEK_END*/
char a = fgetc(fp);
float b = (float)a-48;
/*
fgetc函數(shù)返回的char類型的,不能直接進行比較薇宠,需要轉(zhuǎn)換偷办,但是直接用float進行強制類型轉(zhuǎn)換的時候,
是轉(zhuǎn)換為該字符串的acill碼澄港,比如說字符3轉(zhuǎn)換后acill就變成51了椒涯,這樣就失去了比較的價值了,所以我們根據(jù)acill碼
找到他原來的值回梧,我們直接把整數(shù)的acill碼減去48废岂,就可以得該字符實際表示的整數(shù)值,
我們這樣計算計算之后得到了變量b狱意,用變量b我們就可以與k進行比較了
*/
printf("字符為:%c\t轉(zhuǎn)為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;
//判斷字符串?dāng)?shù)組的長度可以用strlen但是湖苞,判斷數(shù)組的長度只能用sizeof進行計算得出
return s[m-1];
//要時刻牢記數(shù)組的元素是從0開始的,所以題上的說第m個详囤,其實對應(yīng)的數(shù)組上的m-1
}
運行結(jié)果.png
file文件中的內(nèi)容.png
image.png
image.png