版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、工程八 枚舉和位運算【實驗內容、步驟】1、檢查所用計算機是否已經安裝Visual C+ 2021。2、進入Visual C+ 2021的工作環(huán)境。3、編程例如,觀察與驗證。輸入并運行下面的程序,分析運行結果。【任務實施】實驗8-1-1 枚舉類型元素引用例如源程序8-1-1:#include <stdio.h> void main( ) enum emem1=3,em2=1,em3; char *aa=“AA,BB,CC,DD; printf(“%s%s%sn,aaem1,aaem2,aaem3);C語言對枚舉的定義規(guī)定:在枚舉中聲明的各個枚舉元素,如果沒有明確指出某個枚舉元素的值,
2、它的上一個元素存在并有明確值的情況下,這個枚舉元素的值為其上一個元素的值+1。在實驗中,沒有明確說明枚舉元素em3的值,那么em3=em2+1=1+1=2,進而可知,在printf( )打印函數(shù)中,要打印的數(shù)組元素是aa3,aa1,aa2。所以運行結果如以下圖所示: 圖8-1-1 運行結果圖1注意:1、printf(“%s,em1)不能輸出字符串“em1。em1為常數(shù)值的別名,而不是字符串。 2、不能這樣定義枚舉類型:比方“enum em0,1,2;。那么假設要完整的打印出char *aa的賦值,我們就要修改源程序,大家注意觀察我們修改后的源程序到底和之前的有何區(qū)別。 圖8-1-1 修改后的源
3、程序2 修改后的源程序我們將得到對a的所有賦值,如以下圖所示。 圖8-1-1 修改后的運行結果圖3【任務考核】 實驗8-1-2 枚舉類型元素引用例如 #include<stdio.h> int main() enum colorred,black,yellow,blue,whitei,j,pa; int n=0,loop; for(i=red;i<=white;i+)for(j=red;j<=white;j+)n+=1;printf("%-3d",n);for(loop=1;loop <3;loop+)switch(loop)case 1:pa
4、=i;break;case 2:pa=j;break;switch(pa)case red:printf("%-10s","red");break;case black:printf("%-10s","black");break;case yellow:printf("%-10s","yellow");break;case blue:printf("%-10s","blue");break;case white:printf("
5、;%-10s","white");break;printf("n");printf("N:%dn",n);return 0;1運行結果:2程序中有無錯誤為什么?3運行結果為什么與修改后的程序結果一致?【典型例題】例8-1-3 枚舉類型例如源程序:#include <stdio.h>void main()typedef enum daysunday,monday,tuesday,wendsday,thursday,friday,stadurdayday;day today;today = monday;if (to
6、day = sunday | today = stadurday)printf(“休息日n);elseprintf(“工作日n);答案:工作日 圖8-1-3分析:我們在此實驗中發(fā)現(xiàn)一個有趣的表達式“day today;,根據我們所學的知識,我們知道enumdaysunday,monday,tuesday,wednesday,thursday,friday,saturday;這句定義了符號化的常量sunday,monday等等。在下面的程序中,可以聲明枚舉型變量day today,對其賦值,或者判斷它的值。而且聲明枚舉變量時,編譯器不必檢查變量中存儲的是否是合法的枚舉有效值,但枚舉變量那么提供了
7、檢查的時機。我們在編程過程中定義枚舉型的好處主要有二:首先增強程序可讀性,sunday、monday肯定比0、1容易理解。其次可以對變量類型與取值進行限定。枚舉型常量即某種枚舉型的合法取值。此例中,“sunday,monday,tuesday,wednesday,thursday,friday,saturday是枚舉型常量。在編譯時確定各個常量的對應值。枚舉型變量指的是聲明為已定義枚舉類型的變量。如此例中的today。用枚舉型常量定義變量,這個說法不太明確,其實包含了三個階段:一,定義一種枚舉類型;二,聲明某個變量為該枚舉類型;三,用枚舉型常量向該變量賦值。任務描述二 關于位運算應用實驗【實驗
8、目的】1、 加深對二進制的認識。2、 理解位運算的概念、各種位運算的功能和規(guī)那么,學會采用適當?shù)奈贿\算修改數(shù)據的某些位。3、 了解位段的概念和位段類型數(shù)據的引用形式。【根底知識】一、位運算位運算的運算分量只能是整型或字符型數(shù)據,位運算把運算對象看作是由二進位組成的位串信息,按位完成指定的運算,得到位串信息的結果。 位運算符有: &按位與、|按位或、按位異或、 按位取反。 其中,按位取反運算符是單目運算符,其余均為雙目運算符。 位運算符的優(yōu)先級從高到低,依次為、&、|。其中的結合方向自右至左,且優(yōu)先級高于算術運算符,其余運算符的結合方向都是自左至右,且優(yōu)先級低于關系運算符。 1按
9、位與運算符&按位與運算將兩個運算分量的對應位按位遵照以下規(guī)那么進行計算: 0&0=0,0&1=0,1&0=0,1&1=1。 即同為 1 的位,結果為 1,否那么結果為 0。 例如,設3的內部表示為 00000011 5的內部表示為 00000101 那么3&5的結果為 00000001 按位與運算有兩種典型用法,一是取一個位串信息的某幾位,如以下代碼截取x的最低7位:x& 0177。二是讓某變量保存某幾位,其余位置0,如以下代碼讓x只保存最低6位:x=x&077。以上用法都先要設計好一個常數(shù),該常數(shù)只有需要的位是1,不需要的位是0
10、。用它與指定的位串信息按位與。 2按位或運算符| 按位或運算將兩個運算分量的對應位按位遵照以下規(guī)那么進行計算: 0|0=0, 0|1=1, 1|0=1, 1|1=1 即只要有1個是1的位,結果為1,否那么為0。 例如,023|035 結果為037。 按位或運算的典型用法是將一個位串信息的某幾位置成1。如將要獲得最右4為1,其他位與變量j的其他位相同,可用邏輯或運算017|j。假設要把這結果賦給變量j,可寫成: j=017|j 3按位異或運算符 按位異或運算將兩個運算分量的對應位按位遵照以下規(guī)那么進行計算: 00=0, 01=1, 10=1, 11=0 即相應位的值相同的,結果為 0,不相同的結
11、果為 1。 例如: 013035結果為026。 異或運算的意思是求兩個運算分量相應位值是否相異,相異的為1,相同的為0。按位異或運算的典型用法是求一個位串信息的某幾位信息的反。如欲求整型變量j的最右4位信息的反,用邏輯異或運算017j,就能求得j最右4位的信息的反,即原來為1的位,結果是0,原來為0的位,結果是1。 4按位取反運算符 按位取反運算是單目運算,用來求一個位串信息按位的反,即哪些為0的位,結果是1,而哪些為1的位,結果是0。例如,7的結果為0xfff8。 取反運算常用來生成與系統(tǒng)實現(xiàn)無關的常數(shù)。如要將變量x最低6位置成0,其余位不變,可用代碼x=x& 077實現(xiàn)。以上代碼與
12、整數(shù)x用2個字節(jié)還是用4個字節(jié)實現(xiàn)無關。 當兩個長度不同的數(shù)據進行位運算時(例如long型數(shù)據與int型數(shù)據),將兩個運算分量的右端對齊進行位運算。如果短的數(shù)為正數(shù),高位用0補滿;如果短的數(shù)為負數(shù),高位用1補滿。如果短的為無符號整數(shù),那么高位總是用0補滿。 位運算用來對位串信息進行運算,得到位串信息結果。如以下代碼能取下整型變量k的位串信息的最右邊為1的信息位:(k-1)k)&k。 二、移位運算 移位運算用來將整型或字符型數(shù)據作為二進位信息串作整體移動。有兩個運算符: << 左移 和 >> 右移 移位運算是雙目運算,有兩個運算分量,左分量為移位數(shù)據對象,右分量的
13、值為移位位數(shù)。移位運算將左運算分量視作由二進位組成的位串信息,對其作向左或向右移位,得到新的位串信息。 移位運算符的優(yōu)先級低于算術運算符,高于關系運算符,它們的結合方向是自左至右。 1左移運算符<< 左移運算將一個位串信息向左移指定的位,右端空出的位用0補充。例如014<<2,結果為060,即48。 左移時,空出的右端用0補充,左端移出的位的信息就被丟棄。在二進制數(shù)運算中,在信息沒有因移動而喪失的情況下,每左移1位相當于乘2。如4 << 2,結果為16。 2右移運算符>> 右移運算將一個位串信息向右移指定的位,右端移出的位的信息被丟棄。例如12&
14、gt;>2,結果為3。與左移相反,對于小整數(shù),每右移1位,相當于除以2。在右移時,需要注意符號位問題。對無符號數(shù)據,右移時,左端空出的位用0補充。對于帶符號的數(shù)據,如果移位前符號位為0(正數(shù)),那么左端也是用0 補充;如果移位前符號位為1(負數(shù)),那么左端用0或用1補充,取決于計算機系統(tǒng)。對于負數(shù)右移,稱用0 補充的系統(tǒng)為“邏輯右移,用1補充的系統(tǒng)為“算術右移。以下代碼能說明讀者上機的系統(tǒng)所采用的右移方法: printf("%dnnn",-2>>4); 假設輸出結果為-1,是采用算術右移;輸出結果為一個大整數(shù),那么為邏輯右移。 移位運算與位運算結合能實現(xiàn)許
15、多與位串運算有關的復雜計算。設變量的位自右至左順序編號,自0位至15位,有關指定位的表達式是不超過15的正整數(shù)。以下各代碼分別有它們右邊注釋所示的意義: 0 << n /* 實現(xiàn)最低n位為1,其余位為0的位串信息 */ (x>>(1+p-n)&(0<<n) /*截取變量x自p位開始的右邊n位的信息*/ new |=(old>>row)&1)<<(15k) /*截取old變量第row位,并將該位信息裝配到變量new的第15-k位*/ s&=(1<<j) /*將變量s的第j位置成0,其余位不變*/ fo
16、r(j=0;(1<<j)&s)=0; j+); /*設s不等于全0,代碼尋找最右邊為1的位的序號j*/!為邏輯取反,表示非的意思,經過它處理后的結果為布爾型,要么為0,要么為1,!x,只要x不為0,1,2,3,都可以,那么!x的結果就是0,只有當x為0時,結果為1。如果*為真,那么!*為假,反之如果*為假,那么!*為真?!緦嶒瀮热荨⒉襟E】1、檢查所用計算機是否已經安裝Visual C+ 2021。2、進入Visual C+ 2021的工作環(huán)境。3、編程例如,觀察與驗證。輸入并運行下面的程序,分析運行結果。【任務實施】實驗8-2-1輸入并運行以下程序關于位、與、或的實驗,分析
17、程序運行結果。源程序8-2-1 # include <stdio.h> int main() int c,d,e; int a=6,b=12; c=a&b; d=ab; e=ab; printf(“%d&%d=%dn,a,b,c); printf(“%d%d=% dn,a,b,d); printf(“%d%d=%dn,a,b,e); return 0; 根據位、與、或的用法我們可以得出結果: 6&12=4 612=14 612=10接下來我們思考下,比方某駕校報名條件中有一條為年齡要求:學員年齡在1860之間,那么用邏輯與的關系表達那么應為:int a;.i
18、f ( 18 <= a && a <= 60) .用邏輯或的關系表達那么為:if ( 18 > a | a > 60) .然后再結合else if語句完成這一駕校的報名要求,并且分別輸出滿足的和不滿足條件的年齡。源程序如以下圖: 圖8-2-1 源程序圖1 我們運行源程序隨意輸入一些數(shù)字,得出如以下圖的答案。 圖8-2-1 運行結果圖2實驗8-2-2輸入并運行以下關于移位程序,分析程序運行結果。源程序8-2-2# include <stdio.h>int main() int a=6,b=10; int c,d; C=a>>1; D
19、=b<<3; printf(“%d,%dn,c,d); return 0;運行程序,我們得到的運行結果為:3,80小提示:如果是左移,補入的數(shù)全部是0;如果是右移,還與被移位的數(shù)據是否帶符號有關。假設是不帶符號數(shù),那么補入的數(shù)全部為0;假設是帶符號數(shù),那么補入的數(shù)全部等于原數(shù)的最左端位上的原數(shù)(即原符號位)。實驗8-2-3輸入并運行以下關于位操作程序,分析程序運行結果。源程序8-2-3 # include<stdio.h>struct packed_data unsigned a:3; unsigned b:4; unsigned:2; unsigned c:5; in
20、t i;data;int main() data.a=4; data.b=10; data.c=45; data.i=25; printf(“%d,%on ,data.c,data.c); return 0;運行源程序,我們可以得出運算結果為:13 ,15。我們仔細觀察源程序發(fā)現(xiàn):在程序中unsigned:2 ,和其他三個表達式是有區(qū)別的,這里大家注意:、位域可以無位域名,這時它只用來作填充或調整位置。無名的位域是不能使用的,程序在這里作對齊使用。位域不允許跨兩個字節(jié),因此位域的長度不能大于一個字節(jié)的長度,也就是說不能超過8位二進位?!救蝿湛己恕?. 編寫程序,取出一個16位二進制數(shù)的奇數(shù)位即
21、從左邊起第3,5,15位。2. 編寫程序,從終端讀入十六進制無符號整數(shù)m,將m中的原始數(shù)據循環(huán)右移n位,并輸出移位前后的內容。 【典型例題】例8-2-1以下運算符中優(yōu)先級最低的是( ),優(yōu)先級最高的是( )。 A&& B& C D 答案:C B 分析:此題主要考查C語言運算符的優(yōu)先級關系。例8-2-2表達式“0x13&0x17的值是( )。A0x17 B0x13 C0xf8 D0xec答案:B分析:將0x13和0x17轉換成對應的二進制數(shù)后按位進行與運算,再把結果轉換成十六進制數(shù),計算的結果為0x13。例8-2-3假設x=2,y=3,那么x&y的結果是(
22、 )。A0 B2 C3 D5答案:B分析:x對應的二進制位為0010,y對應的二進制位為0011,兩者按位與后的結果為0010,故對應的十進制數(shù)為2。例8-2-4表達式“0x130x17的值是( )。 A0x17 B0x13 C0xf8 D0xec答案:A 分析:將0x13和0x17轉換成對應的二進制數(shù)后,按位進行或運算,再把結果轉成十六進制數(shù),計算的結果為0x17。例8-2-5假設有定義“int a=4,b;,那么執(zhí)行“b=a<<2;后b的結果是( )。A4 B8 C16 D32答案:C分析:對于移位運算,左移一位相當于原數(shù)乘以2,右移一位相當于原數(shù)除以2。例8-2-6設有以下語
23、句,那么c的二進制數(shù)是( ),十進制數(shù)是( )。 char a=3,b=6,C; C=ab<<2; A00011011 B00010100C00011100D00011000 A. 27B20C28D24答案:A A分析:在一個表達式中出現(xiàn)和<<運算符時,應先計算<<再計算。例8-2-7以下表達不正確的選項是( )。A表達式“a&=b等價于“a=a&b B表達式“a=b等價于“a=abC表達式“a!=b等價于“a=a!B D表達式“a=b等價于“a= ab答案:C分析:“a!=b是一個關系表達式,不等價于“a=a!B。例8-2-8在位運算中運
24、算量每右移動一位,其結果相當于( )。A運算量乘以2 B運算量除以2C運算量除以4 D運算量乘以4答案:B分析:對于移位運算,左移一位相當于原數(shù)乘以2,右移一位相當于原數(shù)除以2。例8-2-9表達式“0x13的值是( )。A0xFFEC B0xFF71 C0xFF68 D0xFF17答案:A例8-2-10以下程序的運行結果是( )。# include <stdio. h>main() unsigned char a,b,c; a=0x3;b=a0x8;c=b<<1; printf(“%d,%dn,b,c); A-11,12 B-6,-13 C12,24 D11,22答案:
25、D分析:a對應的二進制數(shù)為011,與0x8進行按位或運算后,b的值為1011,對應十進制數(shù)為11,左移一位相當于原數(shù)乘以2,故c的值為22?!菊n后習題】一、選擇題在以下各題的A、B、C、D四個選項中,只有一個正確,請選出正確答案1以下運算符優(yōu)先級最高的是( )。A B C&& D*2運算符<<、sizeof、&=按優(yōu)先級由高到低的正確排列次序是( )。Asizeof、&=、<<、Bsizeof、<<、&=C、<<、sizeof、&=D<<、&=、sizeof3請選擇以下程序的執(zhí)行
26、結果。( ),( ),( )。 # include <stdio. h>main() int a=0234; char c=A; printf(“%on,a); printf(“%on,a&c); printf(“%on,ac); A177543B177C175437 D17543 A0 B1 C163 D24 A35 B335 C53 D5334整型變量x和y的值相等,且均為非0值,那么以下選項結果為零的表達式是( )。Axy Bxy Cx&y Dxy5以下程序的運行結果是( )。# include <stdio.h>void main() char
27、x=040; printf(“%on,x<<1); A100 B80 C64 D326enum color red,green,yellow=5,white,black;定義了一枚舉類型。值表中各標符的枚舉值依次為 A1、2、3、4、5 B0、1、5、2、3 C0、1、5、6、7 D3、4、5、6、77設有如下枚舉類型定義 enum language Basic=3, Assembly, Ada, C, Fortran;枚舉量C的值為A4 B5 C6 D7二、填空題1位運算是對運算量的 位進行運算。2位運算符只對 和 數(shù)據類型有效。3在6個位運算符中,只有 是需要一個運算量的運算符
28、。4按位異或的運算規(guī)那么是 。5C語言中的位運算符有 、 、 、 、>>和<<共6個。6以下程序段的輸出結果是 。 int x=-1; x=x0377; printf("%d,% xn,x,x);7設有一個整數(shù)a,假設要通過按位異或運算a-b使a的高8位翻轉,低8位不變,那么b的八進制數(shù)形式是_。8設二進制數(shù)a是00101101,假設想通過按位異或運算a-b使a的高4位取反,低4位不變,那么二進制數(shù)b應是 。9設有一個整數(shù)a,假設要通過a&b運算屏蔽掉a中的其他位,而只保存第2位和第8位,那么b的八進制數(shù)形式是 。10如果想使一個數(shù)a的低4位全改為1,需要a與 進行按位或運算。三、編程題1設計一個函數(shù),當給出一個數(shù)的原碼時,能得到該數(shù)的補碼。2編寫一個函數(shù),用它測定一個整數(shù)的最高位是0還是1,假設是0,那么輸出“正數(shù),否那么輸出“負數(shù)。3編寫一個函數(shù)getbits(),從一個16位單元中取出某幾位,即該幾位保存原值,其余位為0,位數(shù)由輸入者設定。 【任務考核答案】一、枚舉局部 實驗8-3 1運行結果: 2程序中有無錯誤為什
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 家具銷售合同范本
- 2024房產中介代理合同版
- 手機應用開發(fā)委托合同格式
- 員工借款協(xié)議書樣式
- 工地簡易用工合同范本參考
- 2024年建筑公司財務分析與優(yōu)化外包合同
- 新加坡衛(wèi)星電視節(jié)目合作委托協(xié)議書
- 2024年度BGL氣化爐耐火材料采購及安裝合同
- 施工合同條款合同違約及終止
- 2024云計算服務合同-提供高效計算資源
- DB31T 1295-2021 立體花壇技術規(guī)程
- 部編版《道德與法治》五年級上冊第10課《傳統(tǒng)美德 源遠流長》優(yōu)質課件
- 原發(fā)性骨髓纖維化課件
- 消防工程施工驗收單樣板
- 中央空調人員培訓內容表
- 發(fā)現(xiàn)生活中的美-完整版PPT
- 小學道德與法治人教三年級上冊第三單元安全護我成長-《遭遇陌生人》教案
- CAMDS操作方法及使用技巧
- 平狄克《微觀經濟學》(第8版)筆記和課后習題詳解
- 最優(yōu)化理論與算法課程教學大綱
- 2022年湖北省武漢市江岸區(qū)育才第二小學六上期中數(shù)學試卷
評論
0/150
提交評論