• 4

新手詢問C語言的問題II

1.輸入10個字元,輸出共有多少個A,B,C,…Z。
例:輸入ADAaEVSzaZ
輸出 A:4, D:1, E:1, S:1, V:1, Z:2 (ps.大小寫視為相同)

2.輸入一數字,以羅馬數字的方式輸出。(羅馬數字中M﹦1000, D=500,C﹦100,L=50,X=10,V=5,I=1)

第一題我的想法是用一個a[10]的陣列,輸入字元後,用if用判斷,然後用26個計數器分別計數,可是感覺沒什麼效率很笨的感覺?還是我的想法有誤?

第二題假設輸入數字是1234,就除以1000,做計數,剩下的餘數再除500,做計數,是這樣子嗎?
2008-10-02 15:09 發佈
我認為是...

寫程式靠的是自己的思考 跟 經驗

所以既然都有想法了 怎麼不做做看呢

做出來了 就代表方法是對的

很多問題 其實都照自己的想法作出來直接去跑 程式就會給你答案了

跑來這問人 不是很沒效率嗎

我光看你一二題的思考就知道 你其實已經知道怎麼解題了

那既然知道 去跑跑不就知道嚕

就我個人的學習經驗 要問人的時機只有 1.沒頭緒卡住了 2.語法盲目

如果有想法 就先做 先試 試了出不來就改 在這修修改改的過程中 學的東西

會比其他人直接給答案 學的還多 而且記憶會很深

作都還沒做就先問 我個人覺得 這樣學程式設計 會學不好的

因為到真的要寫程式當成工作的時候

人家只會給你一個需求而已 怎麼寫 怎麼實作 都是靠自己想的
daniel35 wrote:
第一題我的想法是用一個a[10]的陣列,輸入字元後,用if用判斷,然後用26個計數器分別計數,可是感覺沒什麼效率很笨的感覺?還是我的想法有誤?...(恕刪)


這樣子是最直接的.

小弟會用陣列來做計數 countnum[int toupper(a[ i ]) - 65] ++;
第一題如果要快一點

也可以用陣列存

一開始把字串逐一分析

如果是a 就在 陣列 [0] +1 如果是b 就在陣列[1] +1 z就陣列[25]

10個都弄好就把陣列印出來 就可以了
假設字串10個字已經放入陣列A,若要不管大小寫,則使用既有字串函數將字串統一為大寫或小寫再放入陣列。

for(i=1 to 10)
{
if (A[i]==' ') continue; //若為空白就跳過
temp=1; //計數器歸一
for(j=i to 10)
if (A[i]==A[j]) { //若有相同則暫存值+1 且相同字元清除
temp++;A[j]=' ';
}
printf(" %c=%d ",A[i],temp); //輸出結果
}

ps.十幾年沒碰C語言了...語法細節沒記得那樣清楚,但是演算法是邏輯推論的東西反而不會遺忘,多思考就有多想法。

這個想法是類似於最基本的氣泡排序法,只是沒有調動前後順序,反而是統計與刪除相同數值。拿資料自己與相同的資料去比對,如果相同就將計數器加一,同時清除該資料,這樣可以節省第二輪比對時間與避免錯誤統計。這個方式程式執行速度會與內容有關,內容相同越多,執行迴圈就越少速度越快。而且不用浪費記憶體空間(現在寫程式還有人在乎嗎),邊執行邊輸出。
下面是我依照我的邏輯寫出來的原始碼,可是計數的部分好像只會加在A[0]這個位置,輸出的時候會是10,0,0,0,0....

#include<stdio.h>
#include<stdlib.h>
main()
{
char a[10];
int b[26],i;
for(i=0;i<26;i++)
b[i]=0;
for(i=0;i<10;i++)
{
printf("輸入字元%d:\n",i+1);
scanf("%s",&a[i]);
}
for(i=0;i<10;i++)
{
if(a[i]=='A'||'a')
b[0]+=1;
else if(a[i]=='B'||'b')
b[1]+=1;
else if(a[i]=='C'||'c')
b[2]+=1;
else if(a[i]=='D'||'d')
b[3]+=1;
else if(a[i]=='E'||'e')
b[4]+=1;
else if(a[i]=='F'||'f')
b[5]+=1;
else if(a[i]=='G'||'g')
b[6]+=1;
else if(a[i]=='H'||'h')
b[7]+=1;
else if(a[i]=='I'||'i')
b[8]+=1;
else if(a[i]=='J'||'j')
b[9]+=1;
else if(a[i]=='K'||'k')
b[10]+=1;
else if(a[i]=='L'||'l')
b[11]+=1;
else if(a[i]=='M'||'m')
b[12]+=1;
else if(a[i]=='N'||'n')
b[13]+=1;
else if(a[i]=='O'||'o')
b[14]+=1;
else if(a[i]=='P'||'p')
b[15]+=1;
else if(a[i]=='Q'||'q')
b[16]+=1;
else if(a[i]=='R'||'r')
b[17]+=1;
else if(a[i]=='S'||'s')
b[18]+=1;
else if(a[i]=='T'||'t')
b[19]+=1;
else if(a[i]=='U'||'u')
b[20]+=1;
else if(a[i]=='V'||'v')
b[21]+=1;
else if(a[i]=='W'||'w')
b[22]+=1;
else if(a[i]=='X'||'x')
b[23]+=1;
else if(a[i]=='Y'||'y')
b[24]+=1;
else
b[25]+=1;
}
for(i=0;i<26;i++)
{
printf("%d\n",b[i]);
}
system("PAUSE");
}

daniel35 wrote:
下面是我依照我的邏輯...(恕刪) if(a[i]=='A'||'a')


應該要寫成 if(a[i]=='A' || a[i]=='a') 吧?
的確是這樣,改掉後程式就可以正常的計算了,謝謝
daniel35 wrote:
的確是這樣,改掉後程...(恕刪)



不考慮用我最上面那篇的寫法?一行就解決了, 不用做一堆 if 判斷式了。
box59453大大的寫法比較有效率..
if指令遇到程式很大時就會有差了


  • 4
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?