• 4

新手詢問C語言的問題II

我個人的"想法"
把字都存到str[]裡面
用ASCII碼來處理大小寫
if(str[i]<91) //如果是大寫
去對應的word[]陣列++;
esle //不是大寫就是小寫
去對應的word[]陣列++ ;

然後用一個一維陣列去儲存出現的次數
word[0] 存A和a得出現次數
word[1] 存B和b得出現次數
word[2] 存C和c得出現次數
以此類推... 感覺這樣比較節省空間
(不知道我這樣講有沒有錯 如果有錯請指教XD)


順帶一提我個人比較龜毛 我會先檢查使用者輸入的東西 是不是"純字母"
box59453 wrote:
不考慮用我最上面那篇...(恕刪)


真是不錯的做法 !

原型:extern int toupper(int c);

用法:#include <ctype.h>

功能:将字符c转换为大写英文字母

说明:如果c为小写英文字母,则返回对应的大写字母;否则返回原来的值。


jeff00716 wrote:
我個人的"想法"
把...(恕刪)


運用了 toupper 就不用分大小寫了!

關於防呆的輸入當然是一定要的啦!
傻綠班的鴿 8:17 ━━━━━━━━●━━━ 14:50 ⇆ㅤㅤㅤㅤ◁ㅤㅤ❚❚ㅤㅤ▷ㅤㅤㅤㅤ↻
大家的C語言都好厲害,不過不知道能幫到樓主什麼....
與失敗為伍者,天天靠盃都是別人的錯。 與成功為伍者,天天跟失敗切磋直到不再出錯。
daniel35 wrote:
int b[26],i;
for(i=0;i<26;i++)
b[i]=0;


初始化b的值可以不用這麼麻煩
只要在宣告的部份改一下....

int b[26] = {0}, i;
後面的for迴圈就可以免了
這樣不是簡單多了嘛
ASCII中的'A~Z'其實就是0x41~0x5a,'a~z'就是0x61~0x7a,所以答案很明顯了...

char input[MAX_BUF] = {0};
int result[26] = {0};

fgets(input, MAX_BUF, stdin);

for (i = 0; i < MAX_BUF; i++)
result[(input[i] & 0x1f) - 1]++;

第二個問題用幾個MOD就可以完成。

注意:以上程式只用來表示概念,沒防呆。
box59453大大的方法
在C語言上的說法是"拿空間換取時間"
利用記憶體規劃來做INDEX

這樣在速度上是最快的,不過是最浪費記憶體的方法


#include<stdio.h>

int main()
{
int str_arr[26]={0},i=1;
char s[100];

scanf("%s",&s);

for(i=0;s[i]!='\0';i++)
{
if(s[i]>=97)
str_arr[s[i]-97]++;
else
str_arr[s[i]-65]++;
}

for(i=0;i<26;i++)
{
if(str_arr[i]!=0)
printf("\n%c 有 %d 個",i+65,str_arr[i]);
}
}


太久沒有寫了,總覺得怪怪的,應該這樣就完成了
馬赫迪 wrote:
box59453大大...(恕刪)

會嗎? 人家有減65耶...

audiofan wrote:

會嗎? 人家有減...(恕刪)


如果是用投票計數的方法,只要記錄出現的數字就好了,不用每一個字母都要開一個陣列元素



第二題要考慮到像

"IX"=9
"IV"=4
"XC"=90
這才是最難的吧
馬赫迪 wrote:
如果是用投票計數的方法,只要記錄出現的數字就好了,不用每一個字母都要開一個陣列元素

不太懂耶,不就是26個整數嗎? 請指教...
如果是我
我也是抓ASCII去找有幾個(0x41~0x5a和0x61~0x7x然後在累加0~25)
然後再用迴圈去輸出
例如說
看A有幾個就直接顯示出來
要是都沒有就不要輸出
不要再存在陣列裡面了
只是會用到幾個變數而已
這樣就可以省記憶體空間
寫法有很多種
有省空間也有省時間的
省時間的就是
直接用26個陣列存(不分大小寫的話)
然後再把輸入的存進去相對位置
A就放第0個
B就放第1個
最後再把陣列全部輸出就好
這樣做的次數就會比較少
-----------------------------------------分隔線-----------------------------------------
以上只是我在喇咧而已XD
不要砲轟我啊~~XD
  • 4
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?