c語言課程設計報告,c語言課程設計報告參考文獻

本文目錄一覽:

求一份C語言課程設計報告要求包括:系統需求分析,總體設計,詳細設計,程序調試分析。

C語言課程設計任務書

一、題目: 學生成績管理

二、目的與要求

1. 目的:

(1)基本掌握面向過程程序設計的基本思路和方法;

(2)達到熟練掌握C語言的基本知識和技能;

(3)能夠利用所學的基本知識和技能,解決簡單的程序設計問題

2. 要求

基本要求:

1. 要求利用C語言面向過程的編程思想來完成系統的設計;

2. 突出C語言的函數特徵,以多個函數實現每一個子功能;

3. 畫出功能模塊圖;

4. 進行簡單界面設計,能夠實現友好的交互;

5. 具有清晰的程序流程圖和數據結構的詳細定義;

6. 熟練掌握C語言對文件的各種操作。

創新要求:

在基本要求達到後,可進行創新設計,如系統用戶功能控制,對管理員級和一般級別的用戶系統功能操作不同

三、信息描述

輸入一個班10個學生的學號和每個學生考試三門功課(數學、英語、計算機基礎)的成績。編程計算出每個學生的總分和平均分,並按學生成績優劣排序,最後打印一張按高分到低分名次排序的成績單。要求:

1)排序用一個函數實現。

2)打印的成績單表項包括:序號,學號、數學、英語、計算機、總分、平均分。

3)按實驗報告電子模板格式填寫實驗內容。

四、功能描述

1. 學生基本信息及成績所選科目成績的錄入。

2. 基本信息的查詢(分系、班級;分科目)與修改。

3. 對每系或每班各科成績進行分析(即求單科平均成績、及格率和優秀率);

4. 對所開課程的成績分析(求其平均成績,最高分和最低分);

5. 對學生考試成績進行排名(單科按系別或班級進行排名,對每一個班級,同一學期學生總體成績進行排名,並顯示各科成績信息)

五、解決方案

1. 分析程序的功能要求,劃分程序功能模塊。

2. 畫出系統流程圖。

3. 代碼的編寫。定義數據結構和各個功能子函數。

4. 程序的功能調試。

5. 完成系統總結報告以及使用說明書

六、進度安排

此次課程設計時間為兩周,分四個階段完成:

1. 分析設計階段。指導教師應積極引導學生自主學習和鑽研問題,明確設計要求,找出實現方法,按照需求分析、總體設計、詳細設計這幾個步驟進行。

2. 編碼調試階段:根據設計分析方案編寫C代碼,然後調試該代碼,實現課題要求的功能。

3. 總結報告階段:總結設計工作,寫出課程設計說明書,要求學生寫出需求分析、總體設計、詳細設計、編碼、測試的步驟和內容。

4. 考核階段。

#include stdio.h

#include stdlib.h

#define STU_NUM 10 /*宏定義學生的數量*/

struct student /*定義一個結構體用來存放學生學號、三門課成績、總分及平均成績*/

{

char stu_id[20]; /*學生學號;*/

float score[3]; /*三門課成績;*/

float total; /*總成績;*/

float aver; /*平均成績;*/

};

/*排序用一個函數來實現*/

void SortScore(student *stu,int n)

{

student stud;

for(int i = 0; i n-1; i++)

for(int j = i+1 ; j n; j++)

{

if(stu[i].total stu[j].total)

{

stud = stu[i];

stu[i] = stu[j];

stu[j] = stud;

}

}

}

int main( )

{

student stu[STU_NUM]; /*創建結構體數組中有10個元素,分別用來保存這10個人的相關信息。*/

/*輸入這十個學生的相關信息*/

for(int i = 0; iSTU_NUM; i++)

{

printf(“請輸入第%d個學生的學號:”,i+1);

scanf(“%s”,stu[i].stu_id);

printf(“輸入第%d個學生的數學成績:”,i+1);

scanf(“%f”,stu[i].score[0]);

printf(“輸入第%d個學生的英語成績:”,i+1);

scanf(“%f”,stu[i].score[1]);

printf(“輸入第%d個學生的計算機成績:”,i+1);

scanf(“%f”,stu[i].score[2]);

stu[i].total = stu[i].score[0]+stu[i].score[1]+stu[i].score[2];

stu[i].aver = stu[i].total/3;

}

printf(“\n”);

SortScore(stu,STU_NUM);/*調用排序函數*/

/*輸出排序後的各學生的成績*/

for(i = 0 ; i STU_NUM; i++)

{

printf(“序號: %d\t”,i);

printf(“學號:%s\t”,stu[i].stu_id);

printf(“數學:%f\t”,stu[i].score[0]);

printf(“英語:%f\t”,stu[i].score[1]);

printf(“計算機:%f\t”,stu[i].score[2]);

printf(“平均成績:%f\t”,stu[i].aver);

printf(“總分:%f\t”,stu[i].total);

printf(“\n\n”);

}

return 0;

}

註:(源程序中主要標識符含義說明)

#define STU_NUM 10 /*宏定義學生的數量*/

struct student /*定義一個結構體用來存放學生學號、三門課成績、總分及平均成績*/

{

char stu_id[20]; /*學生學號;*/

float score[3]; /*三門課成績;*/

float total; /*總成績;*/

float aver; /*平均成績;*/

}

實驗結果:

輸入 :(只輸入後面的數字,前面的文字是自己產生的)。

請輸入第1個學生的學號:001

輸入第1個學生的數學成績:1

輸入第1個學生的英語成績:1

輸入第1個學生的計算機成績:1

請輸入第2個學生的學號:002

輸入第2個學生的數學成績:2

輸入第2個學生的英語成績:2

輸入第2個學生的計算機成績:2

請輸入第3個學生的學號:003

輸入第3個學生的數學成績:3

輸入第3個學生的英語成績:3

輸入第3個學生的計算機成績:3

請輸入第4個學生的學號:004

輸入第4個學生的數學成績:4

輸入第4個學生的英語成績:4

輸入第4個學生的計算機成績:4

請輸入第5個學生的學號:005

輸入第5個學生的數學成績:5

輸入第5個學生的英語成績:5

輸入第5個學生的計算機成績:5

請輸入第6個學生的學號:006

輸入第6個學生的數學成績:6

輸入第6個學生的英語成績:6

輸入第6個學生的計算機成績:6

請輸入第7個學生的學號:007

輸入第7個學生的數學成績:7

輸入第7個學生的英語成績:7

輸入第7個學生的計算機成績:7

請輸入第8個學生的學號:008

輸入第8個學生的數學成績:8

輸入第8個學生的英語成績:8

輸入第8個學生的計算機成績:8

請輸入第9個學生的學號:009

輸入第9個學生的數學成績:9

輸入第9個學生的英語成績:9

輸入第9個學生的計算機成績:9

請輸入第10個學生的學號:010

輸入第10個學生的數學成績:10

輸入第10個學生的英語成績:10

輸入第10個學生的計算機成績:10

輸出:

序號: 0 學號:010 數學:10.000000 英語:10.000000 計算機:10.000000

平均成績:10.000000 總分:30.000000

序號: 1 學號:009 數學:9.000000 英語:9.000000 計算機:9.000000

平均成績:9.000000 總分:27.000000

序號: 2 學號:008 數學:8.000000 英語:8.000000 計算機:8.000000

平均成績:8.000000 總分:24.000000

序號: 3 學號:007 數學:7.000000 英語:7.000000 計算機:7.000000

平均成績:7.000000 總分:21.000000

序號: 4 學號:006 數學:6.000000 英語:6.000000 計算機:6.000000

平均成績:6.000000 總分:18.000000

序號: 5 學號:005 數學:5.000000 英語:5.000000 計算機:5.000000

平均成績:5.000000 總分:15.000000

序號: 6 學號:004 數學:4.000000 英語:4.000000 計算機:4.000000

平均成績:4.000000 總分:12.000000

序號: 7 學號:003 數學:3.000000 英語:3.000000 計算機:3.000000

平均成績:3.000000 總分:9.000000

序號: 8 學號:002 數學:2.000000 英語:2.000000 計算機:2.000000

平均成績:2.000000 總分:6.000000

序號: 9 學號:001 數學:1.000000 英語:1.000000 計算機:1.000000

平均成績:1.000000 總分:3.000000

七、撰寫課程設計報告或課程設計總結

課程設計報告要求:

總結報告包括需求分析、總體設計、詳細設計、編碼(詳細寫出編程步驟)、測試的步驟和內容、課程設計總結、參考資料等,不符合以上要求者,則本次設計以不及格記。

C語言常見錯誤

書寫標識符時,忽略了大小寫字母的區別

main()

{

int a=5;

printf(“%d”,A);

}

編譯程序把a和A認為是兩個不同的變量名,而顯示出錯信息。C認為大寫字母和小寫字母是兩個不同的字符。習慣上,符號常量名用大寫,變量名用小寫表示,以增加可讀性。

2.忽略了變量的類型,進行了不合法的運算。

main()

{

float a,b;

printf(“%d”,a%b);

}

%是求余運算,得到a/b的整餘數。整型變量a和b可以進行求余運算,而實型變量則不允許進行“求余”運算。

3.將字符常量與字符串常量混淆。

char c;

c=”a”;

在這裡就混淆了字符常量與字符串常量,字符常量是由一對單引號括起來的單個字符,字符串常量是一對雙引號括起來的字符序列。C規定以“\”作字符串結束標誌,它是由系統自動加上的,所以字符串“a”實際上包含兩個字符:‘a’和‘\’,而把它賦給一個字符變量是不行的。

4.忽略了“=”與“==”的區別。

在許多高級語言中,用“=”符號作為關係運算符“等於”。如在BASIC程序中可以寫

if (a=3) then …

但C語言中,“=”是賦值運算符,“==”是關係運算符。如:

if (a==3) a=b;

前者是進行比較,a是否和3相等,後者表示如果a和3相等,把b值賦給a。由於習慣問題,初學者往往會犯這樣的錯誤。

5.忘記加分號。

分號是C語句中不可缺少的一部分,語句末尾必須有分號。

a=1

b=2

編譯時,編譯程序在“a=1”後面沒發現分號,就把下一行“b=2”也作為上一行語句的一部分,這就會出現語法錯誤。改錯時,有時在被指出有錯的一行中未發現錯誤,就需要看一下上一行是否漏掉了分號。

{ z=x+y;

t=z/100;

printf(“%f”,t);

}

對於複合語句來說,最後一個語句中最後的分號不能忽略不寫(這是和PASCAL不同的)。

6.多加分號。

對於一個複合語句,如:

{ z=x+y;

t=z/100;

printf(“%f”,t);

};

複合語句的花括號後不應再加分號,否則將會畫蛇添足。

又如:

if (a%3==0);

I++;

本是如果3整除a,則I加1。但由於if (a%3==0)後多加了分號,則if語句到此結束,程序將執行I++語句,不論3是否整除a,I都將自動加1。

再如:

for (I=0;I5;I++);

{scanf(“%d”,x);

printf(“%d”,x);}

本意是先後輸入5個數,每輸入一個數後再將它輸出。由於for()後多加了一個分號,使循環體變為空語句,此時只能輸入一個數並輸出它。

7.輸入變量時忘記加地址運算符“”。

int a,b;

scanf(“%d%d”,a,b);

這是不合法的。Scanf函數的作用是:按照a、b在內存的地址將a、b的值存進去。“a”指a在內存中的地址。

8.輸入數據的方式與要求不符。①scanf(“%d%d”,a,b);

輸入時,不能用逗號作兩個數據間的分隔符,如下面輸入不合法:

3,4

輸入數據時,在兩個數據之間以一個或多個空格間隔,也可用回車鍵,跳格鍵tab。

②scanf(“%d,%d”,a,b);

C規定:如果在“格式控制”字符串中除了格式說明以外還有其它字符,則在輸入數據時應輸入與這些字符相同的字符。下面輸入是合法的:

3,4

此時不用逗號而用空格或其它字符是不對的。

3 4 3:4

又如:

scanf(“a=%d,b=%d”,a,b);

輸入應如以下形式:

a=3,b=4

9.輸入字符的格式與要求不一致。

在用“%c”格式輸入字符時,“空格字符”和“轉義字符”都作為有效字符輸入。

scanf(“%c%c%c”,c1,c2,c3);

如輸入a b c

字符“a”送給c1,字符“ ”送給c2,字符“b”送給c3,因為%c只要求讀入一個字符,後面不需要用空格作為兩個字符的間隔。

10.輸入輸出的數據類型與所用格式說明符不一致。

例如,a已定義為整型,b定義為實型

a=3;b=4.5;

printf(“%f%d\n”,a,b);

編譯時不給出出錯信息,但運行結果將與原意不符。這種錯誤尤其需要注意。

11.輸入數據時,企圖規定精度。

scanf(“%7.2f”,a);

這樣做是不合法的,輸入數據時不能規定精度。

12.switch語句中漏寫break語句。

例如:根據考試成績的等級打印出百分制數段。

switch(grade)

{ case ‘A’:printf(“85~100\n”);

case ‘B’:printf(“70~84\n”);

case ‘C’:printf(“60~69\n”);

case ‘D’:printf(“60\n”);

default:printf(“error\n”);

由於漏寫了break語句,case只起標號的作用,而不起判斷作用。因此,當grade值為A時,printf函數在執行完第一個語句後接着執行第二、三、四、五個printf函數語句。正確寫法應在每個分支後再加上“break;”。例如

case ‘A’:printf(“85~100\n”);break;

13.忽視了while和do-while語句在細節上的區別。

(1)main()

{int a=0,I;

scanf(“%d”,I);

while(I=10)

{a=a+I;

I++;

}

printf(“%d”,a);

}

(2)main()

{int a=0,I;

scanf(“%d”,I);

do

{a=a+I;

I++;

}while(I=10);

printf(“%d”,a);

}

可以看到,當輸入I的值小於或等於10時,二者得到的結果相同。而當I10時,二者結果就不同了。因為while循環是先判斷後執行,而do-while循環是先執行後判斷。對於大於10的數while循環一次也不執行循環體,而do-while語句則要執行一次循環體。

14.定義數組時誤用變量。

int n;

scanf(“%d”,n);

int a[n];

數組名後用方括號括起來的是常量表達式,可以包括常量和符號常量。即C不允許對數組的大小作動態定義。

15.在定義數組時,將定義的“元素個數”誤認為是可使的最大下標值。

main()

;

printf(“%d”,a[10]);

}

C語言規定:定義時用a[10],表示a數組有10個元素。其下標值由0開始,所以數組元素a[10]是不存在的。

16.初始化數組時,未使用靜態存儲。

int a[3]=;

這樣初始化數組是不對的。C語言規定只有靜態存儲(static)數組和外部存儲(exterm)數組才能初始化。應改為:

static int a[3]=;

17.在不應加地址運算符的位置加了地址運算符。

scanf(“%s”,str);

C語言編譯系統對數組名的處理是:數組名代表該數組的起始地址,且scanf函數中的輸入項是字符數組名,不必要再加地址符。應改為:

scanf(“%s”,str);

18.同時定義了形參和函數中的局部變量。

int max(x,y)

int x,y,z;

{z=xy?x:y;

return(z);

}

形參應該在函數體外定義,而局部變量應該在函數體內定義。應改為:

int max(x,y)

int x,y;

{int z;

z=xy?x:y;

return(z);

}

C語言心得體會

通過這次實訓,增加了我學習軟件技術的興趣,雖然還不明確軟件技術包含的具體內容,但從C語言這門課程開始,已發現程序設計的樂趣,在學習C語言的過程中也學到了許多計算機應用基礎知識,對計算機的機體也有了一個大體的了解。

這次實訓是老師給了範例程序,經過自己的改寫,實現要求。先做簡單的輸出,一步步的再做其它圖案,在實際操作過程中犯的一些錯誤還會有意外的收穫,感覺實訓很有意思。在具體操作中對這學期所學的C語言的理論知識得到鞏固,達到實訓的基本目的,也發現自己的不足之出,在以後的上機中應更加註意,同時體會到C語言具有的語句簡潔,使用靈活,執行效率高等特點。發現上機實訓的重要作用,特別是對數組和循環有了深刻的理解。

通過實際操作,學會 C語言程序編程的基本步驟、基本方法,開發了自己的邏輯思維能力,培養了分析問題、解決問題的能力。深刻體會到“沒有做不到的,只有想不到的”,“團結就是力量”,“實踐是檢驗真理的標準”,“不恥下問”……的寓意。

計時在此希望以後應多進行這樣的實訓,加長設間,培養學生獨立思考問題的能力,提高實際操作水平。

八、參考資料 :《C語言程序設計教程》

請問C語言課程設計報告摘要怎麼寫,是指什麼啊,舉個例子吧

摘要:又稱概要、內容提要。摘要是以提供文獻內容梗概為目的,不加評論和補充解釋,簡明、確切地記述文獻重要內容的短文。其基本要素包括研究目的、方法、結果和結論。具體地講就是研究工作的主要對象和範圍,採用的手段和方法,得出的結果和重要的結論,有時也包括具有情報價值的其它重要的信息。

C語言課程設計,應該主要根據你的設計內容,簡要地提煉出設計的背景,功能,意義等。最後給出關鍵字。下面是正文。

例如:

        摘要(標題居中)

近年來隨着計算機在社會領域的不斷發展,程序設計 。。。。。C語言。。。。(這裡講你做的東西的背景。)

本課程設計完成了什麼。。。。(功能)

其意義是。。。。(意義)

關鍵詞: C語言,其他

參考資料:

學生成績記錄薄 c語言 課程設計報告

C語言程序設計報告

課題名稱:學生成績管理

1 系統概述:

本程序為一個學生成績管理系統,對學生的成績進行管理,學生的信息包括學號,姓名,學期,三門課程的成績,輸入這些信息,本程序可以自動計算總成績,可以按高分到低分進行排名,並對輸入信息的人數進行匯總.

2 數據結構設計:

(1)結構體;

(2)數組的設計:運用指針代替數組,使用指針來建立線性表,使程序更加簡潔,可讀性更強.

3 各函數的設計:

函數原型:void InitList(SqLinkList L);

功能: 創建一個空的線性鏈表;

入口參數:L為要創建的線性鏈表;

出口參數:創建鏈表的L.head為空,L.length為0;

返回值: 無;

函數原型:void EmptyLinkList(SqLinkList L);

功能: 清空整個線性鏈表;

入口參數:L為要清空的鏈表名稱;

出口參數:若清空成功則鏈表長度L.length為0;

返回值: 無;

函數原型:int ScanE(ElemType e);

功能: 輸入學生信息;

入口參數:e為要輸入信息的學生名稱;

出口參數:e.num保存學號,e.name保存姓名,e.team保存所在學期,e.s1,e.s2,e.s3分別保存三門課程的成績;

返回值: 輸入合法返回1,否則返回0;

錯誤處理:若學號、姓名等輸入不合法會有提示及重輸;

函數原型:Status SqLinkListAppend(SqLinkList L,ElemType e);

功能: 追加一個結點到線性鏈表中;

入口參數:e為所追加的結點名稱,L為e所追加到的線性鏈表的名稱;

出口參數:若追加成功,則e為頭結點,鏈表長度L.length增1;

返回值: 若追加成功返回1;

函數原型:Link SearchNode(SqLinkList L,int NUM);

功能: 查找學號為NUM的學生;

入口參數:查找的鏈表名稱L,學號NUM;

出口參數:若找到結點指針p指向該結點,否則指向空結點;

返回值: 結點指針p;

函數原型:void SearchTeam(SqLinkList L,int team);

功能: 查找學期為team的所有記錄並輸出其信息;

入口參數:查找的鏈表名稱L,要查找的學期team;

出口參數:無;

返回值: 無;

函數原型:void SearchUnpass(SqLinkList L,float s1,float s2,float s3);

功能: 查找所有有掛科記錄的學生並輸出其信息;

入口參數:查找的鏈表名稱L,要查找的各門學科成績s1,s2,s3;

出口參數:無;

返回值: 無;

函數原型:void SqLinkListSearch(SqLinkList L);

功能: 對鏈表進行分類查找;

入口參數:要查找的鏈表名稱L;

出口參數:無;

返回值: 無;

函數原型: void inputData(SqLinkList L);

功能: 輸入數據,並追加一個結點;

入口參數: L為要追加結點的鏈表名稱;

出口參數: 無;

返回值: 無;

函數原型:void SqLinkListTraverse(SqLinkList L);

功能: 輸出鏈表中所有學生成績列表;

入口參數:L為要輸出信息的鏈表名稱;

出口參數:無;

返回值: 無;

函數原型:void PrintE(ElemType e);

功能: 輸出一個結點的所有信息;

入口參數:要輸出的結點名稱e;

出口參數:無;

返回值: 無;

4 使用程序的說明:

本程序為一個學生成績管理系統。對學生的成績信息進行管理,學生的信息包括學號、姓名、學期、三門課程的成績、平均成績、名次。本管理系統實現學生的學號、姓名、學期、每門課程的成績的錄入,並自動按平均分排名,使用時按屏幕上的提示,輸入使用代碼.如下圖所示:

例如:輸入代碼數字”1”,程序執行”輸入學生成績或已存在的學生成績進行修改”這條小程序.輸入學生個人信息後,如下圖所示:

如此分別輸入相應的程序代碼,就執行相應的程序段.

如下的程序是按學號進行成績排名:

當輸入”6”時,執行相應的程序,即匯總一共輸入學生的人數:

5 總結和體會:

通過對C語言學習,尤其是這學期本班開展C語言雙語教學,體會到學習難的同時,也真正了解到C語言作為一門高級的計算機語言的強大功能,特別是在當今實際生活,生產,辦公,信息管理等方面的強大作用. 這次合作我們遇到了許多的困難。時間的緊迫,知識的不足,給我很大的壓力。最終我還是還是完成了任務。團結就是力量是我這次最真切的感受。

6 程序代碼:

void InitList(SqLinkList L) {

// 構造一個空的線性表L;

L.head = 0; //頭指針為空;

L.length = 0; //長度初始為0;

}

void EmptyLinkList(SqLinkList L){

//入口參數為整個線性表的數據,功能為清空線性表;

Node *p;

if(!L.head)printf(“系統中不存在記錄。\n”);

//頭指針為空時沒有學生錄入;

else {

while (L.head){

//每個循環將下一結點賦值給頭指針,並釋放本結點空間,直至線性表清空;

p=L.head;

L.head=p-next;

free(p);

} //end while;

L.length=0; //長度為0;

printf(“該管理系統學生信息已清空。\n”);

}//end else;

}

int ScanE(ElemType e){

//輸入一個學生的成績數據結點。返回0為無效結點數據,1為有效結點數據;

printf(“\n學號:”);

scanf(“%d”,e.num);

if(e.num==0){

//學號為0輸入不合法,重新輸入;

printf(“學號輸入不合法.\n”);

return 0;

}

printf(“\n姓名:”);

scanf(“%s”,e.name);

printf(“\n學期:”);

scanf(“%d”,e.team);

while(e.team12){

//系統只記錄小於12的學期數;

printf(“輸入的學期不能大於12,請重新輸入:”);

scanf(“%d”,e.team);

}

printf(“\n成績A:”);

scanf(“%f”,e.s1);

printf(“\n成績B:”);

scanf(“%f”,e.s2);

printf(“\n成績C:”);

scanf(“%f”,e.s3);

return OK;

}

Status SqLinkListAppend(SqLinkList L,ElemType e){

//追加一個結點到線性表中;

Node *p;

p=SearchNode(L,e.num);

//查找學號為e.num的記錄並將其地址賦給指針p;

if (p==0){

//若不存在添加學號相同的結點,追加一個結點;

p=(Node *)malloc(sizeof(Node));

if (!p) return ERROR;

memcpy((p-data),e,sizeof(ElemType));

p-next=L.head ;

L.head=p;

//追加的一個結點為首結點;

L.length++; //表長度加1;

}

else { //如果該學號記錄已存在,則進行修改操作;

memcpy((p-data),e,sizeof(ElemType));

printf(“該學生記錄已經存在,已完成修改操作。\n”);

}

return OK;

}

Link SearchNode(SqLinkList L,int NUM){

//查找學生記錄,該學生的學號為NUM;

Node *p;

p=L.head; //p先指在頭結點;

while (p p-data.num !=NUM ) p=p-next;

//如果該學生的學號不為NUM則查找下一個結點;

return p;

}

void SearchTeam(SqLinkList L,int team){

//按學期查找並輸出所有該學期存在的記錄;

Node *p;

p=L.head;

int n,sum=0;

//sum記錄該學期的學生總人數;

printf(“請輸入您要查詢的學生的學期:”);

scanf(“%d”,n);

printf(“\n學號 姓名 學期 成績A 成績B 成績C 平均成績\n”);

while(pp-next){

//如果p結點和它的下一結點不為空,且該結點的學期等於要查找學期,則格式輸出所有該學期學生信息;

if(p-data.team==n){

PrintE(p-data);

sum++;

//查找到一個該學期的學生記錄計數加1;

}

p=p-next;

//轉向下一結點;

} //end while;

if(p-data.team==n){

//如果p的下一結點為空,且本結點學期為n,則格式輸出該結點信息;

sum++;

PrintE(p-data);

}

if(sum==0)printf(“沒有這學期的記錄。\n”);

if(sum)printf(“該學期共有%d人的記錄.\n”,sum);

}

void SearchUnpass(SqLinkList L,float s1,float s2,float s3){

//查找並輸出有掛科的學生信息;

Node *p;

p=L.head;

int sum=0;

//sum計數掛科總人數,初始為0;

printf(“以下是有一門以上不及格科目的學生的成績:\n”);

printf(“\n學號 姓名 學期 成績A 成績B 成績C 平均成績\n”);

while(pp-next){

//如果p及其下一結點為真,且該結點有一門以上科目分數低於60則輸出該結點成績並使sum計數加1;

if((p-data.s160)||(p-data.s260)||(p-data.s360))

{

PrintE(p-data);

sum++;

} //end if;

p=p-next;

//轉到下一結點;

} //end while;

if((p-data.s160)||(p-data.s260)||(p-data.s360)){

//查看最後一個結點,若有掛科,sum加1並格式輸出結點信息;

sum++;

PrintE(p-data);

}

if(sum==0)printf(“沒有不及格的記錄。\n”);

if(sum)printf(“共有%d人的掛科記錄.\n”,sum);

}

void SqLinkListSearch(SqLinkList L){

//分類查找學生記錄;

Node *p;

p=L.head;

int n,reg; //reg為查詢方式的指令;

printf(“1–按學號查詢\n2–按學期查詢\n3–掛科學生信息列表\n”);

printf(“請您輸入查詢方式:”);

scanf(“%d”,reg);

if(L.length){

if(reg3)printf(“對不起沒有您要求的選項。\n”);

//若reg3則輸入不合法;

else if(reg==1){

//reg==1按學號查詢;

printf(“請輸入您要查詢的學生的學號:”);

scanf(“%d”,n);

while(pp-next p-data.num !=n) p=p-next;

//當p和他下一結點為真時且結點數據不為要查找數據時轉向下一結點;

if(p-data.num==n){

//找到所要查詢結點,格式輸出;

printf(“\n學號 姓名 學期 成績A 成績B 成績C 平均成績\n”);

PrintE(p-data);

}

else printf(“沒有您要查找的學號。\n”);

} //end reg==1 if ;

else if(reg==2)SearchTeam(L,p-data.team);

//reg==2,調用SearchTeam函數按學期查詢並輸出;

else if(reg==3)SearchUnpass(L,p-data.s1,p-data.s2,p-data.s3);

//reg==3,調用SearchUnpass函數,輸出全部有掛科記錄的學生信息;

}//end if;

else printf(“系統中無記錄.\n”);

}

void inputData(SqLinkList L){

//請求輸入學生成績,則追加一個結點並輸入;

ElemType e;

if (ScanE(e)) SqLinkListAppend(L,e); //輸入數據,追加一個結點;

}

void SqLinkListTraverse(SqLinkList L){

//所有學生信息列表輸出;

Node *p;

char c;

p=L.head;

if(p) //非空表;

{

printf(“\n學號 姓名 學期 成績A 成績B 成績C 平均成績\n”);

for (p=L.head ;p;p=p-next )PrintE(p-data);

//從第一個結點開始輸出所有信息直到結點為空;

}

else printf(“系統中無記錄。\n”);

//空表;

c=getchar();

}

void PrintE(ElemType e){

//輸出各科成績和平均成績;

printf(“%d\t%s\t%d\t%f\t%f\t%f\t%f\n”,e.num,e.name,e.team,e.s1,e.s2,e.s3,(e.s1+e.s2+e.s3)/3);

//格式輸出學生的學號、姓名、學期、A、B、C三門成績以及平均成績;

}

c語言課程的總結

1.先學習C語言的基礎知識。現在正在學C語言的在校學生可以直接進入第2步學習。

2.按照《C語言程序設計入門學習六步曲》進行上機練習。

3.在上機練習時要養成良好的編程風格。點擊查看C語言的編程風格

4.積极參加C、C++興趣小組,養成和老師與同學交流習慣,從而相互收益。有時別人不經意的一句話可能使你茅塞頓開–“一句話點醒夢中人”。

5.及時總結自己的學習經驗,養成寫C語言日記的習慣。軟件有編程日記功能。

6.從網上或教材上找一個自己感興趣的題目(選題時根據自己的能力,可先易後難,培養自己的成就感,如果有了成就感,即使再苦再累還是感覺C語言學習是一件快樂的事,同學們喜歡打遊戲,經常通宵達旦地玩遊戲也樂而不疲就是這個道理)進行實戰訓練,提高自己的C語言綜合應用能力。

7. 由於C語言靈活、強大,初學者要全面地掌握它是不可能的,因此在學習C語言的過程中,不要在細枝末節上浪費精力(比如++、–用於表達式的計算,實際上是沒有意義的),但一定要熟練掌握C語言的流程控制語句、數組、函數、指針等基礎知識的應用,為學習面向對象程序設計打下堅實的基礎。如果這些知識你學不好,要後續學習好C++、可視化的程序設計Visual C++或C++Builder就像空中樓閣,是不現實的。

C語言程序設計入門學習六步曲

筆者在從事教學的過程中,聽到同學抱怨最多的一句話是:老師,上課我也能聽懂,書上的例題也能看明白,可是到自己動手做編程時,卻不知道如何下手。發生這種現象的原因有三個:

一、所謂的看懂聽明白,只是很膚淺的語法知識,而我們編寫的程序或軟件是要根據要解決問題的實際需要控制程序的流程,如果你沒有深刻地理解C語言的語句的執行過程(或流程),你怎麼會編寫程序解決這些實際問題呢?

二、用C語言編程解決實際問題,所需要的不僅僅是C語言的編程知識,還需要相關的專業知識。例如,如果你不知道長方形的面積公式,即使C語言學得再好你也編不出求長方形的面積的程序來。

三、C語言程序設計是一門實踐性很強的課程,“紙上談兵”式的光學不練是學不好C語言的。例如,大家都看過精彩自行車雜技表演,假如,你從來沒有騎過自行車,光聽教練講解相關的知識、規則、技巧,不要說上台表演、就是上路你恐怕都不行。

出現問題原因清楚了,那麼如何學習呢?請你看【C語言學習六步曲】

在程序開發的過程中,上機調試程序是一個不可缺少的重要環節。“三分編程七分調試”,說明程序調試的工作量要比編程大得多。這裡以如何上機調試C程序來說明C語言的學習方法。

第一步、驗證性練習

在這一步要求按照教材上的程序實例進行原樣輸入,運行一下程序是否正確。在這一步基本掌握C語言編程軟件的使用方法(包括新建、打開、保存、關閉C程序,熟練地輸入、編輯C程序;初步記憶新學章節的知識點、養成良好的C語言編程風格)。

初學者最容易犯的錯誤是:

1、沒有區分開教材上的數字1和字母l,字母o和數字0的區別,造成變量未定義的錯誤。另一個易錯點是將英文狀態下的逗號,分號;括號()雙引號””輸入出入成中文狀態下的逗號,分號;括號(),雙引號“”造成非法字符錯誤。

2、C語言初學者易犯語法錯誤:使用未定義的變量、標示符(變量、常量、數組、函數等)不區分大小寫、漏掉“;”、“{”與“}”、“(”與“)”不匹、控制語句(選擇、分支、循環)的格式不正確、調用庫函數卻沒有包含相應的頭文件、調用未C聲明的自定義函數、調用函數時實參與形參不匹配、數組的邊界超界等。

3、修改C語言語法錯誤時要注意以下兩點:

(1)、由於C語言語法比較自由、靈活,因此錯誤信息定位不是特別精確。例如,當提示第10行發生錯誤時,如果在第10行沒有發現錯誤,從第10行開始往前查找錯誤並修改之。

(2)、一條語句錯誤可能會產生若干條錯誤信息只要修改了這條錯誤,其他錯誤會隨之消失。特別提示:一般情況下,第一條錯誤信息最能反映錯誤的位置和類型,所以調試程序時務必根據第一條錯誤信息進行修改,修改後,立即運行程序,如果還有很多錯誤,要一個一個地修改,即,每修改一處錯誤要運行一次程序。

第二步、照葫蘆畫瓢

在第一步輸入的C程序的基礎上進行試驗性的修改,運行一下程序看一看程序結果發生了什麼變化,分析結果變化的原因,加深新學知識點的理解。事實上這和第一步時同步進行的,實現“輸入”加深知識的記憶,“修改”加深對知識的理解。記憶和理解是相輔相成的,相互促進。

例如:將最簡單的Hello World!程序

#include “stdio.h”

int main()

{

printf(“Hello World!\n”);

return 0;

}

中的

printf(“Hello World!\n”);

中的Hello World!改成你的姓名,運行一下程序,看有什麼變化?

再如求1+2+3…+100的和的程序

#include stdio.h

main()

{

int i,sum=0;

for(i=1;i=100;i++)

{

sum=sum+i;

}

printf(“sum=%d\n”,sum);

}

第1次將for(i=1;i=100;i++)中的100改成50,運行一下程序,看有什麼變化?

第2次將for(i=1;i=100;i++)中的i++改成i=i+2,運行一下程序,看有什麼變化?

找出程序結果變化的原因,就加深了對C語句的理解。

第三步、不看教材看是否能將前兩步的程序進行正確地輸入並運行。

在這一步要求不看教材,即使程序不能運行,看能否將其改正,使其能正確運行。目的是對前兩步的記憶、理解進一步強化。

第四步、增強程序的調試能力

在教材中每章都有C語言初學者易犯的錯誤,按照易出錯的類型,將教材中的正確的程序改成錯誤的程序,運行一下程序,看出現的錯誤信息提示,並記下錯誤信息,再將程序改成正確的,運行一下程序。這樣反覆修改,就能夠學習C語言程序發生錯誤的原因和修改錯誤的能力。

注意:每次只改錯一個地方,目的是顯示發生該錯誤的真正原因,避免一次改動多個地方,搞清發生錯誤的真正原因,切記!!!!

注意:上機調試程序時要帶一個記錄本,記下英文錯誤提示信息和解決該錯誤問題的方法,積累程序調試經驗,避免在編程犯同樣的錯誤,切記!!!!。

例如,將Hello World程序中語句

printf(“Hello World!\n”);

中的;改成中文的分號;

運行一下程序,看有什麼結果?

調試程序是一種實踐性很強的事,光紙上談兵是是沒用的,就像游泳運動員只聽教練講解示範,而不親自下水練習,是永遠學不會游泳的。

即使在優秀的程序員編寫程序也會犯錯誤的,可能事最低級的語法錯誤,但他能快速發現錯誤並改正錯誤,而我們C語言初學者面對錯誤提示,不知道發生了什麼錯誤,如何改正,這就事差別。

第五步、研究典型的C語言程序,提高程序設計能力

C語言初學者遇到最多的困惑是:上課也能聽懂,書上的例題也能看明白,可是到自己動手做編程時,卻不知道如何下手。發生這種現象的原因是:所謂的看懂聽明白,只是很膚淺的語法知識,而沒有深刻地理解C語言的語句的執行過程(或流程)。

計算機是按照人的指令(編寫的程序)去執行的,如果不知道這些C語句在計算機中是如何執行的,你怎麼回靈活運用這些知識去解決實際問題呢?

解決問題的方法是要先理解C語言各種語句的流程(即計算機是如何執行這些語句的過程),然後研讀現成C語言經典程序,看懂別人事如何解決問題的,以提高自己的程序設計能力。

第六步、研究課程設計源成序,提高C語言的綜合應用能力.

C語言課程設計

/******頭文件(.h)***********/

#include “stdio.h” /*I/O函數*/

#include “stdlib.h” /*標準庫函數*/

#include “string.h”/*字符串函數*/

#include “ctype.h” /*字符操作函數*/

#include “conio.h” /*控制台輸入輸出函數 */

#define M 50 /*定義常數表示記錄數*/

typedef struct /*定義數據結構*/

{

char name[20]; /*姓名*/

char units[30]; /*單位*/

char tele[20]; /*電話*/

char m_ph[20]; //手機

char rela[20]; //關係

char email[50]; //郵箱

char qq[20]; //qq

}ADDRESS;

/******以下是函數原型*******/

int enter(ADDRESS t[]); /*輸入記錄*/

void list(ADDRESS t[],int n); /*顯示記錄*/

void search(ADDRESS t[],int n); /*按姓名查找顯示記錄*/

int Delete(ADDRESS t[],int n); /*刪除記錄*/

int add(ADDRESS t[],int n); /*插入記錄*/

void save(ADDRESS t[],int n); /*記錄保存為文件*/

int load(ADDRESS t[]); /*從文件中讀記錄*/

void display(ADDRESS t[]); /*按序號查找顯示記錄*/

void sort(ADDRESS t[],int n); /*按姓名排序*/

void qseek(ADDRESS t[],int n); /*快速查找記錄*/

void print(ADDRESS temp); /*顯示單條記錄*/

int find(ADDRESS t[],int n,char *s) ; /*查找函數*/

int menu_select(); /*主菜單函數*/

/******主函數開始*******/

main()

{

system(“color 37”);//背景色為淺綠,前景色為白色

printf(” 歡迎使用通訊錄管理系統\n”);//歡迎界面

int i;

ADDRESS adr[M]; /*定義結構體數組*/

int length; /*保存記錄長度*/

for(;;)/*無限循環*/

{

switch(menu_select()) /*調用主菜單函數,返回值整數作開關語句的條件*/

{

case 0:length=enter(adr);break;/*輸入記錄*/

case 1:list(adr,length);break; /*顯示全部記錄*/

case 2:search(adr,length);break; /*查找記錄*/

case 3:length=Delete(adr,length);break; /*刪除記錄*/

case 4:length=add(adr,length); break; /*插入記錄*/

case 5:save(adr,length);break; /*保存文件*/

case 6:length=load(adr); break; /*讀文件*/

case 7:display(adr);break; /*按序號顯示記錄*/

case 8:sort(adr,length);break; /*按姓名排序*/

case 9:qseek(adr,length);break; /*快速查找記錄*/

case 10:exit(0); /*如返回值為10則程序結束*/

}

}

}

/*菜單函數,函數返回值為整數,代表所選的菜單項*/

int menu_select()

{

char s[80];

int c;

printf(“按任意鍵進入菜單……\n”);/*提示按任意鍵繼續*/

getch(); /*讀入任意字符*/

system(“cls”); /*清屏*/

printf(” ********************菜單***********************\n\n”);

printf(” 0. 輸入記錄\n”);

printf(” 1. 顯示所有記錄\n”);

printf(” 2. 按姓名查找記錄\n”);

printf(” 3. 刪除記錄\n”);

printf(” 4. 添加記錄\n”);

printf(” 5. 保存文件\n”);

printf(” 6. 載入文件\n”);

printf(” 7. 按序號顯示記錄\n”);

printf(” 8. 記錄排序\n”);

printf(” 9. 查找記錄\n”);

printf(” 10. 退出\n”);

printf(” ***********************************************\n”);

do

{

printf(“\n 請輸入選項(0~10):”); /*提示輸入選項*/

scanf(“%d”,c);/*輸入選擇項*/

fflush(stdin);

}while(c0 || c10);/*選擇項不在0~10之間重輸*/

return c; /*返回選擇項,主程序根據該數調用相應的函數*/

}

/***輸入記錄,形參為結構體數組,函數值返回類型為整型表示記錄長度*/

int enter(ADDRESS t[])

{

int i,n;

char num[30];

system(“cls”); /*清屏*/

int flag=1;

for(;;)

{

flag = 1;

system(“cls”); /*清屏*/

printf(“\n請輸入記錄數:\n”); /*提示信息*/

scanf(“%s”, num); /*輸入記錄數*/

fflush(stdin);

for(int nima = 0; num[nima]; nima++)

{

if (num[nima] 48 || num[nima] 57)

{

flag = 0;

break;

}

}

if(flag==1)

break;

}

n=atoi(num);

printf(“請輸入記錄:\n”); /*提示輸入記錄*/

printf(“姓名 單位 電話 手機 關係 郵箱 QQ\n”);

printf(“————————————————————————–\n”);

for(i=0;in;i++)

{

scanf(“%s%s%s%s%s%s%s”,t[i].name,t[i].units,t[i].tele,t[i].m_ph,t[i].rela,t[i].email,t[i].qq); /*輸入記錄*/

fflush(stdin);

for(int k=0;k=19;k++)

{

if((t[i].tele[k]=’a’ t[i].tele[k]=’z’ )|| (t[i].tele[k]=’A’ t[i].tele[k]=’Z’))

{

printf(“電話輸入錯誤!請重新輸入聯繫人信息\n”);

i–;

break;

}

if((t[i].m_ph[k]=’a’ t[i].m_ph[k]=’z’ )|| (t[i].m_ph[k]=’A’ t[i].m_ph[k]=’Z’))

{

printf(“手機輸入錯誤!請重新輸入聯繫人信息\n”);

i–;

break;

}

if((t[i].qq[k]=’a’ t[i].qq[k]=’z’ )|| (t[i].qq[k]=’A’ t[i].qq[k]=’Z’))

{

printf(“QQ輸入錯誤!請重新輸入聯繫人信息\n”);

i–;

break;

}

}

printf(“————————————————————————–\n”);

}

return n; /*返回記錄條數*/

}

/*顯示記錄,參數為記錄數組和記錄條數*/

void list(ADDRESS t[],int n)

{

int i;

system(“cls”); /*清屏*/

printf(“\n\n************************************************************************\n”);

printf(“姓名 單位 電話 手機 關係 郵箱 QQ\n”);

printf(“————————————————————————–\n”);

for(i=0;in;i++)

printf(“%-10s%-14s%-12s%-12s%-10s%-12s%-14s\n”,t[i].name,t[i].units,t[i].tele,t[i].m_ph,t[i].rela,t[i].email,t[i].qq);

if((i+1)%10==0) /*判斷輸出是否達到10條記錄*/

{

printf(“按任意鍵顯示下一頁\n”); /*提示信息*/

getch(); /*按任意鍵繼續*/

}

printf(“*********************************結束***********************************\n”);

}

/*查找記錄*/

void search(ADDRESS t[],int n)

{

char s[20]; /*保存待查找姓名字符串*/

int i; /*保存查找到結點的序號*/

system(“cls”); /*清屏*/

printf(“請輸入待查找姓名:\n”);

scanf(“%s”,s); /*輸入待查找姓名*/

i=find(t,n,s); /*調用find函數,得到一個整數*/

if(in-1) /*如果整數i值大於n-1,說明沒找到*/

{

printf(“未找到!!!\n”);

getch();

}

else

print(t[i]); /*找到,調用顯示函數顯示記錄*/

}

/*顯示指定的一條記錄*/

void print(ADDRESS temp)

{

system(“cls”); /*清屏*/

printf(“\n\n************************************************************************\n”);

printf(“姓名 單位 電話 手機 關係 郵箱 QQ\n”);

printf(“————————————————————————–\n”);

printf(“%-10s%-14s%-12s%-12s%-10s%-12s%-14s\n”,temp.name,temp.units,temp.tele,temp.m_ph,temp.rela,temp.email,temp.qq);

printf(“*********************************結束***********************************\n”);

getchar();

}

/*查找函數,參數為記錄數組和記錄條數以及姓名s */

int find(ADDRESS t[],int n,char *s)

{

int i;

system(“cls”); /*清屏*/

for(i=0;in;i++)/*從第一條記錄開始,直到最後一條*/

{

if(strcmp(s,t[i].name)==0) /*記錄中的姓名和待比較的姓名是否相等*/

return i; /*相等,則返回該記錄的下標號,程序提前結結束*/

}

return i; /*返回i值*/

getch();

}

/*刪除函數,參數為記錄數組和記錄條數*/

int Delete(ADDRESS t[],int n)

{

char s[20]; /*要刪除記錄的姓名*/

char ch;

int i,j;

system(“cls”); /*清屏*/

printf(“請輸入待刪除的姓名:\n”); /*提示信息*/

scanf(“%s”,s);/*輸入姓名*/

i=find(t,n,s); /*調用find函數*/

if(in-1) /*如果in-1超過了數組的長度*/

printf(“未找到!!!\n”); /*顯示沒找到要刪除的記錄*/

else

{

print(t[i]); /*調用輸出函數顯示該條記錄信息*/

printf(“確定刪除?(Y/N)\n”); /*確認是否要刪除*/

scanf(“%c”,ch); /*輸入一個整數0或1*/

if(ch==’y’ || ch==’Y’) /*如果確認刪除輸入y*/

{

for(j=i+1;jn;j++) /*刪除該記錄,實際後續記錄前移*/

{

strcpy(t[j-1].name,t[j].name); /*將後一條記錄的姓名拷貝到前一條*/

strcpy(t[j-1].units,t[j].units); /*將後一條記錄的單位拷貝到前一條*/

strcpy(t[j-1].tele,t[j].tele); /*將後一條記錄的電話拷貝到前一條*/

strcpy(t[j-1].m_ph,t[j].m_ph); /*將後一條記錄的手機拷貝到前一條*/

strcpy(t[j-1].rela,t[j].rela); /*將後一條記錄的關係拷貝到前一條*/

strcpy(t[j-1].email,t[j].email); /*將後一條記錄的郵箱拷貝到前一條*/

strcpy(t[j-1].qq,t[j].qq); /*將後一條記錄的qq拷貝到前一條*/

}

printf(“刪除成功!\n”);

n–; /*記錄數減1*/

}

}

getch();

return n; /*返回記錄數*/

}

/*插入記錄函數,參數為結構體數組和記錄數*/

int add(ADDRESS t[],int n)/*插入函數,參數為結構體數組和記錄數*/

{

ADDRESS temp; /*新插入記錄信息*/

int i,j,flag;

char s[30]; /*確定插入在哪個記錄之前*/

system(“cls”); /*清屏*/

printf(“請輸入記錄:\n”);

printf(“************************************************************************\n”);

printf(“姓名 單位 電話 手機 關係 郵箱 QQ\n”);

printf(“————————————————————————–\n”);

scanf(“%s%s%s%s%s%s%s”,temp.name,temp.units,temp.tele,temp.m_ph,temp.rela,temp.email,temp.qq); /*輸入插入信息*/

fflush(stdin);

printf(“請輸入插入位置的姓名: \n”);

scanf(“%s”,s); /*輸入插入位置的姓名*/

i=find(t,n,s); /*調用find,確定插入位置*/

for(j=n-1;j=i;j–) /*從最後一個結點開始向後移動一條*/

{

strcpy(t[j+1].name,t[j].name); /*當前記錄的姓名拷貝到後一條*/

strcpy(t[j+1].units,t[j].units); /*當前記錄的單位拷貝到後一條*/

strcpy(t[j+1].tele,t[j].tele); /*當前記錄的電話拷貝到後一條*/

strcpy(t[j+1].m_ph,t[j].m_ph); /*當前記錄的手機拷貝到後一條*/

strcpy(t[j+1].rela,t[j].rela); /*當前記錄的關係拷貝到後一條*/

strcpy(t[j+1].email,t[j].email); /*當前記錄的郵箱拷貝到後一條*/

strcpy(t[j+1].qq,t[j].qq); /*當前記錄的qq拷貝到後一條*/

}

strcpy(t[i].name,temp.name); /*將新插入記錄的姓名拷貝到第i個位置*/

strcpy(t[i].units,temp.units); /*將新插入記錄的單位拷貝到第i個位置*/

strcpy(t[i].tele,temp.tele); /*將新插入記錄的電話拷貝到第i個位置*/

strcpy(t[i].m_ph,temp.m_ph); /*將新插入記錄的手機拷貝到第i個位置*/

strcpy(t[i].rela,temp.rela); /*將新插入記錄的關係拷貝到第i個位置*/

strcpy(t[i].email,temp.email); /*將新插入記錄的郵箱拷貝到第i個位置*/

strcpy(t[i].qq,temp.qq); /*將新插入記錄的qq拷貝到第i個位置*/

n++; /*記錄數加1*/

printf(“添加成功!!!\n”);

getch();

return n; /*返回記錄數*/

}

/*保存函數,參數為結構體數組和記錄數*/

void save(ADDRESS t[],int n)

{

int i;

char outfile[30];

FILE *fp; /*指向文件的指針*/

system(“cls”); /*清屏*/

printf(“請輸入待保存的文件名:\n”);

scanf(“%s”,outfile);

if((fp=fopen(outfile,”wb”))==NULL) /*打開文件,並判斷打開是否正常*/

{

printf(“無法打開文件!\n”);/*無法打開*/

exit(1); /*退出*/

}

printf(“\n保存文件…\n”); /*輸出提示信息*/

fprintf(fp,”%d”,n); /*將記錄數寫入文件*/

fprintf(fp,”\r\n”); /*將換行符號寫入文件*/

for(i=0;in;i++)

{

fprintf(fp,”%-10s%-14s%-12s%-12s%-10s%-12s%-14s\n”,t[i].name,t[i].units,t[i].tele,t[i].m_ph,t[i].rela,t[i].email,t[i].qq);/*格式寫入記錄*/

fprintf(fp,”\r\n”); /*將換行符號寫入文件*/

}

fclose(fp);/*關閉文件*/

printf(“****保存成功!****\n”); /*顯示保存成功*/

getch();

}

/*載入函數,參數為結構體數組*/

int load(ADDRESS t[])

{

int i,n;

char outfile[30];

FILE *fp; /*指向文件的指針*/

system(“cls”); /*清屏*/

printf(“請輸入待載入的文件名:\n”);

scanf(“%s”,outfile);

if((fp=fopen(outfile,”rb”))==NULL)/*打開文件*/

{

printf(“無法打開文件!\n”); /*不能打開*/

exit(1); /*退出*/

}

fscanf(fp,”%d”,n); /*讀入記錄數*/

for(i=0;in;i++)

fscanf(fp,”%10s%14s%12s%12s%10s%12s%14s”,t[i].name,t[i].units,t[i].tele,

t[i].m_ph,t[i].rela,t[i].email,t[i].qq); /*按格式讀入記錄*/

fclose(fp); /*關閉文件*/

printf(“從文件讀入數據成功!!!\n”); /*顯示保存成功*/

getch();

return n; /*返回記錄數*/

}

/*按序號顯示記錄函數*/

void display(ADDRESS t[])

{

int id,n;

char outfile[30];

FILE *fp; /*指向文件的指針*/

system(“cls”); /*清屏*/

printf(“請輸入待載入的文件名:”);

scanf(“%s”,outfile);

if((fp=fopen(outfile,”rb”))==NULL) /*打開文件*/

{

printf(“無法打開文件!\n”); /*不能打開文件*/

exit(1); /*退出*/

}

printf(“請輸入記錄序號:\n”); /*顯示信息*/

scanf(“%d”,id); /*輸入序號*/

fscanf(fp,”%d”,n); /*從文件讀入記錄數*/

if(id=0idn) /*判斷序號是否在記錄範圍內*/

{

fseek(fp,(id-1)*sizeof(ADDRESS),1); /*移動文件指針到該記錄位置*/

print(t[id]); /*調用輸出函數顯示該記錄*/

printf(“\r\n”);

}

else

{

printf(” %d號記錄不存在!!!\n “,id); /*如果序號不合理顯示信息*/

getch();

}

fclose(fp); /*關閉文件*/

}

/*排序函數,參數為結構體數組和記錄數*/

void sort(ADDRESS t[],int n)

{

int i,j,flag;

system(“cls”); /*清屏*/

ADDRESS temp; /*臨時變量做交換數據用*/

for(i=0;in;i++)

{

flag=0; /*設標誌判斷是否發生過交換*/

for(j=0;jn-1;j++)

if((strcmp(t[j].name,t[j+1].name))0) /*比較大小*/

{

flag=1;

strcpy(temp.name,t[j].name); /*交換記錄*/

strcpy(temp.units,t[j].units);

strcpy(temp.tele,t[j].tele);

strcpy(temp.m_ph,t[j].m_ph);

strcpy(temp.rela,t[j].rela);

strcpy(temp.email,t[j].email);

strcpy(temp.qq,t[j].qq);

strcpy(t[j].name,t[j+1].name);

strcpy(t[j].units,t[j+1].units);

strcpy(t[j].tele,t[j+1].tele);

strcpy(t[j].m_ph,t[j+1].m_ph);

strcpy(t[j].rela,t[j+1].rela);

strcpy(t[j].email,t[j+1].email);

strcpy(t[j].qq,t[j+1].qq);

strcpy(t[j+1].name,temp.name);

strcpy(t[j+1].units,temp.units);

strcpy(t[j+1].tele,temp.tele);

strcpy(t[j+1].m_ph,temp.m_ph);

strcpy(t[j+1].rela,temp.rela);

strcpy(t[j+1].email,temp.email);

strcpy(t[j+1].qq,temp.qq);

}

if(flag==0)break; /*如果標誌為0,說明沒有發生過交換循環結束*/

}

printf(“排序成功!!!\n”); /*顯示排序成功*/

}

/*快速查找,參數為結構體數組和記錄數*/

void qseek(ADDRESS t[],int n)

{

char s[20];

int l,r,m;

system(“cls”); /*清屏*/

printf(“\n請在查找前排序!\n”); /*提示確認在查找之前,記錄是否已排序*/

printf(“請輸入待查找的姓名:\n”); /*提示輸入*/

scanf(“%s”,s); /*輸入待查找的姓名*/

l=0;r=n-1; /*設置左邊界與右邊界的初值*/

while(l=r) /*當左邊界=右邊界時*/

{

m=(l+r)/2; /*計算中間位置*/

if(strcmp(t[m].name,s)==0) /*與中間結點姓名字段做比較判是否相等*/

{

print(t[m]); /*如果相等,則調用print函數顯示記錄信息*/

return ; /*返回*/

}

if(strcmp(t[m].name,s)0) /*如果中間結點小*/

l=m+1; /*修改左邊界*/

else

r=m-1; /*否則,中間結點大,修改右邊界*/

}

if(lr) /*如果左邊界大於右邊界時*/

printf(“未找到!\n”); /*顯示沒找到*/

getch();

}

C語言課程設計報告要求

一 、 設計題目

萬年曆的設計

二 、設計要求

1、能夠顯示星期;

2、能夠顯示年月日;

3、能夠修改;

4、當系統時間變動時,能自動跳到相應的時間。

三 、 設計目的

1. 通過本項課程設計,可以培養獨立思考、 綜合運用所學有關相應知識的能力,能更好的鞏固《C語言程序設計》課程學習的內容,掌握 工程軟件設計的基本方法,強化上機動手編程能力,闖過理論與實踐相結合的難關!更加了解了c語言的好處和其可用性!同時增加了同學之間的團隊合作精神!更加也體會到以後在工作中團隊合作的重要性和必要性!

2. 通過C語言課程設計,使學生了解高級程序設計語言的結構,掌握基本的程序設計過程和技巧,掌握基本的分析問題和利用計算機求解問題的能力,具備初步的高級語言程序設計能力。為後續各門計算機課程的學習和畢業設計打下堅實基礎。

四 、設計思想及過程

【一】由於萬年曆具有以下特點:

1。平年365天(52周+1天),閏年366天(52周+2天)。平年2月28天,閏年2月29天。

由於公元1月1日設為星期六,故3月1日為星期三。 ——注意這個“三”

為使算法達到最簡,故本算法以“星期”為計算單位。且選3月1日為基月。

2。每400年整一閏,或每4年且不為百年的一閏。(原因:地球繞太陽一周的時間是365天5小時46秒,為了使一年的天數為整數,將一年的天數定為365天,餘下的時間積累起來,四年就是23小時15分4秒,將近一天,把這一天加在某年的二月而成29天,該年稱為閏年,其它年稱為平年。但四年加一天又多用了44分56秒,這個數積滿400年為三天。因此400年中只能有97個閏年,所以凡能被400整除,或不能被100整除但能被4整除的年份為閏年。)

所以百年%4=0閏或(年%4=0並且年0)閏。

3。每 4年(3個平年+1個閏年)共208周+5天 ——注意這個“5天”

每百年共100*(208周+5天)-1天=5217周+5天 ——注意這個“5天”(整百年暫設為平年)

每400年共4*(5217周+5天)+1天(整400年閏)=20871周+0天——注意這個“0天”和

“1天”(4個整百年只有一個閏年)

即400年一輪迴!(原來萬年曆400年前是一家)

【二】根據萬年曆以上特點進行編寫:

首先對萬年曆年、月、日進行編寫,編寫程序先定義每月的天數為28天,如月份為1、3、5、7、8、10、12就定義天數為31天反之如果月份為4、6、9、11就輸出天數為30天,由上可見2月份為28天但是如果為閏年就有29天就要定義另一個函數#define Year(x) (x%4==0x%100!=0||x%400==0) ? 1:0當為閏年時可得1加上該程序便可得到每月的天數。 具體程序見(五、萬年曆程序)

再對其中的星期進行編寫:由於公元1月1日設為星期六,故3月1日為星期三,可以用萬年3月1日星期算法(特別是那個三)

由於其公式為:

某年3月1日星期幾=(3天+百年%4*5天+年/4*5天+年%4+月星期表+日-1天)%7

某年3月1日星期幾=(百年%4*5天+年/4*5天+年%4+月星期表+日+2天)%7

或 某年3月1日星期幾=(百年%4*5天+年+年/4+月星期表+日+2天)%7

閏4百年3月1日星期算法(百年%4=0)

其公式為:

某年3月1日星期幾=(年+年/4+月星期表+日+2天)%7

例:0000年3月1日星期幾=(0+0/4+0+1+2)%7=3%7=星期三

1600年3月1日星期幾=(0+0/4+0+1+2)%7=3%7=星期三

2000年3月1日星期幾=(0+0/4+0+1+2)%7=3%7=星期三

2001年3月1日星期幾=(1+1/4+0+1+2)%7=4%7=星期四

2004年3月1日星期幾=(4+4/4+0+1+2)%7=8%7=星期一

2008年3月1日星期幾=(8+8/4+0+1+2)%7=13%7=星期六

2042年3月1日星期幾=(42+42/4+0+1+2)%7=55%7=星期六

平4百年3月1日星期算法(百年%40)

其公式為:

某年3月1日星期幾=(百年%4*5天+年+年/4+月星期表+日+2天)%7

例:1700年3月1日星期幾=(17%4*5+0+0/4+0+1+2)%7=8%7=星期一(注意:1700年是平年)

1800年3月1日星期幾=(18%4*5+0+0/4+0+1+2)%7=13%7=星期六(注意:1800年是平年)

1900年3月1日星期幾=(19%4*5+0+0/4+0+1+2)%7=18%7=星期四(注意:1900年是平年)

1901年3月1日星期幾=(19%4*5+1+1/3+0+1+2)%7=19%7=星期五

1918年3月1日星期幾=(19%4*5+18+18/4+0+1+2)%7=(15+22+3)%7=40%7=星期五

1958年3月1日星期幾=(19%4*5+58/4*5+58%4+3)%7=(15+70+2+3)%7=90%7=星期六

1988年3月1日星期幾=(19%4*5+88/4*5+88%4+3)%7=(15+110+0+3)%7=128%7=星期二

1999年3月1日星期幾=(19%4*5+99/4*5+99%4+3)%7=(15+120+3+3)%7=141%7=星期一

2100年3月1日星期幾=(21%4*5+0/4*5+0%4+3)%7=(5+0+0+3)%7=8%7=星期一(注意:2100年是平年)

2101年3月1日星期幾=(21%4*5+1/4*5+1%4+3)%7=(5+0+1+3)%7=9%7=星期二

2102年3月1日星期幾=(21%4*5+2/4*5+2%4+3)%7=(5+0+2+3)%7=10%7=星期三

2103年3月1日星期幾=(21%4*5+3/4*5+3%4+3)%7=(5+0+3+3)%7=11%7=星期四

2104年3月1日星期幾=(21%4*5+4/4*5+4%4+3)%7=(5+1+0+3)%7=9%7=星期二(注意:2104年是閏年)

9999年3月1日星期幾=(99%4*5+99/4*5+99%4+3)%7=(120+15+3+3)%7=141%7=星期一

註:按400年一輪迴!(400年前是一家)的說法

1600年,2000年是一樣的;

1700年,2100年是一樣的;

1800年,2200年是一樣的;

1900年,2300年是一樣的。

其中萬年某日星期算法

其公式為:

某日星期幾=(百年%4*5天+年+年/4+月星期表+日+2天)%7

通同星期偏差表

閏年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月

天數 31 29 31 30 31 30 31 31 30 31 30 31

星期 3 6 0 3 5 1 3 6 2 4 0 2

平年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月

天數 31 28 31 30 31 30 31 31 30 31 30 31

星期 4 0 0 3 5 1 3 6 2 4 0 2

為對以上的萬年曆星期的算法是正確的對其進行了以下的計算:

⒈對於二十世紀任意日期可以用公式某日星期幾=(百年%4*5天+年+年/4+平年月星期表+日+2天)%7=(19%4*5天+年+年/4+平年月星期表+日+2天)%7=(15天+年+年/4+平年月星期表+日+2天)%7以下就是根據上面對其進行的計算:

1900年元旦 1日=(0/4*5+0%4+1+3)%7=(0+0+4)%7=4

1月表=4(平年) 故 4+4=1 即1900年元旦是星期一

1949年國慶 1日=(49/4*5+49%4+1+3)%7=(60+1+4)%7=2

10月表=4(平年) 故 4+2=6 即1949年國慶是星期六

1999年12月31日 31日=(99/4*5+99%4+31+3)%7=(120+3+34)%7=3

12月表=2(平年) 故 2+3=5 即1999年12月31日是星期五

⒉對於二十一世紀新前年蟲算法(20%4*5=0)可以用公式:某日星期幾=(百年%4*5天+年+年/4+閏年月星期表+日+2天)%7 =(20%4*5天+年+年/4+閏年月星期表+日+2天)%7以下就是根據上面對其進行的計算:

2000年元旦 1日=(0+0/4+1+2)%7=(0+0+1+2)%7=3

1月表=3(閏年) 故 3+3-6 即2027年元旦是星期六

2018年春節 16日=(18+18/4+16+2)%7=(18+4+16+2)%7=5

2月表=0(平年) 故 0+5=5 即2018年春節是星期五

2099年12月31日 31日=(99/4*5+99%4+31+2)%7=(120+3+33)%7=2

12月表=2(平年) 故 2+2=4 即2099年12月31日是星期四

對於上面的分析以及公式的推論和計算證明可以對萬年曆中的星期進行了編寫具體編寫程序見(五 、萬年曆程序)中。

五 、萬年曆源程序

#include”stdio.h”

#include”dos.h”

#include”conio.h”

#include”stdlib.h”

#define Year(x) (x%4==0x%100!=0||x%400==0) ? 1:0 /*判斷閏年*/

int numofMonth(int y,int m){

int day,t=28;

if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)

day=31; /*定義以上月份為31天*/

else if(m==4||m==6||m==9||m==11)

day=30; /*定義以上月份為30天*/

else{t+=Year(y);

day=t;} /*閏年二月29天,平年28天*/

return day;}

int numofYear(int y){

int t=365; /*平年365天*/

t+=Year(y);/*閏年366天*/

return t;}

int numofbeforeDays(int y,int m,int d){

int sum=d,i;

for(i=1;im;i++)

sum+=numofMonth(y,i);

return sum;}

int numofafterDays(int y,int m,int d){

int sum=0,i;

for(i=m;i=12;i++)

sum+=numofMonth(y,i);

sum-=d;

return sum;}

int isDay(int y,int m,int d){

int year=1900,month=1,week=1,i; /*定義萬年曆是從1900年開始*/

long sum=0;

for(i=year;iy;i++)

sum+=numofYear(i);

for(i=1;im;i++)

sum+=numofMonth(y,i);

/* ++sum;*/

i=sum%7;

week=(week+i)%7;

return week;}

void empty(int n){

int i;

for(i=0;in;i++)

printf(“%*c”,6,’ ‘);}

void OutPutCalender(int y,int m,int d)/*計算x年x月x是星期幾*/{

int week,i,num,t;

week=isDay(y,m,1);

printf(“%6d/%02d/%02d\n”,y,m,d);

printf(“%6s%6s%6s%6s%6s%6s%6s\n”,”Sun”,”Mon”,”Tue”,”Wed”,”Thu”,”Fri”,”Sat”);

empty(week);

num=numofMonth(y,m);

for(i=1;i=num;i++){

printf(“%6d”,i);

t=(week+i)%7;

if(t==0)

printf(“\n”);} /*光標移到下一行*/

printf(“\n”);}

long numBTDays(int y1,int m1,int d1,int y2,int m2,int d2)/*定義兩個不同日期*/{

int i;

long sum=0;

for(i=y1+1;iy2;i++)

sum+=numofYear(i);

if(y1==y2){ sum-=d1;

for(i=m1;im2;i++)

sum+=numofMonth(y1,i);

sum+=d2;}

else{sum+=numofafterDays(y1,m1,d1);

sum+=numofbeforeDays(y2,m2,d2);}

return sum;}

int Select_mean(){

int sm;

printf(“1. OutPut Calender\n”); /*輸出當前月份的日曆*/

printf(“2. Help\n”); /*幫助*/

printf(“0. Quit\n”); /*退出*/

printf(“Please enter choose(0–2):”); /*從0-2中選擇*/

do

scanf(“%d”,sm); /*輸入sm*/

while(sm0||sm3);

return sm;}

void Help()/*輸出幫助欄的內容*/{

printf(” 1. OutPut Calender\n”);

printf(” 2. System Help\n”);

printf(” 0. Quit\n”);

printf(“Page Up: Up year\n”); /*上一年*/

printf(“Page Down: next year\n”); /*下一年*/

printf(” — : next month\n”); /*上一月*/

printf(” — : Up month\n”);/*下一月*/}

main(){

int year=2006,year1=2006,month,day,y1,m1,d1,y2,m2,d2,c,t; /*定義運行後的日期是2006年*/

int inkeySCAN,inkey; /*輸入鍵盤操作信息*/

union REGS inregs,outregs;

inregs.h.ah=0x2a;

intdos(inregs,outregs);

/* year=outregs.xcx; */

month=outregs.h.dh;

day=outregs.h.dl;

year1=year;

printf(“%d/%02d/%02d\n”,year,month,day);

while(1)/*當選擇為1時,執行以下語句*/{

switch(Select_mean()){

case 1:

OutPutCalender(year,month,day);

while(1){

inkey=bioskey(0);

inkeySCAN=(inkey0xFF00)8;

if(inkeySCAN==77){

if(month==12){month=1;year1++;

OutPutCalender(year1,month,day);/*輸出日曆*/}

else{month++;

OutPutCalender(year1,month,day);

}}

if(inkeySCAN==75){

if(month==1){month=12;year1–;

OutPutCalender(year1,month,day);}

else{month–;OutPutCalender(year1,month,day);}}

if(inkeySCAN==73){

if(year1==1900) year1=year;

else{year1–;OutPutCalender(year1,month,day);}}

if(inkeySCAN==81){

year1++;OutPutCalender(year1,month,day);}

if(inkeySCAN==28)break;}

break; /*終止循環*/

case 2:

Help();

break;

case 0:

exit(0);

default:

printf(“Enter ERROR!\n”);

break;} }

}

六 運行過程

1.雙擊TC

1. 當對上面的程序進行了調試後運行會出現下面所示:

第一行所顯示的就是系統時間!滿足了第一條要求“顯示年、月、日”。

而當改變系統時間後!再運行該程序上面的日期也隨系統時間改變,所以滿足第四條“當系統時間變動時,能自動跳到相應的時間。”

2. 在光標處按下“1”後回車,將會顯示:

以上的顯示也證明了條件的第2條可以“顯示星期!”

3. 在光標處按下“2”後回車,將會顯示:

按着幫助所講進行了運行可知:按“ Page Up ”鍵其下面接着會顯示上一年該月的萬年曆,按“ Page Down ”鍵其下面會接着顯示下一年該月的萬年曆;按“ ← ”鍵下面將會接着顯示當年上一個月的萬年曆,按“ → ”鍵將會接着在下面顯示去下一個月的萬年曆。

4.

由上所顯示鍵入“0”後將會退去該程序。

由以上運行的結果可知該c語言所設計的萬年曆滿足設計要求!

七、在C語言編程中常見錯誤

C語言的最大特點是:功能強、使用方便靈活。C編譯的程序對語法檢查並不象其它高級語言那麼嚴格,這就給我們留下“靈活的餘地”,但還是由於這個靈活給程序的調試帶來了許多不便,尤其對我們這些初學C語言的人來說,經常會出一些連自己都不知道錯在哪裡的錯誤。看着有錯的程序,不知該如何改起,我通過這次編程,也積累了一些C編程時常犯的錯誤:

1. 書寫標識符時,忽略了大小寫字母的區別。

編譯程序把a和A認為是兩個不同的變量名,而顯示出錯信息。C語言認為大寫字母和小寫字母是兩個不同的字符。習慣上,符號常量名用大寫,變量名用小寫表示,以增加可讀性。

2.忽略了變量的類型,進行了不合法的運算。

%是求余運算,得到a/b的整餘數。整型變量a和b可以進行求余運算,而實型變量則不允許進行“求余”運算。

3.將字符常量與字符串常量混淆。

混淆了字符常量與字符串常量,字符常量是由一對單引號括起來的單個字符,字符串常量是一對雙引號括起來的字符序列。C規定以“\”作字符串結束標誌,它是由系統自動加上的,所以字符串“a”實際上包含兩個字符:‘a’和‘\’,而把它賦給一個字符變量是不行的。

4.忽略了“=”與“==”的區別。

在C語言中,“=”是賦值運算符,“==”是關係運算符。如:

if (a==3) a=b;

前者是進行比較,a是否和3相等,後者表示如果a和3相等,把b值賦給a。由於習慣問題,初學者往往會犯這樣的錯誤。

5.忘記加分號。

分號是C語句中不可缺少的一部分,語句末尾必須有分號。

a=1 b=2

編譯時,編譯程序在“a=1”後面沒發現分號,就把下一行“b=2”也作為上一行語句的一部分,這就會出現語法錯誤。改錯時,有時在被指出有錯的一行中未發現錯誤,就需要看一下上一行是否漏掉了分號。

{ z=x+y;

t=z/100;

printf(“%f”,t);

}

對於複合語句來說,最後一個語句中最後的分號不能忽略不寫(這是和PASCAL不同的)。

6.多加分號。

對於一個複合語句,如:

{ z=x+y;

t=z/100;

printf(“%f”,t);

};

複合語句的花括號後不應再加分號,否則將會畫蛇添足。

又如:

if (a%3==0);

I++;

本是如果3整除a,則I加1。但由於if (a%3==0)後多加了分號,則if語句到此結束,程序將執行I++語句,不論3是否整除a,I都將自動加1。

再如:

for (I=0;I5;I++);

{scanf(“%d”,x);

printf(“%d”,x);}

本意是先後輸入5個數,每輸入一個數後再將它輸出。由於for()後多加了一個分號,使循環體變為空語句,此時只能輸入一個數並輸出它。

7.輸入變量時忘記加地址運算符“”。

int a,b;

scanf(“%d%d”,a,b);

這是不合法的。Scanf函數的作用是:按照a、b在內存的地址將a、b的值存進去。“a”指a在內存中的地址。

8.輸入數據的方式與要求不符。scanf(“%d%d”,a,b);輸入時,不能用逗號作兩個數據間的分隔符,如下面輸入不合法:

3,4

輸入數據時,在兩個數據之間以一個或多個空格間隔,也可用回車鍵,跳格鍵tab。

scanf(“%d,%d”,a,b);C規定:如果在“格式控制”字符串中除了格式說明以外還有其它字符,則在輸入數據時應輸入與這些字符相同的字符。下面輸入是合法的:

3,4

此時不用逗號而用空格或其它字符是不對的。

3 4 3:4

又如:

scanf(“a=%d,b=%d”,a,b);

輸入應如以下形式:

a=3,b=4

9.輸入字符的格式與要求不一致。

在用“%c”格式輸入字符時,“空格字符”和“轉義字符”都作為有效字符輸入。

scanf(“%c%c%c”,c1,c2,c3);

如輸入a b c

字符“a”送給c1,字符“ ”送給c2,字符“b”送給c3,因為%c只要求讀入一個字符,後面不需要用空格作為兩個字符的間隔。

10.輸入輸出的數據類型與所用格式說明符不一致。

例如,a已定義為整型,b定義為實型

a=3;b=4.5;

printf(“%f%d\n”,a,b);

語法錯

邏輯錯 運行錯

0.忘記定義變量:

main()

{x=3;y=6;

printf(“%d\n”,x+y);

11.C語言的變量一定要先定義才能使用;

12.輸入輸出的數據的類型與所用格式說明符不一致

int a=3;float b=4.5;printf(“%f%d\n”,a,b);

它們並不是按照賦值的規則進行轉換(如把4.5轉換為4),而是將數據在存儲單元中的形式按格式符的要求組織輸出(如b佔4個字節,只把最後兩個字節的數據按%d,作為整數輸出)

13.未注意int型數據的數值範圍

int型數據的數值範圍(-32768~32768)

int num=89101;

printf(“%d”,num);

會將超過低16位的數截去從而得到23563

注意:定義了long型,而在輸出時仍用”%d”說明符,仍會出現以上錯誤

14.輸入變量時忘記使用地址符

scanf(“%d%d”,a,b);

15.輸入時數據的組織與要求不符

對scanf函數中格式字符串中除了格式說明符外,對其他字符必須按原樣輸入

16.誤把”=“作為”等於”比較符

“=“為附值運算符

“==“為比較運算符

17.語句後面漏分號

{

t=a;

a=b;

b=t

}

它是pascal的語法

18.不該加分號的地方加了分號

if(ab);

printf(“a is larger than b\n”);

for(i=0;i10;i++);

{

scanf(“%d”,x);

printf(“%d\n”,x*x);

}

19.對應該有花括弧的複合語句,忘記加花括弧

sum=0;

i=1;

while(i=100)

sum=sum+1;

i++;

20.括弧不配對

while((c=getchar()!=‘#’)

putchar(c);

11.在用標識時,忘記了大寫字母和小寫字母的區別

{

int a,b,c;

a=2;

b=3;

C=A+B;

printf(“%d+%d=%D”,A,B,C);

}

12.引用數組元素時誤用發圓括弧

{

int i,a(10);

for(i=0;i10;i++)

scanf(“%d”,a(i));

}

13.在定義數組時,將定義的”元素個數”誤認為是”可使用的最大下標值

{

int a[10]={1,2,3,4,5,6,7,8,9,10};

int i;

for(i=1;i=10;i++)

printf(“%d”,a[i]);

}

14.對二維或多維數組的定義和引用的方法不對

{

int a[5,4];

printf(“%d”,a[1+2,2+2]);

}

15.誤以為數組名代表數組中全部元素

{int a[4]={1,2,3,4};

printf(“%d%d%d%d”,a);

}

16.混淆字符數組與字符指針的區別

main()

{

char str[40];

str=“Computer and c”;

printf(“%s\n”,str);

}

17.在引用指針變量之前沒有對它賦予確定的值

{

char *p;

scanf(“%s”,p);

}

{

char *p,c[20];

p=c;

scanf(“%s”,p);

}

18.switch語句的各分支中漏寫 break語句

混淆字符和字符串的表示形式

char sex;

sex=“M”;

19.使用自加(++)和自減(–)運算符時出的錯誤

{

int *p,a[5]={1,3,5,7,9};

p=a;

printf(“%d”,*p++);

}

注意於*(++p)的區別;

20.所調用的函數在調用語句之後才定義,而又在調用前未加說明

main()

{float x,y,z;

x=3.5;y=-7.6;

z=max(x,y);

printf(“%f”,z);

}

編譯時不給出出錯信息,但運行結果將與原意不符。這種錯誤尤其需要注意。

八、心得體會

1. 目前流行的計算機日曆程序,比較典型的是Windows各版本中的日曆程序以及基礎於該程序所開發的各種應用程序中的日曆程序。然而,這些程序都千篇一律的局限在一個很短的時間範圍內。(Windows各個版本一般都局限在1980年至2099年這一範圍內),但是,在很多情況下,特別是在眾多的科學研究領域中,一個時間跨度較大的日曆程序是很有參考價值的。C程序設計語言充分發揮了其自身無與倫比的優越性,用極短的程序文本填補了這一領域的空白,同時用鐵的事實強有力的告訴世人:C程序設計語言作為計算機語言家族的新生事物,其發展前景是極為廣闊的。

2. 經過上一個學期對《C程序設計》的學習,我們學習了理論知識,了解了C語言程序設計的思想,這些知識都為我們的下一步學習打下了堅實的基礎。通過課程設計,一方面是為了檢查我們一個學期來我們學習的成果,另一方面也是為了讓我們進一步的掌握和運用它,同時也讓我們認清自己的不足之處和薄弱環節,加以彌補和加強。

3. 通過對c語言萬年曆的設計進一步的鞏固了用c語言編寫程序,並且有利於更好的掌握c語言!

4. 在萬年曆的編寫過程中也體會到了做事情一頂要細心、認真。更加知道了要掌握好基礎知識。還有體會到了成功的感覺!在萬年曆的設計過程中更加體會到了團隊合作的重要性,“一個諸葛亮比不上三個臭皮匠。”知道了只有團隊合作才會更好的完成設計!也體會到以後在工作中團隊合作的必要性和重要性!

5. 通過本項課程設計也培養了我獨立思考、 綜合運用所學有關相應知識的能力,掌握 工程軟件設計的基本方法,強化上機動手編程能力,闖過理論與實踐相結合的難關!

6. 由於C語言是近年在國內外得到迅速推廣應用的一種語言。C語言功能豐富,表達能力強,使用靈活方便,應用面廣,目標程序效率高,可移植性好,既具有高級語言的優點,又具有低級語言的許多特點。通過這次的c語言程序設計更加了解了c語言的好處和其可用性!

7. 在這次課程設計中也知道了自己的動手能力不強有待進一部的提高!在設計過程中不能夠把書本上的知識與實踐相結合,這也就增加了設計不好該程序的想法!在設計過程中的一次次設計錯誤增加了我放棄的想法!不過經過大家的努力終於完成了課程設計!完成該程序後想起自己以前的每一次對自己失去信心,就覺得並不是在知識掌握上打敗了,而是自己對自己缺乏信心!只要自己對自己不失去信心相信就可以完成那些以前認為完成不了的事情!也讓我懂得了要想成功首先就必須有很強的自信心!懂得了自己以後要在做任何事情時都要自信!當自己都不相信自己能夠成功時還可能會獲得成功嗎?

8. 在C語言程序設計的過程中也知道了自己在以前的學習中有很大的不足導致在設計過程中出現了很多的問題,有些地方看不懂也不知道怎麼去設計,但是在設計過程中也學習了很多,掌握了自己以前沒有學好的知識,雖然一時可以掌握完以前沒有學好的知識,不過也給自己敲響了警鐘,在學習中不可以伏於表面,要想學好每一門課程都要踏踏實實,做什麼都不是給別人看的!都是要更好的掌握該門知識,提高自己的自身的修養,提高自己的能力!為以後的工作打下良好的知識基礎和技能基礎!

九、參考文獻

⒈譚浩強編著.C程序設計第二版〔M〕.北京:清華大學出版社,1999

⒉陳朔鷹,陳英編著.C語言趣味程序百例精解〔M〕.北京:北京理工大學出版社,1994

⒊電腦知識與技術學術交流版〔J〕2005.2 (備註:來自網絡資源)

⒋Herbert Schildit著. 戴健鵬譯. C語言大全 (第二版)〔M〕.北京:電子工業出版社,1994

⒌譚浩強,張基溫,唐永炎編著. C語言程序設計教程.〔M〕北京: 高等教育出版社,1992

⒍秦友淑,曹化工編著. C語言程序設計教程. 〔M〕武漢:華中理工大學出版社,1996

⒎曹衍龍,林瑞仲,徐慧 編著.C語言實例解析精粹 〔M〕北京:人民郵電出版社,2005.3

⒏黃明等編著.21世紀進階輔導C語言程序設計. 〔M〕大連理工大學出版

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/247764.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 13:23
下一篇 2024-12-12 13:23

相關推薦

  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python數據處理課程設計

    本文將從多個方面對Python數據處理課程設計進行詳細闡述,包括數據讀取、數據清洗、數據分析和數據可視化四個方面。通過本文的學習,讀者將能夠了解使用Python進行數據處理的基本知…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • Python語言由荷蘭人為中心的全能編程開發工程師

    Python語言是一種高級語言,很多編程開發工程師都喜歡使用Python語言進行開發。Python語言的創始人是荷蘭人Guido van Rossum,他在1989年聖誕節期間開始…

    編程 2025-04-28
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28
  • Python語言實現人名最多數統計

    本文將從幾個方面詳細介紹Python語言實現人名最多數統計的方法和應用。 一、Python實現人名最多數統計的基礎 1、首先,我們需要了解Python語言的一些基礎知識,如列表、字…

    編程 2025-04-28
  • Python作為中心語言,在編程中取代C語言的優勢和挑戰

    Python一直以其簡單易懂的語法和高效的編碼環境而著名。然而,它最近的發展趨勢表明Python的使用範圍已經從腳本語言擴展到了從Web應用到機器學習等廣泛的開發領域。與此同時,C…

    編程 2025-04-28

發表回復

登錄後才能評論