c語言內涵教程練習6
❶ c語言教程的內容是
C語言學習從入門到精通的一套經典視頻教程,本課程通過高清晰的視頻、概念詳解、實例精講、習題測試讓你很快的掌握C語言的相關知識,並領略運用到實例中去。在針對一些用戶認為C語言比較難學的情況下,本課程從初中級用戶的角度出發,進行合理的內容安排,突出學、練、用、鞏固相結合的特點,以通俗易懂的語言,豐富多彩的實例,詳細介紹了使用C語言進行程序開發應該掌握的各方面知識。本課程主要給大家講解了C語言概述,演算法,數據類型,運算符與表達式,常用的數據輸入、輸出函數,選擇結構程序設計,循環控制,數組,函數,指針,結構體和共用體,位運算,預處理,模塊化編程,編程規范,C語言常見問題及分析,習題測試等內容。所有知識都結合具體實例進行介紹,涉及的程序代碼給出了詳細的講解,可以使讀者輕松領會C語言程序開發的精髓,快速提高開發技能。
課程內容詳盡,實例豐富,非常適合作為單片機及編程初學者的學習課程,也可作為大中院校相關專業在校學生及畢業生的教學輔導課程、短期C語言培訓課程,是C語言編程愛好者從入門到深入的經典課程。
課程共分為15講,每節課的內容大綱如下:
第1課 C語言概述
1、幾種常見的程序設計語言
2、C語言出現的歷史背景
3、C語言的特點
4、簡單的C程序介紹
5、C程序的上機步驟
6、習題測試
第2課 程序的靈魂-演算法
1、程序設計過程
2、演算法的基本概念
3、演算法的特徵
4、演算法的表示方法(流程圖)
5、結構化程序設計方法
6、習題測試
第3課 C語言的數據類型
1、預備知識
2、C語言的數據類型
3、常量與變數
4、不同數據類型之間的轉換
5、運算符號和表達
6、習題測試
第4課 C語言順序程序設計
1、C語句概述
2、賦值語句
3、數據的輸入輸出
4、字元數據輸入輸出
5、格式輸入輸出
6、順序程序舉例
7、習題測試
第5課 C語言選擇程序設計
1、關系運算符和關系表達式
2、邏輯運算符和邏輯表達式
3、if 語句---條件判斷
4、條件運算符
5、switch 語句
6、選擇程序舉例
7、習題測試
第6課 C語言的循環控制
1、概述
2、goto語句及與if語句構成循環
3、while語句
4、do …while語句
5、for語句
6、循環的嵌套
7、幾種循環的比較
8、break語句和contiune語句
9、程序舉例
10、習題測試
第7課 C語言數組
1、一維數組
2、二維數組及多維數組
3、字元數組和字元串
4、程序舉例
5、習題測試
第8課 函數
1、概述
2、函數定義的一般格式
3、函數的返回值
4、函數的調用
5、函數參數及其傳遞方式
6、函數的嵌套與遞歸調用
7、數組作為函數參數
8、變數的存儲屬性
9、內部函數和外部函數
10、習題測試
第9課 C語言預處理命令
1、編譯預處理
2、宏定義
3、文件包含
4、條件編譯
5、習題測試
第10課 指針
1、指針的概念
2、指針變數
3、指針與數組
4、指針與字元串
5、指針與函數
6、返回指針值的函數
7、指針數組和多級指針
8、習題測試
第11課 結構體與共用體
1、結構類型與結構變數的定義
2、結構變數的引用與初始化
5、結構數組
6、指向結構類型數據的指針
7、用指針處理鏈表
8、共用體
9、枚舉類型
10、用typedef定義別名
11、程序舉例
12、習題測試
第12課 位運算
1、位運算概述
2、位運算符的使用方法
3、習題測試
第13課 單片機C語言的模塊化編程
1、模塊化編程的優點
2、C語言源文件(*.c)文件和頭文件(*.h)的的作用
3、模塊化編程設計步驟
4、程序實例
5、模塊化程序的移植
6、習題測試
第14課 C語言編程規范
1、編碼規范概述
2、編程排版規范
3、編程注釋規范
4、命名規則
5、可讀性規范
6、變數與結構規范
7、函數與過程規范
8、編程效率規范
9、質量保證規范
10、宏規范
11、代碼編輯
12、編譯
13、審查
14、代碼測試
15、維護
16、習題測試
第15課 C語言編程常見出錯問題及分析
1、C語言的一些基本概念
2、位(bit)和位元組(byte)
3、變數和數據存儲
4、數據文件
5、字元串操作
6、數組
7、指針和內存分配
8、函數
9、編譯預處理
10、標准庫函數
11、系統調用
12、可移植性
13、編程風格和標准
14、程序的編寫和編譯
15、調試
❷ 求C語言習題
您好,習題如下:
1、C語言的源文件需經過編譯、連接,生成可執行文件後方可運行。( )
2、C語言中,實參的個數、類型和位置必須與形參的定義一一對應。( )
3、C語言中,數組元素的下標是從1開始的,下標不能越界。( )
4、C語言源程序經過編譯後生成的文件是.obj文件,經過連接後生成的文件為.exe文件。( )
5、對於表達式x>y>z;在C中可以這樣表示:(x>y)AND(y>z);。( )
6、putchar函數的作用是從終端輸出一個字元。( )
7、增1(或自增)、減1(或自減)運算都是雙目運算符。( )
8、整數在存儲時不會產生誤差,實數在存儲時也不會產生誤差。( )
9、C語言中,用char只能定義字元變數,不能定義字元串變數。( )
10、函數的遞歸調用不過是一個函數直接地調用它自身。( )
❸ 求C語言教程
我給你電子文檔筆記吧~~
復制來的....
第一章 概述
1. C語言的特點
①語言簡潔、緊湊,使用方便、靈活。共有32個關鍵字,9種控制語句。
②運算符豐富,公有34種運算符。
③數據結構豐富,數據類型有:整型、實型、字元型、數組、指針、結構體、共用體等。
④具有結構化的控制語句(如if…else、while、do…while、switch、for)
⑤語法限制不太嚴格,程序設計自由度大。
⑥允許直接訪問物理地址,能進行位(bit)操作,可以直接對硬體操作。
⑦生成目標代碼質量高,程序執行效率高。
⑧可移植性好。
2. C語言的用途
C雖不擅長科學計算和管理領域,但對操作系統和系統實用程序以及對硬體進行操作方面,C有明顯的優勢。現在很多大型應用軟體也用C編寫。
Top of Page
第二章 數據類型、運算符與表達式
1. C的數據類型
C的數據類型包括:整型、字元型、實型或浮點型(單精度和雙精度)、枚舉類型、數組類型、結構體類型、共用體類型、指針類型和空類型。
2. 常量與變數
常量其值不可改變,符號常量名通常用大寫。變數其值可以改變,變數名只能由字母、數字和下劃線組成,且第一個字元必須為字母或下劃線。否則為不合法的變數名。變數在編譯時為其分配相應存儲單元。
3. 整型數據
整型常量的表示方法:十進制不用說了,八進制以0開頭,如0123,十六進制以0x開頭,如0x1e。
整型變數分為:基本型(int)、短整型(short int)、長整型(long int)和無符號型。不同機器上各類數據所佔內存位元組數不同,一般int型為2個位元組,long型為4個位元組。
4. 實型數據
實型常量表示形式:十進制形式由數字和小數點組成(必須有小數點),如:0.12、.123、123
0.0等。指數形式如123e3代表123×10的三次方。
實型變數分為單精度(float)和雙精度(double)兩類。在一般系統中float型佔4位元組,7位有效數字,double型佔8位元組,15~16位有效數字。
5. 字元型數據
字元變數用單引號括起來,如'a','b'等。還有一些是特殊的字元常量,如'\n','\t'等。分別代表換行和橫向跳格。
字元變數以char 來定義,一個變數只能存放一個字元常量。
字元串常量是由雙引號括起來的字元序列。這里一定要注意'a'和"a"的不同,前者為字元常量,後者為字元串常量,c規定:每個字元串的結尾加一個結束標志'',實際上"a"包含兩個字元:'a'和''。
6. 數值型數據間的混合運算
整型、字元型、實型數據間可以混合運算,運算時不同類型數據要轉換成同一類型再運算,轉換規則:
char,short -> int -> unsigned -> long -> double <- float
7. 運算符和表達式
c運算符包括:
算數運算符( + - * / % )
關系運算符( > < == >= <= != )
邏輯運算符( ! && || )
位運算符( << >> ~ | ^ & )
賦值運算符( = )
條件運算符( ? : )
逗號運算符( , )
指針運算符( * & )
求位元組數( sizeof )
強制類型轉換(類型)
分量運算符( . -> )
下標運算符( [ ] )
其它運算符( 如函數調用運算符( ) )
自增自減運算符( ++ -- )注意:++i和i++的不同之處,++i使用i之前先使i加1,i++使用i之後,使i加1。
逗號表達式的求解過程:先求解表達式1,再求解表達式2,整個表達式的值是表達式2的值。
Top of Page
第三章 最簡單的c程序設計
1.c的9種控制語句:
if() ~ else~
for()~
while()~
do~while()
continue
break
switch
goto
return
程序的三種基本結構:順序結構,選擇結構,循環結構
2.數據輸出
c語言不提供輸入輸出語句,輸入輸出操作是由c的庫函數完成。但要包含頭文件stdio.h。
putchar( ) 向終端輸出一個字元
printf( )的格式字元:
① d格式符 用來輸出十進制整數
%d 按整型數據的實際長度輸出
%md 使輸出長度為m,如果數據長度小於m,則左補空格,如果大於m,則輸出實際長度
%ld 輸出長整型數據
② o格式符 以八進制形式輸出整數
③ x格式符 以十六進制形式輸出整數
④ u格式符 用來輸出unsigned型數據,以十進制形式輸出
⑤ c格式符 用來輸出一個字元
⑥ s格式符 輸出一個字元串
%s 輸出實際長度字元串
%ms 輸出的串佔m列,如果串長度小於m,左補空格,如果大於m,實際輸出
%-ms輸出的串佔m列,如果串長度小於m,右補空格,
%m.ns 輸出佔m列,但只取字元串中左端n個字元並靠右對齊
%-m.ns m、n含義同上,靠左對齊,如果n>m,則m自動取n值
⑦ f格式符 以小數形式輸出實數
%f 整數部分全部輸出,小數部分輸出6位
%m.nf 輸出數據共佔m列,其中有n位小數。如果數值長度小於m,左補空格
%-m.nf 同上,右補空格
⑧ e格式符 以指數形式輸出實數
%e 系統指定6位小數,5位指數(e+002 )
⑨ g格式符 輸出實數,根據數值大小,自動選f格式或e格式
3.數據輸入
getchar( ) 從終端輸入一個字元
scanf( 格式控制,地址列表) 標准C scanf中不使用%u,對於unsigned型數據,以%d或%o或%x輸入。%後的*,用來跳過它相應的數據。輸入數據時不能規定精度如scanf( "%7.2f", &a );是不合法的。
Top of Page
第四章 邏輯運算和判斷選取控制
1. 關系運算符:
c提供6種關系運算符(> < <= >= == != )前四種優先順序高於後兩種。
2. If語句
C提供了三種形式的if語句
If(表達式) 語句
If(表達式) 語句1 else 語句2
If(表達式1) 語句1
Else if(表達式2) 語句2
…
else 語句n
3. 條件運算符
(a>b)?a:b 條件為真,表達式取值a,否則取值b
4. Switch語句
Switch(表達式)
{
case 常量表達式1:語句1; break;
case 常量表達式2:語句2; break;
…
case 常量表達式n:語句n; break;
default :語句n+1;
}
Top of Page
第五章 循環控制
1. 幾種循環語句
goto語句(現已很少使用)
while語句 先判斷表達式後執行語句
do-while語句 先執行語句後判斷表達式
for語句
2. Break語句和continue語句
Break語句用於跳出循環,continue用於結束本次循環。
Top of Page
第六章 數組
1. 一維數組
c規定只有靜態存儲(static)和外部存儲(extern)數組才能初始化。給數組初始化時可以不指定數組長度。
2. 二維數組
3. 字元數組
部分字元串處理函數
puts(字元數組) 將一個字元串輸出到終端。
gets(字元數組) 從終端輸入一個字元串到字元數組,並且得到一個函數值,為該字元數組的首地址
strcat(字元數組1,字元數組2) 連接兩個字元數組中的字元串,數組1必須足夠大。
Strcpy(字元數組1,字元串2) 將字元串2拷貝到字元數組1中。
Strcmp(字元串1,字元串2) 比較字元串,相等返回0,字元串1>字元串2,返回正數,小於返回負數。
http://www.vstudycn.com
Strlen(字元數組) 求字元串長度。
Strlwr( 字元串) 將字元串中的大寫字母轉換成小寫
Strupr( 字元串) 將字元串中的小寫字母轉換成大寫
以上是一些比較常用的字元串處理函數。
Top of Page
第七章 函數
1. 關於形參和實參的說明
① 在函數被調用之前,形參不佔內存
② 實參可以是常量、變數或表達式
③ 必須指定形參的類型
④ 實參與形參類型應一致
⑤ 實參對形參的數據傳遞是"值傳遞",即單向傳遞
2. 函數返回值
如果想讓函數返回一個值,在函數中就要用return語句來獲得,在定義函數時也要對函數值指定類型,如果不指定,默認返回整型。
3. 函數調用
1)注意在函數調用時實參和形參的個數、類型應一一對應。對實參表求值的順序是不確定的,有的系統按自左至右,有的系統則按自右至左的順序。這一點要注意。
2)函數調用的方式:函數語句,函數表達式,函數參數
3)如果主調函數和被調函數在同一文件中,並且主調函數在前,那麼一般要在主調函數中對被調函數進行說明。除非:(1)被調函數的返回值類型為整型或字元型(2)被調函數出現在主調函數之前。
4)對函數的說明和定義是不同的,定義是指對函數功能的確立,包括指定函數名,函數值類型,形參及其類型、函數體等。說明則只是對已定義的函數返回值類型進行說明,只包括函數名、函數類型以及一個空的括弧,不包括形參和函數體。
5)c語言允許函數的遞歸調用(在調用一個函數的過程中又出現直接或間接的調用該函數本身)。
4. 數組作為函數參數
1)數組元素作為函數參數 和一般變數相同
2)數組名作參數應該在主調和被調函數分別定義數組,形參數組的大小可以不定義。注意:數組名作參數,不是單向傳遞。
3)多維數組作參數,在被調函數中對形參數組定義時可以省略第一維的大小說明,但不能省略第二維或更高維的說明。
5. 局部變數和全局變數
從變數作用域角度分,變數可分為局部變數和全局變數。
1)內部變數(局部變數)
在一個函數內定義,只在函數范圍內有效的變數。
2)外部變數(全局變數)
在函數外定義,可以為本文件其它函數所共用,有效范圍從定義變數的位置開始
到本文件結束。建議盡量少使用全局變數,因為它在程序全部執行過程中都佔用
資源,而且使函數的通用性降低了。如果在定義外部變數之前的函數要想使用該
外部變數,則應在該函數中用extern作外部變數說明。
6. 動態存儲變數與靜態存儲變數
從變數值存在的時間(生存期)角度來分,可分為靜態存儲變數和動態存儲變數。靜態存儲指在程序運行期間給變數分配固定的存儲空間,動態存儲指程序運行期間根據需要動態的給變數分配存儲空間。
C語言中,變數的存儲方法分為兩大類:靜態存儲類和動態存儲類,具體包括:自動的(auto),靜態的(static),寄存器的(register),外部的(extern)。
1) 局部變數的存儲方式
函數中的局部變數如不作專門說明,都之auto的,即動態存儲的,auto可以省略。局部變數也可以定義為static的,這時它在函數內值是不變的。靜態局部變數如不賦初值,編譯時系統自動賦值為0,動態局部變數如不賦初值,則它的值是個不確定的值。C規定,只有在定義全局變數和局部靜態變數時才能對數組賦初值。為提高執行效率,c允許將局部變數值放在寄存器中,這種變數叫register變數,要用register說明。但只有局部動態變數和形式參數可以作為register變數,其它不行。
2) 全局變數的存儲方式
全局變數在函數外部定義,編譯時分配在靜態存儲區,可以在程序中各個函數所引用。多個文件的情況如何引用全局變數呢?假如在一個文件定義全局變數,在別的文件引用,就要在此文件中用extern對全局變數說明,但如果全局變數定義時用static的話,此全局變數就只能在本文件中引用了,而不能被其它文件引用。
3) 存儲類別小結
從作用域角度分,有局部變數和全局變數
局部變數:自動變數,即動態局部變數(離開函數,值就消失)
靜態局部變數(離開函數,值仍保留)
寄存器變數(離開函數,值就消失)
(形參可定義為自動變數和寄存器變數)
全局變數:靜態全局變數(只限本文件引用)
全局變數(允許其它文件引用)
從存在的時間分,有靜態存儲和動態存儲
動態存儲:自動變數(本函數內有效)
寄存器變數(本函數內有效)
形參
靜態存儲:靜態局部變數(函數內有效)
靜態全局變數(本文件內有效)
全局變數(其它文件可引用)
從變數值存放的位置分
靜態存儲區:靜態局部變數
靜態全局變數
全局變數
動態存儲區:自動變數和形參
寄存器內:寄存器變數
7. 內部函數和外部函數
內部函數:只能被本文件中的其它函數調用,定義時前加static,內部函數又稱靜態函數。
外部函數:可以被其它文件調用,定義時前加extern,如果省略,則隱含為外部函數,在需要調用此函數的文件中,一般要用extern說明。
Top of Page
第八章 預編譯處理
c編譯系統在對程序進行通常的編譯之前,先進行預處理。c提供的預處理功能主要有以下三種:1)宏定義 2)文件包含 3)條件編譯
1. 宏定義
不帶參數的宏定義
用一個指定的標識符來代表一個字元串,形式:#define 標識符 字元串
幾點說明:
1) 宏名一般用大寫
2) 宏定義不作語法檢查,只有在編譯被宏展開後的源程序時才會報錯
3) 宏定義不是c語句,不在行末加分號
4) 宏名有效范圍為定義到本源文件結束
5) 可以用#undef命令終止宏定義的作用域
6) 在宏定義時,可以引用已定義的宏名
帶參數的宏定義
定義形式:#define 宏名(參數表) 字元串
這和函數有些類似,但他們是不同的:
1) 函數調用時,先求實參表達式值,再代入形參,而宏只是簡單替換,並不求值
2) 函數調用是在程序運行時分配內存的,而宏展開時並不分配內存,也沒有返回值的概念
3) 對函數中的實參和形參都要定義類型,而且要求一致,宏名無類型,其參數也沒有類型。
4) 函數只有一個返回值,而宏可以得到幾個結果
5) 宏替換不佔運行時間,只佔編譯時間,而函數調用占運行時間
2. 文件包含處理
#include "文件1" 就是將文件1的全部內容復制插入到#include位置,作為一個源文件進行編譯。
在#include命令中,文件名可以用" "也可以用< >,假如現在file1.c中包含file2.h文件," "表示系統先在file1.c所在目錄中找file2.h,如果找不到,再按系統指定的標准方式檢索目錄,< >表示系統直接按指定的標准方式檢索目錄。所以用" "保險一點。
3. 條件編譯
條件編譯指不對整個程序都編譯,而是編譯滿足條件的那部分。條件編譯有以下幾種形式:
1)#ifdef 標識符
程序段1
#else
程序段2
#endif
它的作用:當標識符在前面已經被定義過(一般用#define),則對程序段1編譯,否則對程序段2編譯。
2)#ifndef 標識符
程序段1
#else
程序段2
#endif
它的作用和#ifdef相反,當標識符沒被定義過,對程序段1編譯,否則對程序段2編譯。
3)#if 表達式
程序段1
#else
程序段2
#endif
它的作用:當表達式值為真(非0)時,對程序段1編譯,否則對程序段2編譯。
Top of Page
第九章 指針
指針說白了就是地址。指針變數就是用來存放指針(地址)的變數。
1. 變數的指針和指向變數的指針變數
讀起來很拗口,說白了就是變數的地址和用來存放變數地址的地址變數。因為一個變數在編譯的時候系統要為它分配一個地址,假如再用一個變數來存放這個地址,那麼這個變數就叫做指向變數的指針變數,也就是用來存放變數地址的這么一個變數。所謂"指向"就是指存放××的地址,如指向變數的指針變數,"指向"就是指用來存放變數的地址,再如指向數組的指針變數,"指向"就是指存放數組的地址。只要理解了這個,指針也就不難了。另外,還有指向字元串的指針變數,指向函數的指針變數,指向指針的指針變數等。
1) 指針變數的定義
形式:類型標識符 *標識符 如:int *pointer;
要注意兩點:*表示pointer是個指針變數,在用這個變數的時候不能寫成*pointer, *pointer是pointer指向的變數。一個指針變數只能指向同一個類型的變數。如上面
pointer只能指向int型變數。
2)指針變數的引用
兩個有關的運算符:
& 取地址運算符 &a 就代表變數a的地址
* 指針運算符 *a 就代表變數a的值
2. 數組的指針和指向數組的指針變數
數組的指針指數組的起始地址,數組元素的指針指數組元素的地址。
1)指向數組元素的指針變數的定義與賦值
定義和指向變數的指針變數定義相同,c規定數組名代表數組的首地址,即第一個數組元素地址。
2)通過指針引用數組元素
我們通常引用數組元素的形式是a[i],如果用指針可以這樣引用,*(a+i),或定義一個指針變數p,將數組a的首地址賦給p,p=a;然後用*(p+i)引用。
注意:指針變數p指向數組a首地址,則p++指向數組a的下一元素地址,即a[1]的地址。
3)數組名作函數參數
形參數組和實參數組之間並不是值傳遞,而是共用同一段地址,所以在函數調用過程中如果形參的值發生變化,則實參的值也跟著變化。
4)指向多維數組的指針和指針變數
以二維數組為居多。假設定義了一個二維數組a[3][4],那麼
a代表整個二維數組的首地址,也代表第0行的首地址,同時也是第0行第0列的元素的首地址。a +0和a[0]代表第0行首地址,a+1和a[1]代表第一行的首地址。
假設a是一個數組的首地址,那麼如果a是一維的,a+I代表第I個元素的地址,如果a是二維的,則a+I代表第I行的首地址。
那麼第一行第二列的元素地址如何表示呢?a[1]+2或&a[1][2]或*(a+1)+2。
我們只要記住:在二維數組中a代表整個數組的首地址,a[I]代表第I行的首地址,a[I]與*(a+I)等價就行了。只要運用熟練了就沒什麼復雜的了。
5)指向由m個整數組成的一維數組的指針變數
如:int (*p)[4],p是一個指向包含4個元素的一維數組,如果p先指向a[0],則p+1指向a[1],即p的增值是以一維數組的長度為單位的,這里是4,舉個例子:
假設a[3][4]=,p先指向a[0]也就是數組a的首地址,那麼p+1就是a[1]的首地址即元素9的地址,因為在定義p時int (*p)[4],定義一維數組長度為4,所以p+1就等於加了一個一維數組的長度4。
3. 字元串的指針和指向字元串的指針變數
1)字元串的表示形式
c中字元串有兩種表示形式:一種是數組,一種是字元指針
char string[]="I love c!";
char *str="I love c!";
其實指針形式也是在內存中開辟了一個數組,只不過數組的首地址存放在字元指針變數str中,千萬不要認為str是一個字元串變數。
2)字元串指針作函數參數
實際上字元串指針就是數組的首地址。
3)字元指針變數與字元數組的區別
① 字元數組由若干元素組成,每個元素存放一個字元,而字元指針變數只存放字元串的首地址,不是整個字元串
② 對數組初始化要用static,對指針變數不用。
③ 對字元數組賦值,只能對各個元素賦值,不能象下面這樣:
char str[14];
str="I love c!";
對指針變數可以,
char *str;
str="I love c!";
注意:此時賦給str的不是字元,而是字元串首地址。
④ 數組在定義和編譯時分配內存單元,而指針變數定義後最好將其初始化,否則指針變數的值會指向一個不確定的數.
嘎嘎。。。就這么多啦~~
❹ c語言習題6-2 使用函數求特殊a串數列和
你這個C語言編譯器不支持函數重載,也就是不要先聲明函數原型,先寫函數,從前面幾個報錯可以看出
後面2個說你忽略scanf的返回值,也就是要你處理用戶亂輸入的情況,可以不用管
❺ 求練習題答案,戴特爾著 c語言大學教程 第六版
哎,我也是跟樓主同求,買了這本書,其他都好,就是沒答案……
❻ 誰能幫找C語言基礎習題
C語言實驗參考答案
實驗一
5、輸入並運行自已編寫的程序(教材第一章P14 三 編程題)。
實驗二
1、編寫一個程序,從鍵盤接收3個實數(分別為10.0、20.0、5.0),輸出這3個數的和s、乘積t和平均值a。
#include <stdio.h>
main()
{float x,y,z,s,t,a;
printf(「x,y,z=」);
scanf(「%f,%f,%f」,&x,&y,&z);
s=x+y+z;
t=x*y*z;
a=s/3;
printf(「s=%f,t=%f,a=%f\n」,s,t,a);
}
2、編程。要求用戶輸入兩個整數a、b(分別為20、10), 讀取用戶從鍵盤輸入的值,然後:
1)用整數輸出這兩個數的和、差;
2)用長整型輸出這兩個數的積,用float輸出商;
3)用整數輸出這兩個數的余數,用float輸出平均值。
#include <stdio.h>
main()
{int a,b,he,cha,yu;
long ji;
float shang,aver;
printf(「a,b=」);
scanf(「%d,%d」,&a,&b);
he=a+b;
cha=a-b;
ji=(long)a*b;
shang=1.0*a/b;
yu=a%b;
aver=(a+b)/2.0;
printf(「a+b=%d,a-b=%d,a*b=%ld\n」,he,cha,ji);
printf(「a/b=%f,a%%b=%d,aver=%f\n」,shang,yu,aver);
}
實驗三
1、編寫一個程序,從鍵盤接收一個一位的整型數,經轉換,用字元函數putchar輸出。例如,輸入整數5,程序運行後輸出字元5。
#include <stdio.h>
main()
{int a;
char c;
printf(「a=」);
scanf(「%d」,&a);
c=a+48;
putchar(c);
}
2、編程。輸入半徑,計算球體表面積( )和球體積 ( )。
#include <stdio.h>
#define PI 3.1415926
main()
{float r,s,v;
printf(「r=」);
scanf(「%f」,&r);
s=4*PI*r*r;
v=4/3.0*PI*r*r*r;
printf(「s=%f,v=%f\n」,s,v);
}
3、編寫一個程序,要求通過鍵盤給6個變數賦值,然後將變數的值在屏幕上列印輸出。這六個變數的值分別為:10,-10,40000,a,3.14,hello。
#include <stdio.h>
main()
{int a,b;
long c;
char d,ch[6];
float e;
scanf(「%d,%d,%ld,%c,%f,%s」,&a,&b,&c,&d,&e,ch);
printf(「%d,%d,%ld,%c,%f,%s\n」,a,b,c,d,e,ch);
}
實驗四
1、輸入三個整數,分別存放到變數a,b,c中,試編程輸出其中的最小值。
#include <stdio.h>
main()
{int a,b,c,min;
printf(「a,b,c=」);
scanf(「%d,%d,%d」,&a,&b,&c);
min=a>b?(b>c?c:b):(a>c?c:a);
printf(「min=%d\n」,min);
}
2、輸入一個字元,如是大寫字母,則輸出相應小寫字母;如是小寫字母,則輸出相應大寫字母;其它字元原樣輸出 。(例如:輸入F,輸出f,輸入b,輸出B,輸入7,輸出7)。
#include <stdio.h>
main()
{char c,ch;
c=getchar();
ch=c;
if(c>=『A』&&c<=『Z』)
ch=c+32;
if(c>=『a』&&c<=『z』)
ch=c-32;
putchar(ch);
}
實驗五
1、函數
。
⑴用條件表達式求函數值y。
⑵用if語句編程,輸入x,輸出y,並給出你所使用的測試用例。
解(1)
#include <stdio.h>
main()
{int y;
float x;
printf(「x=」);
scanf(「%f」,&x);
y=x>0?1:(x==0?0:-1);
printf(「y=%d\n」,y);
}
解(2)
#include <stdio.h>
main()
{int y;
float x;
printf(「x=」);
scanf(「%f」,&x);
if(x>0)
y=1;
else if(x==0)
y=0;
else
y=-1;
printf(「y=%d\n」,y);
}
2、試編程輸入成績cj(cj為整型變數),如果cj的值在[100,90]內輸出A,在(90,80]內輸出B,在(80,70]內輸出C,在(70,60]內輸出D,在(60,0]內輸出E,其它輸出錯誤信息。請使用if語句和switch語句分別實現。
解(1)
#include <stdio.h>
main()
{int cj;
printf(「cj=」);
scanf(「%d」,&cj);
if(cj>=90&&cj<=100)
printf(「A\n」);
else if(cj>=80&&cj<90)
printf(「B\n」);
else if(cj>=70&&cj<80)
printf(「C\n」);
else if(cj>=60&&cj<70)
printf(「D\n」);
else if(cj>=0&&cj<60)
printf(「E\n」);
else
printf(「輸入錯誤\n」);
}
解(2)
#include <stdio.h>
main()
{int cj,n;
printf(「cj=」);
scanf(「%d」,&cj);
n=(cj>=0)+(cj>=60)+(cj>=70)+(cj>=80)+(cj>=90)+(cj>100);
switch(n)
{case 5:printf(「A\n」);break;
case 4:printf(「B\n」); break;
case 3:printf(「C\n」); break;
case 2:printf(「D\n」); break;
case 1:printf(「E\n」); break;
default:printf(「輸入錯誤\n」);
}
}
實驗六
1、編程:輸出200以內所有能被7整除的數。
#include <stdio.h>
main()
{int i;
for(i=0;i<=200;i+=7)
printf(「%4d」,i);
}
2、從鍵盤輸入n個數(n<10),找出其中最小值,請編寫相應程序。
#include <stdio.h>
main()
{int n,i,a,min;
printf(「n=」);
scanf(「%d」,&n);
for(i=1;i<=n;i++)
{scanf(「%d」,&a);
if(i==1)min=a;
if(min>a)min=a;
}
printf(「min=%d」,min);
}
3、鍵盤輸入正整數m和n(m<n),計算m~n之間所有奇數之和x與偶數之和y,請編程實現。
#include <stdio.h>
main()
{int m,n,i,x1=0,x2=0;
printf(「input m,n(m<n):」);
scanf(「%d,%d」,&m,&n);
for(i=m;i<=n;i++)
if(i%2==1)x1+=i;
else x2+=i;
printf(「x1(奇數之和)=%d,x2(偶數之和)=%d\n」,x1,x2);
}
實驗七
1、列印出所有的"水仙花數",所謂的"水仙花數"是指一個3位數,其各位數字的立方和等於該數本身。例如,153是一個"水仙花數",因為有153=1*1*1+5*5*5+3*3*3 。
解(1)
#include <stdio.h>
main()
{int a,b,c,n;
for(a=1;a<=9;a++)
for(b=0;b<=9;b++)
for(c=0;c<=9;c++)
{n=100*a+10*b+c;
if(n==a*a*a+b*b*b+c*c*c)
printf(「%d\n」,n);
}
}
解(2)
#include <stdio.h>
main()
{int a,b,c,n;
for(n=100;n<=999;n++)
{a=n/100;
b=n%100/10;
c=n%10;
if(n==a*a*a+b*b*b+c*c*c)
printf(「%d\n」,n);
}
}
2、請分別用三種循環結構編程計算: 1!+2!+3!+...+n! , n的值由鍵盤輸入。
解(1)
#include <stdio.h>
main()
{int n,i;
long p=1,sum=0;
printf(「n=」);
scanf(「%d」,&n);
for(i=1;i<=n;i++)
{p*=i;
sum+=p;
}
printf(「1!+2!+…+%d!=%ld\n」,n,sum);
}
解(2)
#include <stdio.h>
main()
{int n,i=1;
long p=1,sum=0;
printf(「n=」);
scanf(「%d」,&n);
while(i<=n)
{p*=i;
sum+=p;
i++;
}
printf(「1!+2!+…+%d!=%ld\n」,n,sum);
}
解(3)
#include <stdio.h>
main()
{int n,i=1;
long p=1,sum=0;
printf(「n=」);
scanf(「%d」,&n);
do
{p*=i;
sum+=p;
i++;
}
while(i<=n);
printf(「1!+2!+…+%d!=%ld\n」,n,sum);
}
實驗八
1、列印輸出由1,2,3,4四個數字組成的4位數,並統計它的個數(允許該4位數中有相同的數字,例如:1111,1122,,1212等).。
#include <stdio.h>
main()
{int n,a,b,c,d,num=0;
for(a=1;a<=4;a++)
for(b=1;b<=4;b++)
for(c=1;c<=4;c++)
for(d=1;d<=4;d++)
{n=1000*a+100*b+10*c+d;
printf(「%5d」,n);
num++;
}
printf(「\nnum=%d\n」,num);
}
2、從鍵盤輸入10個正整數進行求和,如果錯誤地輸入了負數,則求和結束。請分別用break和不用break編寫相應程序。
解(1) 用break編寫程序
#include <stdio.h>
main()
{int i,n,sum=0;
for(i=1;i<=10;i++)
{scanf(「%d」,&n);
if(n>=0)sum+=n;
else break;
}
printf(「sum=%d」,sum);
}
解(2) 不用break編寫程序
#include <stdio.h>
main()
{int i=1,n=0,sum=0;
while(i<=10&&n>=0)
{scanf(「%d」,&n);
if(n>=0)
sum+=n;
i++;
}
printf(「sum=%d」,sum);
}
實驗九
1、求一個3×3的整數矩陣的副對角線上所有奇數的和sum2。
#include <stdio.h>
main()
{int a[3][3],sum2=0,i,j;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{scanf(「%d」,&a[i][j]);
if(i+j==2&&a[i][j]%2)
sum2+=a[i][j];
}
printf(「sum2=%d」,sum2);
}
2、輸入一個正整數n(1<n≤10),再輸入n個整數,請編程實現:
⑴ 輸出這些數的平均值(保留2位小數)。
⑵ 把這些數逆序後再輸出。
⑶ 輸出它們中的最大值及其下標(設最大值唯一,下標從0開始)。
⑷ 將它們中的最小值與第一個數交換,最大值與最後一個數交換,然後輸出交換後的n個數。
#include <stdio.h>
main()
{int a[10],n,min,max,xb0,xb1,i,sum,t;
float aver;
printf(「n=」);
scanf(「%d」,&n);
for(i=0;i<n;i++)
scanf(「%d」,&a[i]);
min=a[0];xb0=0;
max=a[0];xb1=0;
sum=a[0];
for(i=1;i<n;i++)
{if(min>a[i]){min=a[i];xb0=i;};
if(max<a[i]){max=a[i];xb1=i;};
sum+=a[i];
}
aver=1.0*sum/n;
printf(「(1)平均值為:%3.2f\n」,aver);
printf(「(2)逆序輸出:」);
for(i=n-1;i>=0;i--)
printf(「%4d」,a[i]);
printf(「\n」);
printf(「(3)最大值為:%d,其下標為:%d\n」,max,xb1);
t=a[0];a[0]=a[xb0];a[xb0]=t;
t=a[n-1];a[n-1]=a[xb1];a[xb1]=t;
printf(「(4)經交換後輸出:」);
for(i=0;i<n;i++)
printf(「%4d」,a[i]);
printf(「\n」);
}
實驗十
1、輸入一個以回車結束的字元串(少於80個字元),將該字元串逆序後輸出。
#include <stdio.h>
#include <string.h>
main()
{char c[80],ch;
int i,l;
gets(c);
l=strlen(c);
for(i=0;i<l/2;i++)
{ch=c[i];
c[i]=c[l-i-1];
c[l-i-1]=ch;
}
puts(c);
}
2、輸入一個以回車結束的字元串(少於80個字元),再輸入一個字元,統計並輸出該字元在字元串中出現的次數,然後再輸出該字元串。
#include <stdio.h>
main()
{char c[80],ch;
int i,num=0;
gets(c);
ch=getchar();
for(i=0;c[i]!=『\0』;i++)
if(c[i]==ch)num++;
printf(「num(%c)=%d\n」,ch,num);
puts(c);
}
實驗十一
1、鍵盤輸入2個字元串,將二者連接後的結果輸出(用指針完成)。
#include <stdio.h>
#include <string.h>
main()
{char a[40],b[20],*p,*q;
int i,la,lb;
gets(a);
gets(b);
la=strlen(a);
lb=strlen(b);
p=&a[la];
q=b;
for(i=0;i<=lb;i++)
{*p=*q;
p++;
q++;
}
puts(a);
}
2、編一個程序,輸入15個整數存入一維數組,按逆序存放後再輸出(用指針完成)。
#include <stdio.h>
main()
{ int i,a[15],*p=a,*q,temp;
for(i=0;i<15;i++)
scanf("%d",p+i);
q=&a[14];
for(i=0;i<7;i++)
{temp=*p;
*p=*q;
*q=temp;
p++;
q--;
}
p=a;
for(i=0;i<15;i++)
printf("%3d",*(p+i));
}
3、用指針方法,編寫一個函數,求矩陣主對角線元素之和Sum。
#include <stdio.h>
main()
{int i,j,a[3][3],*p=*a,sum=0;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{scanf("%d",p);
if(i==j)sum+=*p;
p++;
}
printf("sum=%d\n",sum);
}
4、輸入一個3×6的二維整型數組,輸出其中最大值、最小值以及它們所在行和列的下標(用指針完成)。
#include <stdio.h>
main()
{int i,j,a[3][6],*p=*a,min,max,xb0_h,xb0_l,xb1_h,xb1_l;
for(i=0;i<3;i++)
for(j=0;j<6;j++)
{scanf("%d",p);
if(i==0&&j==0)
{max=*p;min=*p;
xb0_h=0;xb0_l=0;
xb1_h=0;xb1_l=0;
}
if(max<*p)
{max=*p;xb1_h=i;xb1_l=j;}
if(min>*p)
{min=*p;xb0_h=i;xb0_l=j;}
p++;
}
printf("最大值為:%d,行標:%d,列標:%d\n",max,xb1_h,xb1_l);
printf("最小值為:%d,行標:%d,列標:%d\n",min,xb0_h,xb0_l);
}
實驗十二
定義一個含10個學生成績的結構數組(每個學生的信息包括學號、姓名、成績),數據自定,要求:
1)求出平均成績。
2)將成績從高到低排序輸出。
#include <stdio.h>
main()
{int i,j,g[15],temp;
float aver=0;
struct student
{long num;
char name[20];
int grade;
}stu[10]={{101001,「zhao」,78},{101002,「qian」,86},
{101003,「sun」,69},{101004,「li」,77},
{101005,「zhou」,98},{101006,「wu」,56},
{101007,「zheng」,75},{101008,「wang」,88},
{101009,「chen」,73},{101010,「shen」,99}
};
for(i=0;i<10;i++)
{aver+=stu[i].grade;g[i]=stu[i].grade;}
aver=aver/10;
printf(「(1)平均成績:%5.2f\n」,aver);
for(i=0;i<10;i++)
for(j=i;j<10;j++)
if(g[i]<g[j])
{temp=g[i];
g[i]=g[j];
g[j]=temp;
}
printf(「(2)成績排序:」);
for(i=0;i<10;i++)
printf(「%4d」,g[i]);
printf(「\n」);
}
實驗十三
1、在主函數main()中已有變數定義和函數調用語句:「int a=1,b= -5,c; c=fun (a ,b)」; fun函數的作用是計算兩個數之差的絕對值,並將差值返回調用函數,請
1)編寫fun函數。
fun(int x , int y)
{ }
2)寫出這個主函數main()。
#include <stdio.h>
int fun(int x,int y);
main()
{int a=1,b=-5,c;
c=fun(a,b);
printf(「c=%d\n」,c);
}
int fun(int x,int y)
{if(x>y)return x-y;
else return y-x;
}
2、定義一個函數,求200~500之間滿足「用4除餘1,(或)用5除餘3,(或)用7除餘4」的數,且一行列印6個。
#include <stdio.h>
void f(int n);
main()
{int n;
for(n=200;n<=500;n++)
f(n);
}
void f(int n)
{static int p=0,m=0;
if(n%4==1 || n%5==3 || n%7==4)
{p++;
printf("%4d",n);
m=1;
}
else m=0;
if(p%6==0&&m==1)printf("\n");
}
3、函數isprime( ),用來判斷一個整形數a是否為素數,若是素數,函數返回1,否則返回0,請編寫isprime( ) 函數。
#include <stdio.h>
int isprime(int a);
main()
{int a,n=0;
printf(「a=」);
scanf(「%d」,&a);
if(a>0)n=isprime(a);
if(n==1)printf(「%d是素數」,a);
else printf(「%d不是素數」,a);
}
int isprime(int a)
{int m;
for(m=2;m<a;m++)
if(a%m==0)return 0;
return 1;
}
實驗十四
1、編程實現:輸入n(n<10)個整數,按從大到小的順序對其排序。
#include <stdio.h>
main()
{int i,j,a[10],n,t;
printf(「n=」);
scanf(「%d」,&n);
for(i=0;i<n;i++)
scanf(「%d」,&a[i]);
for(i=0;i<n;i++)
for(j=i;j<n;j++)
if(a[i]<a[j]){t=a[i];a[i]=a[j];a[j]=t;}
for(i=0;i<n;i++)
printf(「%4d」,a[i]);
printf(「\n」);
}
實驗十五
1、用多文件模塊知識編程解決問題(題目自定)。
實驗十六
1、編程,要求實現:在主程序main( )中輸入2個整數,通過調用函數將兩者的值互換。(要求分別用值傳遞方式,地址傳遞方式以及全局外部變數傳遞方式編程)。
解(1) 用值傳遞方式編程
用值傳遞方式不能將兩者的值互換。
解(2) 用地址傳遞方式編程
#include <stdio.h>
void swap(int *x,int *y );
main()
{int x,y;
printf(「x,y=」);
scanf(「%d,%d」,&x,&y);
swap(&x,&y);
printf(「x=%d,y=%d\n」,x,y);
}
void swap(int *x,int *y )
{int temp;
temp=*x;
*x=*y;
*y=temp;
}
解(3) 用全局外部變數傳遞方式編程
#include <stdio.h>
void swap();
int x,y;
main()
{printf(「x,y=」);
scanf(「%d,%d」,&x,&y);
swap();
printf(「x=%d,y=%d\n」,x,y);
}
void swap()
{int temp;
temp=x;x=y;y=temp;
}
實驗十七
1、用遞歸方法實現求N的階乘。
#include <stdio.h>
long fact(int n);
main()
{int n;
printf(「n=」);
scanf(「%d」,&n);
if(n>=0)printf(「%d!=%ld\n」,n,fact(n));
else printf(「輸入錯誤!\n」);
}
long fact(int n)
{long p;
if(n<=1)return 1;
else p=n*fact(n-1);
return p;
}
2、用遞歸方法編寫求斐波那契數列的函數,返回值為長整型。斐波那契數列的定義為: ,並寫出相應主函數。
#include <stdio.h>
int fib(int n);
main()
{int n,i;
printf(「n=」);
scanf(「%d」,&n);
for(i=0;i<=n;i++)
printf(「%d,」,fib(i));
printf(「…\n」);
}
int fib(int n)
{ if(n==0) return 0;
if(n==1) return 1;
if(n>1) return fib(n-1)+fib(n-2);
}
實驗十八
1、統計一個文本文件(該文件您自已此前已建立)中字母、數字及其它字元各有多少個,試編程。
#include <stdio.h>
main()
{char ch;
int zm=0,sz=0,qt=0;
FILE *fp;
fp=fopen(「file1.txt」,「r」);
if(fp==NULL)
{printf(「不能打開文件file1.txt\n」);exit(0);}
while(!feof(fp))
{ch=fgetc(fp);
if((ch>=『a』&&ch<=『z』)||( ch>=『A』&&ch<=『Z』))
zm++;
else if(ch>=『0』&&ch<=『9』)
sz++;
else qt++;
}
fclose(fp);
printf(「zm=%d\n」,zm);
printf(「sz=%d\n」,sz);
printf(「qt=%d\n」,qt);
}
可用以下程序,建立文件file1.txt,並寫入20個字元到文件中。
#include "stdio.h"
main()
{int i;
char ch;
FILE *fp;
if((fp=fopen("file1.txt","w"))==NULL)
{printf("file open error!\n");
exit(0);
}
for(i=0;i<20;i++)
{ch=getchar();
fputc(ch,fp);
}
fclose(fp);
}
2、文本文件int.txt中包含若干整數,請把文件中所有數據相加,並把累加和寫入文件最後。
#include <stdio.h>
main()
{int a,sum=0;
FILE *fp;
fp=fopen("file2.txt","r");
if(fp==NULL)
{printf("不能打開文件file2.txt\n");exit(0);}
while(!feof(fp))
{fscanf(fp,"%2d",&a);
sum+=a;
}
fclose(fp);
fp=fopen("file2.txt","a");
if(fp==NULL)
{printf("不能打開文件file2.txt\n");exit(0);}
fprintf(fp,"%d",sum);
fclose(fp);
}
可用以下程序,建立文件file2.txt,並寫入10個整數到文件中。
#include "stdio.h"
main()
{int i,a;
FILE *fp;
if((fp=fopen("file2.txt","w"))==NULL)
{printf("file open error!\n");
exit(0);
}
for(i=0;i<10;i++)
{scanf("%d",&a);
fprintf(fp,"%2d",a);
}
fclose(fp);
}
❼ 怎麼學習C語.求教程。
找一本C語言教程,譚浩強的那本書可以作為入門教材。學習C語言語法的同時,要多動手,至少做到不看書就能把事例代碼敲出來。此外,書中的練習題也可以自己嘗試寫一下,這樣可以鍛煉你的編程思維。切忌,不能只看書,一定要多動手聯系
❽ C語言習題請高手幫忙解答,急。
if(i%2)就是i除以2的余數是否為0
為0則列印*否則返回for();語句
程序輸出為#*#*#$加上回車符
❾ C語言綜合練習題
1. 在C程序中,只能用於整型變數的運算符是___ 求余(%)___。2. 在C語言中,char類型變數占 2 個位元組。3. 若a已定義為double類型,請寫出從鍵盤給a輸入數據的語句 scanf("%lf",a); 。4. 為使以下程序能正確運行,請填空。include<stdio.h> include<math.h> main(){ double x, y; scanf("%lf%lf",x,y); printf("y=%f\n", pow(x,y));}5. 以下程序執行後的輸出結果是 -2 。 main() { int m=3,n=4,x; x=-m++; x=x+8/++n; printf("%d\n",x); }6. 以下程序的輸出結果是 10 20 0 。 main() { int a,b,c; a=10; b=20; c=(a%b<1)(a/b>1); printf("%d %d %d\n",a,b,c); }7. 以下程序中調用fun函數,對主函數x和y中的值進行對調。請填空。void fun( double *a, double *b){ double x;x=*a; *a=*b ; *b=x ; }main(){ double x,y;printf(「Enter x, y : 「); scanf(「%lf%lf」,x,y);fun( x,y);printf(「x=%f y=%f\n」,x,y );}8. C語言規定:字元串以 '\0' 作為結束標志。9. 以下程序的輸出結果是 3 。 long fun( int n){ long t;if ( n==1 n==2 ) t=1;else t=fun(n-1) + fun(n-2);return ( t );}main( ){ printf(「%d\n」,fun(4) );}10. 設有定義:struct date{ int year, month, day ; } d1;請寫出利用輸入語句,為變數d1中的year成員從鍵盤輸入數值的語句 scanf ("%d",(d1.year)); 。
❿ 求C語言詳細教程
推薦:
1.C語言編程寶典
http://www.cnread.net/cnread1/dnwl/cxsj/c/cyyb/
http://www.cnool.net/tianyige/computer/tc/
2.C In China
http://www.cinchina.com/
3.網路C語言吧
http://post..com/f?kw=c%D3%EF%D1%D4
4.編程中國
http://www.bc-cn.net/Article/kfyy/cyy/
5.C語言之家
http://www.cstudyhome.com/wenzhang06/default.asp
6.C語言基地
http://www.cyybase.com/ http://www.cyybase.com
c語言基地 有名校教師 視頻 教學
我認為要學好C語言首先必須了解等級考試C語言的大綱和內容,以及各種輔助材料的用途,這是學好C的基礎。從以前的經驗以及考網上的一些信息可知,要自學C語言必須准備以下資料:
1、 教材:大家現在都公認是清華大學譚浩強主編的那本,當然有其他的也可以,如高校出版社的。
2、 習題集:我認為清華大學的《C語言樣題匯編》不錯。書後面附有答案。
3、 上機練習:我認為南開大學的那個可以,最好是在考前從頭到尾做一遍。答案可以去考網下載區下載。
4、 大綱:這個肯定要的,可以在考網二級版那裡去下,然後列印出來。
5、 自學計劃:為了做到有計劃有目的地學習C語言,大家可以根據自己的學習(或工作)情況,制定一個自學計劃,循序漸進地學習。
6、 模擬盤:為了更好地熟悉考場環境,下一個模擬盤是必不可少的,可以在http://studywang.yeah.net/。下載,注意,在下載時要把鎖匙盤一起下回來,否則不能進入考試環境。
7、 教學光碟:如果能買到C語言的教學光碟,那當然更好,這樣可以更直觀地學習C語言了。
下面從微觀上針對C語言的幾個重點和難點,逐個談談具體的自學方法。
二 如何學習C語言的運算符和運算順序
C語言的運算功能十分豐富,運算種類遠多於其它程序設計語言。因此,當多種不同運算組成一個運算表達式,即一個運算式中出現多種運算符時,運算的優先順序和結合規則顯得十分重要。
初學者往往對此感到非常困難,覺得C語言學習太繁雜,其實只要我們對此合理進行分類,找出它們與我們在數學中所學到運算之間的不同點之後,記住這些運算也就不困難了,有些運算符在理解後更會牢記心中,將來用起來得心應手,而有些可暫時放棄不記,等用到時再記不遲。
下面是所有的運算符按優先順序不同分類列表:(對不起,因為表格顯示不正常,已被我刪除大家可以看書上的)
表中列出15種優先順序的運算符,從高到低,優先順序為1 ~ 15,最後邊一欄是結合規則,除第2、3級和第14級為從右至左結合外,其它都是從左至右結合,它決定同級運算符的運算順序。
下面我們通過幾個例子來說明:
(1) 3*20/4%10 這個表達式中出現3種運算符,是同級運算符,運算順序按從左至右結合,因此先計算3 * 20=60,然後被4除,結果為15,最後是%(求余數)運算,所以表達式的最終結果為15%10 = 5
(2)a = 3;b = 5;c =++ a* b ;d =a + +* b;
例子中的「;」是C語言的語句分隔符,執行順序為從左到右,第1條語句執行後a的值為3,第2條語句執行後b的值為5,第3條語句中有兩個運算符前置+ +和*,按表中所列順序,+ +先執行,*後執行,所以+ + a執行後,a的值為4,由於+ +為前置運算,所以a的值4參與運算,C的值為20,最後執行第4條語句,由於a + +為後置運算,所以a值為4參與運算,使得d的值仍為20,而a參與運算後其值加1,值為5。
這個例子執行後,a的值為5,b的值為5,c的值為20,d的值也是20。
(3)a = 3,b = 5,b+ = a,c = b* 5
例子中的「,」是逗號結合運算,上式稱為逗號表達式,自左向右結合,最後一個表達式的結果值就是逗號表達式的結果,所以上面的逗號表達式結果為40,a的值為3,b的值為8,c的值為40。
三、如何學習C語言的四種程序結構
(1)順序結構
這種結構的程序比較簡單,就是按照語句的排列順序依次執行的機制。順序結構的執行順序是自上而下,依次執行,因此編寫程序也必須遵守這一規定,否則你的程序執行結果就不對。
例如;a = 3,b = 5,現交換a,b的值,正確的程序為:
c = a;
a = b;
b = c;
執行結果是a = 5,b = c = 3如果改變其順序,寫成:
a = b;
c = a;
b = c;
則執行結果就變成a = b = c = 5,不能達到預期的目的,這是初學者常犯的錯誤。
順序結構可以獨立使用構成一個簡單的完整程序,常見的輸入、計算,輸出三步曲的程序就是順序結構,例如計算圓的面積,其程序的語句順序就是輸入圓的半徑R,計算S = 3.14159*R*R,輸出圓的面積S。而大多數情況下順序結構都是作為程序的一部分,與其它結構一起構成一個復雜的程序,例如分支結構中的塊體、循環結構中的循環體等。
C語言自學方法(2)
(2) 分支結構
分支結構與順序結構不同,其執行是依據一定的條件選擇執行路徑,而不是嚴格按照語句出現的物理順序。分支結構的程序設計方法的關鍵在於構造合適的分支條件和分析程序流程,根據不同的程序流程選擇適當的分支語句。
分支結構適合於帶有邏輯條件判斷的計算,設計這類程序時往往都要先繪制其程序流程圖,然後根據程序流程寫出源程序,這樣做把程序設計分析與語言分開,使得問題簡單化,易於理解。程序流程圖是根據解題分析所繪制的程序執行流程圖。
學習分支結構不要被分支嵌套所迷惑,只要弄清基本的分支結構,嵌套結構也就不難了。嵌套只不過是分支塊體中又包括分支語句而已,不是新知識,只要你基礎知識扎實,分支嵌套也難不住你,下面我們重點討論幾種基本的分支結構的學習方法。
①If(條件)
{
塊
}
這種分支結構中的塊可以是一條語句,此時「{
}」可以省略,也可以是多條語句。它有兩條分支路徑可選,一條是條件為真,執行塊,另一條是條件不滿足,跳過塊。
如,計算x的絕對值,根據絕對值定義,我們知道,當x>=0時,其絕對值不變,而x<0時其絕對值是為x的反號,因此程序段為:if(x<0)
x=-x;
②if(條件)
{塊1}
else
{塊2}
這是典型的分支結構,如果條件成立,執行塊1,否則執行塊2,塊1和塊2都有1條或若干條語句構成。
如:求ax^2+bx+c=0的根
分析:因為當b^2-4ac>=0時,方程有兩個實根,否則(b^2-4ac<0)有兩個共軛復根。其程序段如下:
d=b*b-4*a*c;
if(d>=0)
{x1=(-b+sqrt(d))/2a;
x1=(-b-sqrt(d))/2a;
printf(「x1=%8.4f,x2=%8.4f\n」,x1,x2);
}
else
{r=-b/(2*a);
i =sqrt(-d)/(2*a);
printf(「x1=%8.4f+%8.4fi\n」r, i);
printf(「x2=%8.4f-%8.4fi\n」r,i)
}
③多路分支:其語句格式為:
if(條件1) {塊1};
else if(條件2) {塊2}
else if(條件3) {塊3}
……
else if(條件n) {塊n}
else {塊n+1}
④switch語句:
switch
語句也是多分支選擇語句,又稱為多路開關語句,到底執行哪一塊,取決於開關設置,也就是表達式的值與常量表達式相匹配的那一路,它不同if—else 語句,它的所有分支都是並列的,程序執行時,由第一分支開始查找,如果相匹配,執行其後的塊,接著執行第2分支,第3分支……的塊,直到遇到break語句;如果不匹配,查找下一個分支是否匹配。
(3)循環結構:
循環結構可以減少源程序重復書寫的工作量,用來描述重復執行某段演算法的問題,這是程序設計中最能發揮計算機特長的程序結構,C語言中提供四種循環,即goto循環、while循環、do –while循環和for循環。
四種循環可以用來處理同一問題,一般情況下它們可以互相代替換,但一般不提昌用goto循環,所以下面我們重點講解另外的三種循環。
常用的三種循環結構學習的重點在於弄清它們相同與不同之處,以便在不同場合下使用,大家好好看一下書中三種循環的格式和執行順序,如何替換使用,如把while循環的例題,用for語句重新編寫一個程序,這樣能更好地理解它們的作用。
注意:在while和do—while循環體內和for
循環中的第3語句中,應包含趨於結束的語句(如I++,I--),否則就可能成了一個死循環,這也是初學者的一個常見錯誤。
下面我們來討論下這三種循環的異同之處:
用while和do—while循環時,循環變數的初始化的操作應在循環體之前,而for循環是在語句1中進行的;while
循環和for循環都是先判斷表達式,後執行循環體,而do—while循環是先執行循環體後判斷表達式,也就是說do—while的循環體最少被執行一次,而while
循環和for就不一定了。這三種循環都可以用break語句跳出循環,用continue語句結束本次循環,而goto語句與if構成的循環,不能用break和
continue語句進行控制。
這三種結構並不是彼此孤立的,在循環中可能出現分支、順序結構,分支中也可能出現循環、順序結構而把循環、分支看成一個語句,它又是構成順序結構的一個元素,因此這三種結構相互結合,就能實現各種演算法,設計出解題程序,但若是很大的題目,這樣編出的程序往往很長,重復結構多,並且可閱讀性差,因此我們常將C程序設計成模塊化結構。
(4)模塊化程序結構
C語言的模塊化程序結構用函數來實現,即將復雜的C程序分為若干模塊,每個模塊都編寫成一個合法的C函數,然後用主函數調用函數及函數調用函數實現一大C程序:C程序=主函(main)+若干個函數。
在程序設計中,常將一些常用的功能模塊寫成函數,也可以將大程序段分割成若干函數,前者目的在於減少重復編寫程序段的工作量,後者目的在於縮短模塊長度,以便程序閱讀方便。
一個源程序文件由一個或多個函數組成,它是一個編譯單位,而一個C程序由一個或多個源程序文件組成。對較大的程序,往往分成多個文件,這樣可以分別編寫、分別編譯,提高高調試效率,一個源程序文件可以被多個C程序公用。
C程序的的執行是從main()函數開始,調用其它函數後流程回到main函數,在main中結束整個函數運行,main函數的稱是系統規定的,用戶可以修改其內容即函數體,但不能修改其名稱和參數,一個C程序必須有一個main函數,也只能有一個main函數。
所有函數都是平行的,即在定義函數時是互相獨立的一個函數度不從屬於另一個函數,即函數不能嵌套定義,但可以互相調用,但不能調用main函數。
函數分成兩類,即標准函數和用戶自定義函數,標准函數又稱庫函數,由系統提供,用戶可直接調用,C語言提供了豐富的庫函數,請考生在編寫C程序時查閱教材後的函數說明,這可節省你的編程工作量;用戶自定義函數由編程者自己編寫.
回答者:阿拉蕾啊呀 - 試用期 一級 7-23 11:13
提問者對於答案的評價:
太好了,非常感謝!
評價已經被關閉 目前有 1 個人評價
好
100% (1) 不好
0% (0)
對最佳答案的評論
19798802 C語言新手群快加入吧!!!!!!1
評論者: 549045259 - 見習魔法師 二級
浮躁的人容易問:我到底該學什麼;----別問,學就對了;浮躁的人容易說:我要中文版!我英文不行!----不行?學呀!浮躁的人分兩種:只觀望而不學的人;只學而不堅持的人;浮躁的人永遠不是一個高手。
評論者: hnytgl - 試用期 一級
其他回答共 4 條
1.讀代碼!
2.改代碼!
3.寫代碼!
回答者:liuding1213 - 見習魔法師 二級 7-18 21:10
找一本經典教材,例如譚浩強的《C語言陳序設計》。
找一本習題集,要有全部詳細解釋的那種,最好有實例的代碼答案。
花一個月把課本看完,務求理解。不理解的地方也不要死摳,做上標記等以後再解決。然後開始做題,不要因為題目簡單就放過,往往簡單背後蘊藏大的發現。也可以快速看完書,然後復習,每復習完一章後把習題集上的題目好好做一遍。
做題時最好在計算機上把不明白的地方親自實踐一下,然後在筆記本上寫下自己的感想和心得。考試前翻一翻筆記即可。
千里之行始於足下,行動吧!