『壹』 在c語言中ch是什麼意思
ch是字元變數,即char變數。
ch-'a'就是用ch的ascii碼值,減去'a'的ascii碼值。
這種寫法,一般是ch是小寫字母,即'a'~'z'之間時,通過這種計算,獲取ch是第幾個英文字元
『貳』 C語言 scanf("%4c",&ch); ch是char類型 問%4c在這里有什麼意義
scanf("%4c",&ch);
這種寫法用gcc編譯,運行情況確實如書上所說。但我用VC++ 2010編譯,運行時報錯。所以,這種寫法不提倡。
那%4c有什麼意義呢?對上面的寫法沒有任何意義,但它有其它用處:
char buf[5] = {0};
scanf("%4c",buf);
這會讓用戶輸入4個字元,不能多也不能少。
讀取後放到buf中,因為scanf不附加『\0』到buf中,所以初始化時加『\0』。
有很多固定字元個數的情況,比如學號、身份證號等等。
『叄』 救命啊:用C語言編程「任意輸入一行英文字母,統計出其中英文字母的個數 」怎麼弄
#include <stdio.h>
void main()
{
char c;
int letter=0;
printf("請輸入一行字元:\n");
while((c=getchar())!='\n')
{
if(c>='a'&&c<='z'||c>='A'&&c<='Z')
letter++;
}
printf("英文字母的個數:%d\n",letter);
}
『肆』 c語言編程問題!!
1.編程在一個已知字元串中查找最長單詞,假定字元串中只含有字母和空格,空格用來分割不同單詞!
方法一:
//VC++ 6.0 編譯通過
#include
void main()
{
char str[]="hello world my name is xun yi cao !!";
char*p=str,*p1;
int max=0,count=0,i;
while(*p)
{
count=0;
while(*p==' ')p++;
while(*p!=' '&&*p)
{//一定要注意這里的判斷 *p!=0 也要判斷,不然到了最後一個單詞時,它一直向後面加,直到碰見空格,所以會超界。
p++;
count++;
}
if(max<count)
{
max=count;
p1=p-count;
}
}
printf("the largest number is :%d \n",max);
printf("the largest word is : ");
while(*p1!=' '&&*p1) //這里也要判斷*p1!='\0',因為如果最長的單詞在字元串的末尾的話,如果不判斷*p1!='\0',也會過界。
{
putchar(*p1);
p1++;
}
putchar('\n');
}
/*
求字元串中最長的單詞。要注意的是:如果在一個循環A 裡面還有循環B 的話。那麼不僅在循環B裡面要保證,數組不過界。
而且要要保證在循環A裡面數組也不過界。就像上面的例子一樣。現給出一個更容易理解的例子。
while(*p)
{
while(*p!=' '&&*p)
{
p++;
}
}
雖然外循環和內循環在循環條件上沒有什麼必然的聯系,但是對於一個數組的指針而言(如果以變數下標的
形式來訪問數組的話,下標的加減也要引起注意),它的加減也要引起注意,必須要保證不能過界。
*/
方法二:
//VC++ 6.0 編譯通過。
#include
#include
void main()
{
char str[]=" I am a student";
char*p=str,Array[10][20]={0};
int i=0,j=0,max=0;
while(*p)
{
while(*p==' ')*p++;
while(*p&&*p!=' ')
{
Array[i][j++]=*p;
p++;
}
i++;j=0;
}
i=0;
max=strlen(Array[i]);
p=Array[i];
while(strlen(Array[i]))
{
if(max<strlen(Array[i]))
{
max=strlen(Array[i]);
p=Array[i];
}
i++;
}
printf("%d\n%s\n",max,p);
}
/*
求字元串中最長的單詞(不能分辨含非字母字元的單詞),採用的是二維數組的形式判斷的。
定義了一個二維數組,它的每一個元素用來存放一個字元串(每個被分離後的單詞)。
再判斷最長的那個。
這中方法對比第一種方法來說,思路更清晰一些。但是缺點就是要分配一個二維的數組來存放被分離後的每個
單詞,佔用存儲空間。
*/
2.編寫實現任意十進制數,轉換成r進制數(r在2到16之間)
轉換為二進制:
//VC++ 6.0編譯通過
#include
#include
void main()
{
int a,b[30],i;
scanf("%d",&a);
for(i=0;a!=0;i++)
{
b[i]=a%2;
a=a/2;
}
for(--i;i>=0;i--)
{
printf("%d",b[i]);
}
putchar('\n');
}
//關於二進制的轉換,還可以用位移運算符。通過和某一個數如1相按位與,就得到它的二進
制最低位,在位移,再得到二進制最低位,依此類推。
轉換為8進制:
/VC++ 6.0編譯通過。
#include
#include
void main()
{
int a,b[20],i;
scanf("%d",&a);
for(i=0;a!=0;i++)
{
b[i]=a%8;
a=a/8;
}
for(--i;i>=0;i--)
{
printf("%d",b[i]);
}
putchar('\n');
}
/*
轉換為8進制就沒有16進制那麼麻煩了,它不需要另外定義一個字元數組用來存放,進制的
所有基數了,而是直接輸出來就可以了。而對與16進制還要存放他的基數。從0到F
*/
轉換為16進制:
//VC++ 6.0 下編譯通過
#include
#include
void main()
{
int a,b[20],i,base=16;
char X[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
scanf("%d",&a);
for(i=0;a!=0;i++)
{
b[i]=a%base;
a=a/base;
}
for(--i;i>=0;i--) //開始有一個 --i
{
int j=b[i];
printf("%c",X[j]);
}
printf("\n");
}
/*
一般把其它進制的數轉換為十進制的數較容易,有一個現成的乘法公式供我們使用。
但把十進制的數轉換為其它進制的數,則要用到除法。這題的思路是比較清晰的,應該是
解決這類問題的典型演算法了。
而對於把十進制的數轉換為二進制的數來說,除了用到除法外,還可用位運算。
這個問題主要是這兩句話值得理解:
b[i]=a%base;
a=a/base;
我們一般是用這兩句循環使用來得到一個整數的各位的數字,這也恰巧說明了,我們得到
一個整數的各個位數所用到的方法,正是把一個十進制的數轉換為一個 "十進制" 數的演算法
也就是我們得到一個十進制數的各個位的數字的過程,實際上就是求把他轉換為一個十進制
的數字的過程(雖然這里本身沒必要在轉換,因為本身它就已經是一個十進制數了)。用同樣
的道理可以推算把十進制數轉換為其他進制數的過程,和這個是類似的。
然後將後得到的結果先輸出,而先取余數得到的結果則在數字的最後面,在低位。
*/
通用解決方案:
#include
#include
void main()
{
int a[10]={0,1,2,9,10,5,12,7,8,15};
for(int i=9;i>=0;i--)
{
if(a[i]>=10)
switch(a[i])
{
case 10: printf("%c",'A');break;
case 11: printf("%c",'B');break;
case 12: printf("%c",'C');break;
case 13: printf("%c",'D');break;
case 14: printf("%c",'E');break;
case 15: printf("%c",'F');break;
}
else
printf("%d",a[i]);
}
}
/*
其實進制轉換的演算法我們都知道,就是用我們要轉換的那個數,對進制的基數(如果是16進制)
進行取余,把取余的結果保存在一個數組裡面,再對他取整重新賦值,也就是丟掉余數部分,
相當於取上一步的商,再取余,再取整。如此循環,直到為0。
其實上面的演算法,只要我們想起把一個十進制的數轉換為二進制的數的計算方法,就不難理解,
因為都是相通的。
現在關鍵是,如果我的這些事情都做好了,也就是余數都放在一個數組里了,現在要做的就是
把數組逆序輸出就ok了。那麼如果是二進制或八進制,我們只要直接輸出就可以了,但是如果是
一個十六進制的話,就不能這樣了,也就是如果數組裡面有一個元素是14,那麼我就不能原樣輸出
了,此時必須輸出E,因為E就是十六進制裡面的基數,而且也是與十進制的14相對應的。但是如果
是一個二進制或者是一個八進制的話,就可以直接輸出,因為數組裡面的數都是0,1(對二進制)
或者(0....8),這些數就是二進制和八進制的基數。
所以這里要面臨的問題就是,在輸出一個整數的時候,如果這個整數滿足某一條件,就輸出什麼字
符的問題,例如:如果這個整數等於14則輸出'E'字元。
當然我們可以用 if..else 語句來判斷,對於十六進制的數特殊的字元也就只有A,B,C,D,E,F六個
用 if...else 來判斷也不算太煩瑣。當然我們還可以用 switch 來判斷,這樣更加有條理。代碼
也更清晰。
當然這是對於16進制的數來說的,我們可以這樣判斷,但是如果實際生活中遇到的問題和這個有點
類似,而且字母有多的話,用條件判斷或switch就太煩瑣了,代碼也不直觀,還容易出錯。
那麼這時我們可以在定義一個字元數組,分別放我們要輸出的字元,如果有以下對應的關系:
10 A
11 B
12 C
13 D
14 E
15 F
16 G
17 H
18 I
19 J
也就是說在數組a裡面放的是數字,在數組b裡面放的是字元,要求數組a裡面的數字是10的時候,輸
出'A',而不是輸出10,依次類推(看上面的對應關系),當然我上面的對應關系都是順序的,其實也
可以不是順序的,對於數字和字元都可以是亂的,當然這要看實際遇到的問題是什麼樣的了。如果
對上面的問題還用if...else來判斷的話,那未免太煩瑣。所以我們定義一個字元數組來專門存放
字元。那麼怎麼讓數字和字元聯系起來呢,怎麼讓a[i]的值是10的時候就輸出'A'而是14的時候就輸
出'E'呢,在這里我們可以這樣定義b數組:
char b[30]={0};
b[10]='A';
b[11]='B';
b[12]='C';
b[13]='D';
b[14]='E';
...
b[19]='J';
這樣也就是說當a[i]元素的值是10時,就輸出b[10],是11就輸出b[11];這樣就和數字對應起來
了。我們可以這樣用:
int t=a[i];
printf("%c",b[t]); a[i]的值是多少,我們就輸出b[多少]
但對於上面舉的例子來說,可以這樣:
if(a[i]>=10&&a[i]<=19) //對應關系是連續的,才可以這樣判斷
{
int t=a[i];
printf("%c",b[t]);
}
else
{
printf("%d",a[i]);//如果不屬於定義的對應的特殊字元,就原樣輸出。
}
當然了,上面的是對應的連續的情況,對與10進制與二進制,8進制,16進制之間的轉換,都是連續的情況。
如果對應的是不連續的情況,那有該怎麼辦呢:
20 'A'
25 'B'
30 'D'
50 'G'
53 'H'
58 'C'
100 'Z'
200 'W'
對於上面的情況,是一點規律性也沒有的,而且如果為了這幾個數就去定義一個200個元素的數組,實在是
有點劃不來。所以如果是上面這種情況,就沒有比較好的辦法了。只用用判斷語句了,當然如果有20多個
字元的對應關系的話,判斷語句也是不合適的,那麼就沒有比較好的辦法了。還要進一步探索....
*/
這些都是我在考計算機等級考試碰到過的題目哦,演算法都是相當典型的,有的是書上看到的,有的是自己擴展的。還是要自己認真哦。。。
由於文字太多第三題提交不上來了哦。。不好意思。。。
『伍』 C語言中ch的意思
char說明數據類型是字元型,ch是變數名(可稱為欄位)。
fgetc() 使用舉例:
在D盤下創建demo.txt文件,輸入任意內容並保存,運行程序,就會看到剛才輸入的內容全部都顯示在屏幕上。
該程序的功能是從文件中逐個讀取字元,在屏幕上顯示,直到讀取完畢。
程序第14行是關鍵,while 循環的條件為(ch=fgetc(fp)) != EOF。fget() 每次從位置指針所在的位置讀取一個字元,並保存到變數 ch,位置指針向後移動一個位元組。當文件指針移動到文件末尾時,fget() 就無法讀取字元了,於是返回 EOF,表示文件讀取結束了。