![]() |
|
論壇說明 |
歡迎您來到『史萊姆論壇』 ^___^ 您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的! 請點擊這裡:『註冊成為我們的一份子!』 |
![]() ![]() |
|
主題工具 | 顯示模式 |
![]() |
#1 |
註冊會員
|
![]() 題目是,由鍵盤輸入一個字串,將字串以前後顛倒的順序印出來,舉例來說,輸入的字串為"Hello",輸出即為"olleH"以下是小弟打的程式碼,請問有沒有更好的寫法?煩請賜教!謝謝!!!
語法:
#include <stdio.h> #include <stdlib.h> int my_strlen(); int main (void) { char a[100]; char b[100]; int i=0; int j; int l; gets(a); l = my_strlen(a); printf("字串長=%d\n",l); while (l >= 0) b[l--] = a[i++]; for(j=0;j<=my_strlen(a);j++) { printf("%c",b[j]); } printf("\n"); system("pause"); return 0; } int my_strlen(char *a) { int i=0; while(i>=0) { if(a[i]=='\0') break; else i++; } i++; return i; } |
![]() |
送花文章: 2,
![]() |
![]() |
#2 (permalink) |
管理員
![]() ![]() |
![]() 問題點主要是在交換的方法,如頭尾交換法,泡沫交換法之類
泡沫交換法 語法:
int main(int argc, char *argv[]) { char text[100]=""; int tlen,i,j; clrscr(); printf("\n泡沫交換法\n\n"); printf("\n請輸入一串的英數文字: "); gets(text); printf("\n字串長度 : %d \n",strlen(text)); printf("交換前 : %s \n",text); //字串顛倒 : 泡沫交換法 tlen=strlen(text); for (i=0;i<tlen-1;i++) for (j=0;j<tlen-1-i;j++) text[j]^=text[j+1]^=text[j]^=text[j+1]; printf("交換後 : %s \n\n",text); pause(); return 0; } ![]() 頭尾交換法 語法:
int main(int argc, char *argv[]) { char text[100]=""; int tlen,i; clrscr(); printf("\n頭尾交換法\n\n"); printf("\n請輸入一串的英數文字: "); gets(text); printf("\n字串長度 : %d \n",strlen(text)); printf("交換前 : %s \n",text); //字串顛倒 : 頭尾交換法 tlen=strlen(text); for (i=0;i<tlen/2;i++) text[i]^=text[tlen-1-i]^=text[i]^=text[tlen-1-i]; printf("交換後 : %s \n\n",text); pause(); return 0; } ![]() 此帖於 2011-07-24 11:06 AM 被 getter 編輯. |
__________________ 在「專業主討論區」中的問題解決後,要記得按一下 ![]() 這是一種禮貌動作。 ![]() 一樣是在「專業主討論區」中發問,不管問題解決與否,都要回應別人的回答文喔。 不然搞 [斷頭文],只看不回應,下次被別人列入黑名單就不要怪人喔。 天線寶寶說再見啦~ ... 天線寶寶說再見啦~ 迪西:「再見~ 再見~」 『 Otaku Culture Party 』 關心您 ... ![]() |
|
![]() |
送花文章: 37855,
![]() |
向 getter 送花的會員:
|
![]() |
#3 (permalink) |
管理員
![]() ![]() |
![]() 您的原始碼,迪西看不太懂,且迪西爛爛的 DEV-C 無法編譯
重新整理排版過您的原始碼之後 ... 語法:
#include <stdio.h> #include <stdlib.h> int my_strlen(char *a); int main(void) { char a[100],b[100]; int i,j,l; printf("\n請輸入字串 :"); gets(a); l = my_strlen(a); //判斷字串長度 printf("\n字串長=%d\n",l); i=0; while (l >= 0) b[l--] = a[i++]; for (j=0;j<=my_strlen(a);j++) printf("%c",b[j]); printf("\n\n"); system("pause"); return 0; } int my_strlen(char *a) { int i=0; while (i>=0) { if(a[i]=='\0') break; else i++; } i++; return i; } 發現幾個怪怪的地方 1. 語法:
i=0; while (l >= 0) b[l--] = a[i++]; 就是會把 "\0" 給複製到前面去,當用 printf ("%s") 的標準化格 式顯示時,就會顯示不出來 ...,這是很明顯的邏輯錯誤,程式碼 乍看之下是對的但,實際運作是錯得,因此後面不得已只好用字元 列印的方式印出來 語法:
for (j=0;j<=my_strlen(a);j++) printf("%c",b[j]); 因此正確的作法式,在測量字串的長度時,要把 "\0" 字串結尾要排除 計算 ... 語法:
int my_strlen(char *a) { int i=0; while (i>=0) { if(a[i]=='\0') break; else i++; } //i++; 據迪西的推測,這一行是補"\0" 字串結尾,拿掉即可 return i; } 簡單的說就是,當程式在處理字串的內容時 "\0" 的字串結尾要先排除 最後補在字串的最後面表示字串的結束。 2. Function 的宣告,若是要把 Function 程式碼,放到 main 後面 則一定要這樣宣告,而不是 int my_strlen(); ,連同那個 () 裡面 的也要有 int my_strlen(char *a); ,不然某些編輯器容易出錯... ,正確如下: Function a (XXX); main() { ------ } Function a (XXX) { ------ } 或是 Function a (XXX) { ------ } main() { ------ } 3. 那個抓字串長度的方式,寫得很好,不過依據正確的說法多算了 "/0" 的字元結尾,所以錯了,可以用 strlen 字串長度的量測指令,該指令在 string.h 中,需要 #include <string.h> 第一次修改的如下: 語法:
#include <stdio.h> #include <stdlib.h> int my_strlen(char *a); int main(void) { char a[100],b[100]; int i,j,l; printf("\n請輸入字串 :"); gets(a); l = my_strlen(a); //判斷字串長度 printf("\n字串長 : %d\n",l); i=0; l-=1; //C & C++ 語言的 array 是從 0 開始,如長度 6 則須 -1,因為 0~5 while (l >= 0) //array 的反向複製 b[l--] = a[i++]; //與 b[i++] = a[l--]; 相同 b[i]='\0'; // 補上字串的結尾 //for (j=0;j<=my_strlen(a);j++) 因為修正成標轉化的格式後,可以省略 // printf("%c",b[j]); 因為修正成標轉化的格式後,可以省略 printf("交換前 : %s \n",a); printf("交換後 : %s \n\n",b); system("pause"); return 0; } int my_strlen(char *a) { int i=0; while (i>=0) { if(a[i]=='\0') break; else i++; } //i++; 據迪西的推測,這一行是補"\0" 字串結尾,拿掉即可 return i; } 第二次使用 strlen 函數式的修改的如下: 語法:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char a[100],b[100]; int i,j,l; printf("\n請輸入字串 :"); gets(a); l = strlen(a); //判斷字串長度 printf("\n字串長 : %d\n",l); i=0; l-=1; //C & C++ 語言的 array 是從 0 開始,如長度 6 則須 -1,因為 0~5 while (l >= 0) //array 的反向複製 b[l--] = a[i++]; //與 b[i++] = a[l--]; 相同 b[i]='\0'; // 補上字串的結尾 printf("交換前 : %s \n",a); printf("交換後 : %s \n\n",b); system("pause"); return 0; } 此帖於 2011-07-24 11:31 AM 被 getter 編輯. |
![]() |
送花文章: 37855,
![]() |
![]() |
#5 (permalink) | |
管理員
![]() ![]() |
![]() 引用:
語法:
運算元 一元運算子: 運算順序:無 ++:遞增 * :指標間接運算子 ! :邏輯運算-反向閘(not) --:遞減 & :求記憶體位址 ~ :求 1 的補數 - :負數 + :正數 sizeof:佔用記憶體的大小(運算順序:--) 二元運算子: 運算順序:由左至右 + :加 - :減 * :乘 / :除 % :餘數 ( 模數 ) <<:左偏移 >>:右偏移 > :大於 < :小於 >=:大於等於 <=:小於等於 ==:邏輯(判斷式)等於 !=:不等於 & :位元運算-及閘(AND) | :位元運算-或閘(OR)+ ^ :位元運算-互斥或閘(XOR) &&:邏輯運算-及閘(AND) ||:邏輯運算-或閘(OR) 運算順序:由右至左 = :指定為 +=:遞增等於 -=:遞減等於 *=:遞乘等於 /=:遞除等於 %=:遞除餘數等於 <<=:左偏移等於 >>=:右偏移等於 &=:位元運算-及閘等於(AND) !=:位元運算-或閘等於(OR) ^=:位元運算-互斥或閘等於(XOR) 例: [ A=A+B = A+=B ] ; [ A=A-B = A-=b ] ; [ A=A*B = A*=B ] ; [ A=A/B = A/=B ] 三元運算子: ? ::條件運算( A>B? printf("\nA big"): printf("\nB bing");) 講的 ... 剛好老師看到某位同學的程式碼用 ^= 來做英數字元互換,並做講解 ... 原本是這樣的 語法:
使用 ^= 一般變數交換 x^=y; temp=a; y^=x; a=b; x^=y; b=temp; 不過某些類型的資料或是某些 windows SP 環境下 ^= 字元互換 會怪怪的 ... 導致資料或結果不正確 ... 至於使用變數的方式就沒辦法一行化了 ...,不過變數的話依類型宣告,結果 會很穩定的。 此帖於 2011-07-26 07:18 PM 被 getter 編輯. |
|
![]() |
送花文章: 37855,
![]() |
![]() |
#6 (permalink) |
註冊會員
|
![]() 題目是 "由鍵盤輸入一個字串,將字串以前後顛倒的順序印出來"
PHP 語法:
|
![]() |
送花文章: 2,
![]() |
向 wenneng 送花的會員:
|
![]() ![]() |
|
|
![]() |
||||
主題 | 主題作者 | 討論區 | 回覆 | 最後發表 |
有沒有可以上傳圖片,設計好的網頁? | f6617 | 一般電腦疑難討論區 | 4 | 2004-10-26 10:54 AM |
有沒更好的國語英文切換方式? | latenight | 一般電腦疑難討論區 | 0 | 2004-02-23 07:24 PM |
有沒有好的php討論區? | turnoff | 一般電腦疑難討論區 | 2 | 2003-08-04 06:22 PM |
請問一下HD有沒有比較好的散熱方法~~ | 大米 | 硬體疑難使用問題討論區 | 13 | 2003-04-06 07:20 PM |