史萊姆論壇

返回   史萊姆論壇 > 專業主討論區 > 程式語言討論區
忘記密碼?
論壇說明

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


發文 回覆
 
主題工具 顯示模式
舊 2011-07-24, 04:45 AM   #1
bobo0836
註冊會員
榮譽勳章

勳章總數
UID - 347578
在線等級: 級別:0 | 在線時長:2小時 | 升級還需:3小時
註冊日期: 2011-07-12
文章: 6
精華: 0
現金: 8 金幣
資產: 8 金幣
預設 討論 - C語言,倒轉字串,有沒有更好的寫法?

題目是,由鍵盤輸入一個字串,將字串以前後顛倒的順序印出來,舉例來說,輸入的字串為"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;
}
bobo0836 目前離線  
送花文章: 2, 收花文章: 0 篇, 收花: 0 次
回覆時引用此帖
舊 2011-07-24, 10:05 AM   #2 (permalink)
管理員
 
getter 的頭像
榮譽勳章
UID - 6433
在線等級: 級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時
註冊日期: 2002-12-08
住址: 天線星球
文章: 8157
精華: 0
現金: 19955 金幣
資產: 765391 金幣
預設

問題點主要是在交換的方法,如頭尾交換法,泡沫交換法之類

泡沫交換法
語法:
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;
}
http://img819.imageshack.us/img819/7121/swap2.png



頭尾交換法
語法:
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;
}
http://img28.imageshack.us/img28/7124/swap1.png

此帖於 2011-07-24 11:06 AM 被 getter 編輯.
__________________
在「專業主討論區」中的問題解決後,要記得按一下 http://forum.slime.com.tw/images/stamps/is_solved.gif 按鈕喔,
這是一種禮貌動作。

一樣是在「專業主討論區」中發問,不管問題解決與否,都要回應別人的回答文喔。
不然搞 [斷頭文],只看不回應,下次被別人列入黑名單就不要怪人喔。

天線寶寶說再見啦~ ... 天線寶寶說再見啦~

迪西:「再見~ 再見~」

Otaku Culture Party 關心您 ...
getter 目前離線  
送花文章: 37855, 收花文章: 6441 篇, 收花: 26052 次
回覆時引用此帖
向 getter 送花的會員:
a471 (2011-07-26)
感謝您發表一篇好文章
舊 2011-07-24, 11:05 AM   #3 (permalink)
管理員
 
getter 的頭像
榮譽勳章
UID - 6433
在線等級: 級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時
註冊日期: 2002-12-08
住址: 天線星球
文章: 8157
精華: 0
現金: 19955 金幣
資產: 765391 金幣
預設

您的原始碼,迪西看不太懂,且迪西爛爛的 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++];
這個應該是使用 array 的顛倒複製方式吧 ...,有一個詭異的錯誤
就是會把 "\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 編輯.
getter 目前離線  
送花文章: 37855, 收花文章: 6441 篇, 收花: 26052 次
回覆時引用此帖
有 2 位會員向 getter 送花:
a471 (2011-07-26),bobo0836 (2011-07-25)
感謝您發表一篇好文章
舊 2011-07-25, 11:37 PM   #4 (permalink)
註冊會員
榮譽勳章

勳章總數
UID - 347578
在線等級: 級別:0 | 在線時長:2小時 | 升級還需:3小時
註冊日期: 2011-07-12
文章: 6
精華: 0
現金: 8 金幣
資產: 8 金幣
預設

謝謝getter,小弟以後會注意排版和註解,不過在下仍有一個疑問,程式碼如text[j]^=text[j+1]^=text[j]^=text[j+1];中^=是什麼意思?小弟找書上,好像找不到,煩請賜教!?
bobo0836 目前離線  
送花文章: 2, 收花文章: 0 篇, 收花: 0 次
回覆時引用此帖
舊 2011-07-26, 06:16 PM   #5 (permalink)
管理員
 
getter 的頭像
榮譽勳章
UID - 6433
在線等級: 級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時
註冊日期: 2002-12-08
住址: 天線星球
文章: 8157
精華: 0
現金: 19955 金幣
資產: 765391 金幣
預設

引用:
作者: bobo0836 查看文章
謝謝getter,小弟以後會注意排版和註解,不過在下仍有一個疑問,程式碼如text[j]^=text[j+1]^=text[j]^=text[j+1];中^=是什麼意思?小弟找書上,好像找不到,煩請賜教!?
那個是 C/C++ 的運算子符號 ...

語法:
運算元

一元運算子:
運算順序:無
 
++:遞增                     * :指標間接運算子             ! :邏輯運算-反向閘(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^=x^=y; 就能讓兩個英數字元互換的 ^= 是很久以前老是有次上課
講的 ... 剛好老師看到某位同學的程式碼用 ^= 來做英數字元互換,並做講解 ...

原本是這樣的
語法:
使用  ^=          一般變數交換
x^=y;             temp=a;
y^=x;             a=b;
x^=y;             b=temp;
結果,某天迪西異想天開改成一行 x^=y^=x^=y; 竟然可以用 ...

不過某些類型的資料或是某些 windows SP 環境下 ^= 字元互換 會怪怪的 ...
導致資料或結果不正確 ...

至於使用變數的方式就沒辦法一行化了 ...,不過變數的話依類型宣告,結果
會很穩定的。

此帖於 2011-07-26 07:18 PM 被 getter 編輯.
getter 目前離線  
送花文章: 37855, 收花文章: 6441 篇, 收花: 26052 次
回覆時引用此帖
舊 2011-08-13, 02:47 AM   #6 (permalink)
註冊會員
榮譽勳章
UID - 257587
在線等級: 級別:9 | 在線時長:124小時 | 升級還需:16小時級別:9 | 在線時長:124小時 | 升級還需:16小時級別:9 | 在線時長:124小時 | 升級還需:16小時級別:9 | 在線時長:124小時 | 升級還需:16小時
註冊日期: 2006-11-20
文章: 26
精華: 0
現金: 16 金幣
資產: 16 金幣
預設

題目是 "由鍵盤輸入一個字串,將字串以前後顛倒的順序印出來"

PHP 語法:
#include<stdio.h>
#include<stdlib.h>

char *move_to_end(char *ptrint *len){
    *
len 0;
    while(*
ptr != '\0'){
        
ptr++;
        (*
len)++;
    }
    return 
ptr;
}

void reverse_print(char *ptrint len){
    while(
len 0){
        
ptr--;
        
len--;
        
printf("%c", *ptr);
    }
}

int main (void)
{
    
char a[100], *ptr;
    
int len;

    
printf("Input a string:");
    
gets(a);

    
ptr move_to_end(a, &len);
    
printf("The string length is %d\n"len);
    
printf("The result is \"");
    
reverse_print(ptrlen);
    
printf("\"\n");
    
system("pause");
    return 
0;

wenneng 目前離線  
送花文章: 2, 收花文章: 7 篇, 收花: 8 次
回覆時引用此帖
向 wenneng 送花的會員:
getter (2011-09-09)
感謝您發表一篇好文章
發文 回覆



發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用

相似的主題
主題 主題作者 討論區 回覆 最後發表
有沒有可以上傳圖片,設計好的網頁? 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


所有時間均為台北時間。現在的時間是 09:56 PM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1