請教兩個關於C語言的問題

2009-05-07 5:51 am
有下列兩組程式的要求,請板上有經驗的朋友指點我一下.

1.用C語言撰寫將16進制實數轉成10進制實數,例如3A.8轉成58.5
(10轉16我ok,倒回去做怎麼也想不出來)

2.撰寫對電腦內的儲存設備內儲存的所有文字檔案進行關鍵字搜尋
(1)可以接受輸入中文or英文or中英夾雜之關鍵字進行搜尋
(2)必須將所搜尋到的檔案名稱及包含該關鍵字前後幾個字的的段落記錄起來
(3)須統計並顯示一共搜尋到多少檔案多少段落
(這題更是一頭霧水,開檔案是fopen,但是要怎麼森尋整台電腦的所有檔案呀><)
更新1:

to uglypig001: 我需要的是16->10,不是10->16

更新2:

to 九孔 我的mail: [email protected] 謝謝

回答 (4)

2009-05-08 4:01 am
✔ 最佳答案
程式碼破表@@~~~只能用寄的
這邊用敘述的...檔案在寄給你囉~~~

1.GetLogicalDrives抓電腦有那些裝置在去
當然也可以很笨的A-Z槽都去讀檔案
頂多只是找不到檔而已...方法隨你高興

2.SearchFile(char *WorkPath)尋找根目錄~~

3.如果找到的目錄
WorkPath = WorkPath + 搜尋到目錄名稱
在CALL一次SearchFile(char *WorkPath)

void SearchFile(char *WorkPath)
{
.............
.............
if((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
if( (strcmp(FindFileData.cFileName,".")!=0)&&(strcmp(FindFileData.cFileName,"..")!=0) )
{
sprintf(FindPath,"%s\\%s", WorkPath, FindFileData.cFileName);
SearchFile(FindPath);
g_nDirCount++;
}
}
}
其中.和.. 代表當下目錄和上一層目錄...所以要跳過

4.如果是找到檔案
那就檢查檔案是不是TXT
如果是TXT
檢查有沒有關鍵字

#define KEYWORD_BUFFER_SIZE 20
這是---->我只開20的byte去存內容
#define ADVANCE_KEYWORD_BUFFER 10
這是---->關鍵字前面要有幾個字

這邊設定 = 總長只有20個byte
關鍵字前面的10個字+關鍵字+關鍵字之後的字 = 20
如果你的關鍵字很長那就把20改長一點

2009-05-07 20:03:06 補充:
@@~~你沒開放mail~~~
把mail給我我再把程式碼寄給你ㄅ~~~

2009-05-07 22:44:22 補充:
程式碼不在我家的電腦@@...明早寄給你...

PS.請小心使用...因為...會找很久@@~~畢竟每個一槽都找
系統槽少說也不少檔案在...所以做一次的時間~~恩...肯定很久@@
請小心服用...XD

2009-05-08 10:35:01 補充:
寄了~~
參考: 自己
2009-05-07 3:19 pm
3A.8 轉成 58.5:
3 *16 + 10 + (8 * 10 / 16)



不同的檔案系統 (File System, FS),檔案/目錄記錄的方式完全不同!
Windows / MS-DOS 的檔案系統 (FATxx, NTFS),
不可能用 fopen 做到。

Unix / Linux 印象中可以,要查一下。
(這部份,K&R 上有。前一陣也有人回答過。)

你是修什麼課要用到 2.?
那是大型的搜尋耶!
答案『可能』要另外開檔記錄,不太容易。

2009-05-07 07:19:30 補充:
而且,除了上述檔案系統外,還有下列兩個問題沒定義:
1. 『所有』文字檔:M$ 的 FS,認副檔名為主。
 但至少有: txt ini log bat me 等等〝常用〞的文字檔副檔名!!
 沒限制的話,可能還要每個檔都開,下去判斷是否為文字檔!
 判斷錯,也該算:不合題意!!

 而 Linux 的又不同!

2. 中文也要!中文以什麼為準? Big-5?UTF-8?還是別的?
 目前〝至少〞就有三大體系!
 做到死?
2009-05-07 2:46 pm
For Q1:
#include

int main()
{
int i;

printf("Please enter a number in hex: ");
scanf("%x", &i);
printf("%d\n", i);
}

2009-05-07 10:30:16 補充:
This one will give the fraction also:
#include

int main()
{
char str[256]="3a.88";
int i, j;
double d, e, f;
char a[256];
char b[256];
char ch=*str;

i = 0;
a[i] = str[i];
while ( a[i] != '.' ) {
i++;
a[i] = str[i];
}
a[i] = '\0';

2009-05-07 10:31:11 補充:
sscanf(a, "%x", &j);
d = (double) j;

j = 0;
i++;
e = 0.0;
while ( i != strlen( str )) {
b[j] = str[i];
j++;
i++;
}
b[j] = '\0';

j = 0;
f = 16;

2009-05-07 10:31:27 補充:
while ( b[j] != '\0' ) {
e += ((double) ( b[j] - '0' ))/ f;
f *= 16;
j++;
}
printf( "%f\n", d + e );
}
2009-05-07 6:17 am
我只知道第一提

告訴你想法

10轉16 你就把一個10近位的數字 一直除16取餘數,直到商變成0為止

你可以把餘數放入陣列裡,到時候再從後面往前面把它抓出來,這樣應該就可以了,如果大於9 10= A 11=B 這就是印出來你要判斷的。

如168 這個10進位數字

168/16 = 10 餘 8 拿商 10 在除 10 / 16 = 0 餘 10

這時商=0 就停止,然後往後面看回去168=A8


收錄日期: 2021-04-30 12:52:58
原文連結 [永久失效]:
https://hk.answers.yahoo.com/question/index?qid=20090506000016KK10001

檢視 Wayback Machine 備份