『壹』 c語言課程報告設計
一 引言
人類已進入21世紀,科學技術突飛猛進,經濟知識和信息產業初見端倪,特別是信息技術和網路技術的訊速發展和廣泛應用,對社會的政治、經濟、軍事、文化等領域產生越來越深刻的影響,也正在改變人們的工作、生活學習、交流方式。信息的獲取、處理、交流和應用能力,已經成為人們最重要的能力之一。 在不久的將來知識經濟將佔世界經濟發展的主導地位,國家綜合國力和國際競爭能力越來越取決於教育發展、科學技術和知識創新的水平,教育在經濟和社會發展過程中將呈現出越來越突出的重要作用。學生成績管理系統是一個學校不可缺少的部分,它的內容對於學校的決策者和管理者來說都至關重要,所以學生成績管理系統應該能夠為用戶提供充足的信息和快捷的查詢手段。
1 系統的需求分析
當今時代是飛速發展的信息時代,在各行各業中離不開信息處理,這正是計算機被廣泛應用於信息管理系統的環境。計算機的最大好處在於利用它能夠進行信息管理。使用計算機進行信息控制,不僅提高了工作效率,而且大大的提高了其安全性。尤其對於復雜的信息管理,計算機能夠充分發揮它的優越性。
管理信息系統是進行信息的採集、存儲、加工、維護和使用的系統[1,2],它是隨著管理科學和技術科學的發展而形成的。學生成績管理系統是一個教育單位不可缺少的部分,它的內容對於學校的決策者和管理者來說都至關重要,所以學生成績管理系統應該能夠為用戶提供充足的信息和快捷的查詢手段,對學生來說可以輕松的查閱自己在校的成績以及信息等。但是一直以來人們都是靠傳統人工的方式管理學生成績,這種管理方式存在著許多缺點,如:效率低,另外時間一長,將產生大量的文件和數據,這對於查找、更新和維護都帶來了不少的困難。
另外,隨著學校規模的不斷擴大,專業、班級、學生的數量急劇增加,有關學生各門課程的成績的各種信息量也成倍增長,而目前許多高校的學生成績管理仍停留在復雜的人工操作上,重復工作較多,工作量大,效率低,因此,迫切需要開發學生成績管理系統。
2 設計系統的意義
在學生成績的規范管理、科學統計和快速查詢方面具有較大的實用意義。它提高了信息的開放性,大大地改善了學生、教師對其最新信息查詢的准確性。建立學生成績管理系統,採用計算機對學生成績進行管理,進一步提高辦學效益和現代化水平。幫助廣大教師提高工作效率,實現學生成績信息管理工作流程的系統化、規范化和自動化。
作為計算機應用的一部分,使用計算機對學生成績管理系統進行信息管理,有著手工管理所無法比擬的優點,這些優點能夠極大地提高學生成績系統管理的效率,也是學校的科學化、正規化管理重要條件。
二 系統總體設計
1 系統設計方案
通過本課程設計可以在復習、鞏固C語言的基礎知識的同時,進一步加深對C語言的理解和掌握。主要運用C語言中的結構體、數組、鏈表、文件等數據結構進行設計一個簡單的管理系統應用程序,使程序具有數據錄入、查詢、刪除、顯示等基本功能。主要的設計思想是通過編寫各種不同類型的函數模塊來實現該系統的不同功能,還採用創建結構體類型來見不同的數據類型組合成一個有機的整體。
2 函數實現說明:
(1) luru( )函數:
該函數主要用於數據的輸入和添加,將各個學生的成績信息准確錄入到系統中為後面的操作提供基礎數據,以供學生查詢。
(2) display( )函數:
該函數是一個顯示函數。它通過for語句的運用,將所有已輸入的學生成績信息清楚的顯示在眼前,使我們對學生成績一目瞭然。
(3) paixu( )函數:
該函數構成了一個排序模塊,它實現了學生成績的排序。該函數定義的變數雖少,但通過文件的連接和if循環語句的使用[1],該功能完整的顯現出來了,仍然使用for語句,實現了目標。
(4) del( )函數:
該函數實現的是刪除功能。該函數雖然定義的變數不多,但通過if語句和scanf語句的使用,對文件進行了讀取和運用,簡便的刪除所選的目標。
(5) chaxun1( )和chaxun2( )函數:
該函數都是通過if和for語句實現不同的查詢功能,前者是根據學號查詢,後者是根據姓名查詢。
(6) main()函數:
一個程序主函數不能少。當以上的函數均編完之後,要實現各個功能操作的連接,還必須有主函數將它們聯系起來,這樣才能達到理想的結果。對以上函數的連接,此程序採用了switch語句,格式清晰、容易接受。至此學生成績管理的基本功能便基本實
3 系統總體設計框圖
圖1 系統總體設計框圖
3系統總體設計流程圖
圖2 系統總體設計流程圖
三 詳細設計
1 錄入函數
圖3 錄入函數設計流程圖
2 顯示函數
圖4 顯示函數設計流程圖
3 排序函數
圖5 排序函數設計流程圖
4 按照學號查詢
圖6 學號查詢函數設計流程圖
5 按照姓名查詢
圖7 姓名查詢函數設計流程圖
四 總結
經歷了這次學生成績管理程序的編輯之後,我們發現編程初看起來似乎是一件很枯燥、乏味的事情,但是其實裡面還是充滿樂趣的。雖然本程序運用的函數不多,再編寫過程中也出現這樣那樣的錯誤,這一切的一切無疑地說明我是多麼粗心,自己還有很多要學的東西。編程尤其是調試,是一項細致深入的工作,需要下工夫、動腦子、善於積累經驗,這往往能反映出一個人的水平、經驗和科學態度。我在編寫系統過程中曾經出現系統報錯但就是找不到原因在哪兒,最後咨詢老師才知道原來區分全形半形的。另外,編譯、連接的成功並不意味著程序的最終成功。邏輯上的錯誤機器不易檢查出來,這時需要對數據結果進行分析。這種錯誤的查找是最難的,需要編程序的人有相當的耐心和細心去把問題找出來。這也是本次程序編輯過程中碰到的最大的難題。
不過值得高興的是最後還是完成任務,雖然這個系統還不算好,還有很多功能不能實現,但能在能有這樣的成果我很欣慰。在編寫程序的過程中,我們得到了老師的精心指導以及孜孜不倦的教誨,在老師的指導下,我們的能力得到了提高,同時養成了科學、嚴謹的作風和習慣,在此,我們對老師的精心栽培表示衷心的感謝!
參考文獻
[1]譚浩強,張基溫.C語言程序設計教程[M].第3版.高等教育出版社,2006
[2] 袁志祥,秦鋒主.數據結構(C語言版)例題詳解與課程設計指導.第二版.中國科學技術大學出版社出版.112
附錄
……
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct score /*各科成績*/
{
float s;
};
struct student /*學生數據*/
{
int num;
struct score f[9];
char name[20];
float ave;
float sum;
};
int i=0; /*統計個數*/
struct student stu[99];
void luru(struct student a[] ); /*錄入函數*/
void paixu(struct student a[]); /*排序函數*/
void del(struct student a[]); /*刪除函數*/
void display(struct student a[]); /*顯示函數*/
void cprint(struct student a[],int m); /*查詢輸出函數*/
void chaxun1(struct student a[]); /*學號查詢函數*/
void chaxun2(struct student a[]); /*姓名查詢函數*/
void main()
{ int number;
printf("\n\n");
printf(" 歡迎使用學生成績管理系統 \n");
printf("-------------------------------------------------------------\n\n");
printf(" ****************** 學生成績管理系統 ****************** \n\n\n");
printf("1.錄入新學生成績數據 ");
printf("2.顯示學生成績數據\n\n");
printf("3.按總成績排序 ");
printf("4.刪除學生成績數據\n\n");
printf("5.按學生學號查詢 ");
printf("6.按學生姓名查詢\n\n");
printf("7.退出\n\n\n");
printf("\t\t\t請輸入功能選擇編號(1-7):\n");
printf("**************************************************************\n");
do
{
scanf("%d",&number);
printf("--------------------------------------------------------------\n");
switch (number)
{
case 1:luru(stu);break; /*錄入新學生成績數據*/
case 2:display(stu);break; /*顯示學生成績數據*/
case 3:paixu(stu);break; /*按總成績排序*/
case 4:del(stu);break; /*刪除學生成績數據*/
case 5:chaxun1(stu);break; /*按學生學號查詢*/
case 6:chaxun2(stu);break; /*按學生姓名查詢*/
case 7:break; /*退出*/
}
}while(number!=7);
printf("--------------------------------------------------------------\n");
printf(" 謝謝使用! ");
}
void luru(struct student a[]) /*錄入函數*/
{
int m;
int k;
char b;
float sum=0;
printf("請輸入科目數(最多6科):");
scanf("%d",&m);
printf("請輸入學生信息\n");
do
{
printf("學號:");
scanf("%d",&a[i].num);
printf("姓名:");
scanf("%s",a[i].name);
for(k=0;k<m;k++)
{
printf("請輸入第%d科目成績:",k+1);
float temp;
scanf("%f",&temp);
a[i].f[k].s = temp;
}
/*計算總分*/
a[i].sum=0;
for(k=0;k<m;k++)
{
a[i].sum=a[i].sum+a[i].f[k].s;
}
/*計算平均分*/
a[i].ave=0;
a[i].ave=a[i].sum/m;
i++;
printf("是否繼續錄入學生數據?\n(Y/N)");
fflush(stdin); /*刷新標准輸入緩沖區*/
scanf("%c",&b);
}while(b=='Y'||b=='y');
display(a);
}
void display(struct student a[]) /*顯示函數*/
{
int k,m;
system("cls"); /*清屏*/
printf("學號\t姓名\t第1科\t第2科\t第3科\t第4科\t第5科\t第6科\t總分\t平均分\n");
printf("\n------------------------------------------------------------------------------\n\n");
for(k=0;k<i;k++)
{
printf("%d\t%s\t",a[k].num,a[k].name);
for(m=0;m<6;m++)
{
printf("%.2f\t",a[k].f[m].s);
}
printf("%.2f\t%.2f\n",a[k].sum,a[k].ave);
}
printf("\n------------------------------------------------------------------------\n\n");
printf("請選擇功能:\n1.錄入\t2.顯示\t3.排序\t4.刪除\t5.學號查詢\t6.姓名查詢\t7.退出\n\n");
}
void paixu(struct student a[]) /*排序函數*/
{
int j,k;
struct student temp;
for(k=0;k<i;k++)
{
for(j=0;j<i-k;j++)
{
if(a[j].ave<a[j+1].ave)
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
printf("按總分排升序後的學生數據如下\n");
display(a);
}
void del(struct student a[]) /*刪除函數*/
{
int k,j;
printf("請輸入要刪除的學生學號:");
scanf("%d",&k);
for(j=0;j<i;j++)
{
if(k==a[j].num) /*記錄要刪除的學生的位置*/
{
break;
}
}
if (j<i)
{
for(;j<i;j++)
{
a[j]=a[j+1];
}
i--;
printf("刪除後的學生數據\n");
display(a);
}
else
{
printf("\n\t\t沒有您要刪除的學生數據\n\n");
printf("\n請選擇功能:\n1.錄入\t2.顯示\t3.排序\t4.刪除\t5.學號查詢6.姓名查詢\t7.退出\n\n");
}
}
void cprint(struct student a[],int m)/*查詢輸出函數*/
{
int o;
system("cls"); /*清屏*/
printf("學號\t姓名\t第1科\t第2科\t第3科\t第4科\t第5科\t第6科\t總分\t平均分\n");
printf("\n------------------------------------------------------------------------------\n\n");
printf("%d\t%s\t",a[m].num,a[m].name);
for(o=0;o<6;o++)
{
printf("%.2f\t",a[m].f[o].s);
}
printf("%.2f\t%.2f\n",a[m].sum,a[m].ave);
printf("\n------------------------------------------------------------------------------\n\n");
printf("\n請選擇功能:\n1.錄入\t2.顯示\t3.排序\t4.刪除\t5.學號查詢\t6.姓名查詢\t7.退出\n\n");
}
void chaxun1(struct student a[])/*學號查詢函數*/
{
int m,t;
printf("請輸入要查詢的學號:");
scanf("%d",&t);
for(m=0;m<=i;m++)
{
if(a[m].num==t)
{
cprint(a,m);
break;
}
if(m==i&&a[m].num!=t)
{
system("cls"); /*清屏*/
printf("\n\t\t沒有查到您要找的學生資料\n");
printf("\n--------------------------------------------------------------------------------\n");
printf("\n請選擇功能:\n1.錄入\t2.顯示\t3.排序\t4.刪除\t5.學號查詢\t6.姓名查詢\t7.退出\n\n");
}
}
}
void chaxun2(struct student a[]) /*姓名查詢函數*/
{
int m;
char t[20];
printf("請輸入要查詢的姓名:");
scanf("%s",t);
for(m=0;m<=i;m++)
{
if(strcmp(a[m].name,t)==0)
{
cprint(a,m);
break;
}
if(m==i&&(strcmp(a[m].name,t)!=0))
{
system("cls"); /*清屏*/
printf("\n\t\t沒有查到您要找的學生資料\n");
printf("\n--------------------------------------------------------------------------------\n");
printf("\n請選擇功能:\n1.錄入\t2.顯示\t3.排序\t4.刪除\t5.學號查詢\t6姓名查詢\t7.退出\n\n");
}
}
}
『貳』 求完整C語言程序設計報告!!
C語言課程設計報告--學生成績管理系
C語言課程設計報告:
學生成績管理系統
系統需求
一、 當前學生信息:通過結構體struct student 來保存學生的姓名,學號,性別,語文,數學,英語和計算機等等相關信息,並且通過cin函數來進行給當前學生輸入初始信息.
二、學生成績查詢: 輸入一個學號, 在文件中查找此學生, 若找到則輸出此學生的全部信息和成績; 若找不到則輸出查找失敗的信息. 同時也可以全部把各科的平均成績,最高和最低分輸出。
三、新生插入 :通過給該生的學號來和原班上的學生的學號比較大小,若大就在後,若小則靠前排,將此生的信息保存下來。
四、輸出全部學生信息和全部學生成績。
五、退出系統.
六、附加說明:系統將來完善的功能有:可以通過性別來模糊查詢,也可以通過姓名的姓來先進行模糊查詢,以便後面精確查找。
總體設計
一、 仔細閱讀系統要求,首先將此系統化分為如下模塊(即如下函數)
1、輸入初始的學生信息:其中包括學生的姓名、學號和性別以及學生的語文、數學、英語和計算機等相關信息;可用函數cin(stu *p1)來實現此操作。
2、查詢模塊:可用stu *lookdata(stu *p1) 來實現。找到就輸出此學生全部信息包括學生的語文、數學、英語和計算機等的成績。
3、插入模塊:可用insert( )函數來實現。其中通過學號的大小來比較的,並且以此來排序。
4、輸出學生的信息以及成績:通過學生的姓名來查看學生的語文、數學、英語和計算機等相關成績,同時也可以分別通過caverage() 、 maverage() 、eaverage() 和comaverage() 來輸出語文、數學、英語和計算機等成績的平均分數、最高和最低分數。
5、退出系統:可用一個函數exit()來實現,首先將信息保存到文件中,釋放動態創建的內存空間,再退出此程序。
二、系統主模塊結構圖:
詳細設計
一、 界面設計
此系統界面採用圖形和數字化菜單設計。
主界面設計如下:
學生成績管理系統
請選擇相應的數字執行相應的功能:
1:是否輸入其他數據
2:查看數據
3:插入數據
4:查找數據
5:更新數據
6:保留數據
7:顯示或列印數據
8:語文成績狀況
9:數學成績狀況
10:英語成績狀況
11:計算機成績狀況
12:?
13:退出系統
二、 數據結構設計:
程序設計中用到的結構體類型:
學生信息結構體類型:
typedef struct student{
char name[MAX];
int num[MAX];
char sex[MAX];
int chinese;
int mathematic;
int english;
int computer;
struct student *next;
}
程序代碼:
//原始密碼是123456
#include"stdio.h"
#include"stddef.h"
#include"stddef.h"
#include"string.h"
#define MAX 10
typedef struct student{ /*定義結構體*/
char name[MAX]; /*姓名*/
int num[MAX]; /* 學號*/
char sex[MAX]; /*性別*/
int chinese; /*語文*/
int mathematic; /* 數學*/
int english; /*英語*/
int computer; /*計算機*/
struct student *next; /*結構體指針*/
}stu;
stu *head; /*頭指針*/
void print() /*顯示或列印函數*/
{
system("cls");
printf("\t\t\tScore Manage System\n"); /*成績管理系統*/
printf("<1>Enter Record\t"); /*輸入數據*/
printf("<2>Display\t"); /*顯示*/
printf("<3>Insert\t"); /*插入數據*/
printf("<4>Quest\t"); /*訪問數據*/
printf("<5>Update\t"); /*以前數據*/
printf("<6>Save\t"); /*保留數據*/
printf("<7>Fresh\t"); /*更新數據*/
printf("<8>Chinese Average\t"); /*語文平均成績*/
printf("<9>Math Average\t"); /*數學平均成績*/
printf("<10>English Average\t"); /*英語平均成績*/
printf("<11>Computer Average\t"); /*計算機平均成績*/
printf("<12>Quit\t\n"); /*退出*/
}
void cin(stu *p1) /*輸入相關數據的函數*/
{ printf("Enter name:\n");
scanf("%s",&p1->name);
printf("Enter num:\n");
scanf("%d",&p1->num);
printf("Enter sex:\n");
scanf("%s",&p1->sex);
printf("Enter score:\n");
printf("Enter chinese:\n");
scanf("%d",&p1->chinese);
printf("Enter math:\n");
scanf("%d",&p1->mathematic);
printf("Enter English:\n");
scanf("%d",&p1->english);
printf("Enter Computer:\n");
scanf("%d",&p1->computer);
}
stu *cindata() /*其他數據是否繼續輸入的函數*/
{ stu *p1,*p2;
int i=1;
char ch;
p1=(stu *)malloc(sizeof(stu));
head=p1;
while(i)
{
cin(p1);
printf("Do you Want to Continue?yes or no"); /*是否繼續輸入數據*/
ch=getchar();
ch=getchar();
if(ch=='n'||ch=='N')
{ i=0;
p1->next=NULL;
}
else
{ p2=p1;
p1=(stu *)malloc(sizeof(stu));
p2->next=p1;
}
}
return(p1->next);
}
stu *lookdata(stu *p1) /*查看數據的函數*/
{
while(p1!=NULL)
{ printf("Num:%d\t",p1->num);
printf("Name:%s\t",p1->name);
printf("Sex:%s\t",p1->sex);
printf("\n");
printf("Chinese:%d\t",p1->chinese);
printf("Math:%d\t",p1->mathematic);
printf("English:%d\t",p1->english);
printf("Computer:%d\t",p1->computer);
printf("\n");
p1=p1->next;
}
return p1;
}
void insert() /*通過比較學號來插入數據的函數*/
{ stu *p1,*p3,*p2;
char ch;
p1=head;
p3=(stu *)malloc(sizeof(stu));
p3->next=NULL;
if(head==NULL){ head=p3; return;}
cin(p3);
while(p1!=NULL&&(p1->num<p3->num)) /*通過學號的比較來插入*/
{ p2=p1;p1=p1->next;}
if(p2==head) {p3->next=head; head=p3; return;}
p3->next=p1;
p2->next=p3;
}
find(stu *p2) /*通過姓名查找查看數據的函數*/
{ char name[20];
int b=0;
printf("Enter the name of the student you want to find:"); /*通過姓名查看*/
scanf("%s",name);
while(p2!=NULL)
{if(strcmp(name,p2->name)==0)
{
printf("The data you want has be found\n");
printf(" Name:%s\t",p2->name);
printf("Num:%d\t",p2->num);
printf("sex%s\t",p2->sex);
printf("\n");
printf("Chinese:%d\t",p2->chinese);
printf("Math:%d\t",p2->mathematic);
printf("English:%d\t",p2->english);
printf("Computer:%d\t",p2->computer);
printf("\n");
b=1;
}
else if(b==0)
printf("sorry not find data!");
p2=p2->next;
}
if(b==1)
{
print();
printf("Find one\n");}
else
{print();
printf("Not find\n");
}
}
void caverage() /*求各學生語文平均分、最高和最低分成績的函數*/
{ stu *p1;
int i;
float max=0.0,min=200.0;
float sum=0.0,aver=0;
p1=head;
if(p1==NULL)
printf("not data!");
else
{for(i=0;p1!=NULL;i++,p1=p1->next)
sum+=p1->chinese;
aver=sum/i;
p1=head;
for(i=0;p1!=NULL;i++,p1=p1->next)
{if(max<p1->chinese)
max=p1->chinese;
}
p1=head;
for(i=0;p1!=NULL;i++,p1=p1->next)
if(min>p1->chinese)
min=p1->chinese;
}
printf("Chinese Average:%f",aver);
printf("Chinese Max:%f",max);
printf("Chinese Min:%f",min);
}
void maverage() /*求各學生數學平均分、最高和最低分成績的函數*/
{ stu *p1;
int i;
float max=0.0,min=200.0;
float sum=0.0,aver=0;
p1=head;
if(p1==NULL)
printf("not data!");
else
{for(i=0;p1!=NULL;i++,p1=p1->next)
sum+=p1->mathematic;
aver=sum/i;
p1=head;
for(i=0;p1!=NULL;i++,p1=p1->next)
{if(max<p1->mathematic)
max=p1->mathematic;
}
p1=head;
for(i=0;p1!=NULL;i++,p1=p1->next)
if(min>p1->mathematic)
min=p1->mathematic;
}
printf("Mathe Average:%f",aver);
printf("Mathe Max:%f",max);
printf("Mathe Min:%f",min);
}
void eaverage() /*求各學生英語平均分、最高和最低分成績的函數*/
{ stu *p1;
int i;
float max=0.0,min=200.0;
float sum=0.0,aver=0;
p1=head;
if(p1==NULL)
printf("not data!");
else
{for(i=0;p1!=NULL;i++,p1=p1->next)
sum+=p1->english;
aver=sum/i;
p1=head;
for(i=0;p1!=NULL;i++,p1=p1->next)
{if(max<p1->english)
max=p1->english;
}
p1=head;
for(i=0;p1!=NULL;i++,p1=p1->next)
if(min>p1->english)
min=p1->english;
}
printf("English Average:%f",aver);
printf("English Max:%f",max);
printf("English Min:%f",min);
}
void comaverage() /*求各學生計算機平均分、最高和最低分成績的函數*/
{ stu *p1;
int i;
float max=0.0,min=200.0;
float sum=0.0,aver=0;
p1=head;
if(p1==NULL)
printf("not data!");
else
{for(i=0;p1!=NULL;i++,p1=p1->next)
sum+=p1->computer;
aver=sum/i;
p1=head;
for(i=0;p1!=NULL;i++,p1=p1->next)
{if(max<p1->computer)
max=p1->computer;
}
p1=head;
for(i=0;p1!=NULL;i++,p1=p1->next)
if(min>p1->computer)
min=p1->computer;
}
printf("Computer Average:%f",aver);
printf("Computer Max:%f",max);
printf("Computer Min:%f",min);
}
update(stu *p2) /*通過姓名查找來更新數據*/
{
char name[10]; /*p2為指向結構體struct student的指針*/
int b=0;
printf("Enter The Name"); /*輸入姓名*/
scanf("%s",name);
while(p2!=NULL)
{if(strcmp(name,p2->name)==0)
{
printf("Find you data\n");
scanf("Name:%s",p2->name);
scanf("Num:%s",p2->num);
scanf("Sex:%s",p2->sex);
scanf("Chinese:%d",p2->chinese);
scanf("Math:%d",p2->mathematic);
scanf("english:%d",p2->english);
scanf("Computer:%d",p2->computer);
printf("Success!");
b=1;}
else if(b==0)
printf("Sorry not Find data!");
p2=p2->next;}
if(b==0)
{print();
printf("Sorry not Find data!");
}
else
{
print();
printf("Finish!");
}
}
save(stu *p2) /*保留數據函數*/
{
FILE *fp;
char file[10];
printf("Enter file name"); /*輸入文件名*/
scanf("%s",file);
fp=fopen(file,"w");
while(p2!=NULL)
{
fprintf(fp,"%s",p2->name);
fprintf(fp,"%s",p2->num);
fprintf(fp,"%s",p2->sex);
fprintf(fp,"%d",p2->chinese);
fprintf(fp,"%d",p2->mathematic);
fprintf(fp,"%d",p2->english);
fprintf(fp,"%d",p2->computer);
p2=p2->next;
}
fclose(fp);
}
char password[7]="123456"; /*定義初始密碼*/
void main() /*主函數*/
{ int choice;
stu *p2;
char s[8];
int flag=0,i; /*標志項*/
int n=3;
do{ printf("Enter password:\n");
scanf("%s",s);
if(!strcmp(s,password)) /*進行密碼匹配驗證*/
{ printf("PASS\n\n\n");
flag=1;
break;
}
else{
printf("Error Enter again:\n");
n--;
}
}
while(n>0);
if(!flag)
{printf("you have Enter 3 times!"); /*輸入密碼超過了3次!!*/
exit(0); /*自動退出*/
}
/*密碼驗證成功後進入的界面*/
printf("~~~~~~~~~~\t\t\t~~~~~~~~~~~~\n"); /*操作界面*/
printf("\t\tWelcom to the Mis\n");
printf("Author:-----\tClass:------\tNum:------\n"); /*作者,班級和號碼*/
printf("Adress:HG\n"); /*地址*/
printf("%%%%%%%%%%%%%%%%%%%%%%%%%%%\n");
printf("\t\tEnter OP:\n");
printf("\n\n\n\n");
printf("==============\t\t==============\n");
printf("==============\t\t==============\n");
printf("\t\tEnter the MIS yes or no\n"); /*問進入系統與否*/
scanf("%d",&choice);
if(choice=='n'||choice=='N')
exit(1);
print();
while(1)
{
printf("Enter choice:");
scanf("%d",&i);
if(i<1||i>13)
{
printf("Enter num from 1 to 13:\n"); /*再從1-13中進行選擇*/
exit(1);
}
switch(i)
{ case 1:
p2=cindata(); /*其他數據是否繼續輸入的函數*/
break;
case 2:
p2=lookdata(head); /*查看數據的函數*/
break;
case 3:
insert(); /*通過比較學號來插入數據的函數*/
break;
case 4:
find(head); /*通過姓名查找查看數據的函數*/
break;
case 5:
update(head); /*通過姓名查找來更新數據*/
break;
case 6:
save(head); /*保留數據函數*/
break;
case 7:
print(); /*顯示或列印函數*/
break;
case 8:
caverage(); /*求各學生語文平均分、最高和最低分成績的函數*/
break;
case 9:
maverage(); /*求各學生數學平均分、最高和最低分成績的函數*/
break;
case 10:
eaverage(); /*求各學生英語平均分、最高和最低分成績的函數*/
break;
case 11:
comaverage(); /*求各學生計算機平均分、最高和最低分成績的函數*/
break;
case 12:
; /*空操作*/
case 13:
exit(1); /*退出*/
break;
}
scanf("%d",&i);
}
}
程序中出現的問題及解決方法
問題一、學生初始信息模塊:
其中包括學生的姓名、學號和性別以及學生的語文、數學、英語和計算機等相關信息;可用函數cin(stu *p1)來實現此操作。當正確輸入存在的學生學號,系統進行判斷時,提示不存在此學生。
解決辦法及步驟:
1、一個個輸出所有的學生的學號,檢查文件中是否有此學生,發現有。
2、既然有此學生,那麼檢查循環判斷是否有此學生的語句發現沒有錯
3、輸出用於循環檢查語句中的學生信息,發現亂碼
4、仔細分析亂碼的原因,最後發現是變數的類型錯誤,錯將學生類型的結構體指針變數定義為了其他類型的指針變數。
問題二、查詢模塊:
可用stu *lookdata(stu *p1) 來實現。找到就輸出此學生全部信息包括學生的語文、數學、英語和計算機等的成績。當正確輸入查找信息時,系統卻不能夠得到所要查找的學生信息以及學生的語文、數學、英語和計算機的成績。
解決辦法及步驟:
1、檢查所編寫的程序代碼是否完全正確,若不是,則改之,然後再繼續正確輸入查找信息看能否得到所要查找的學生信息以及學生的語文、數學、英語和計算機的成績。
2、檢查當我們在輸入查找信息時,看是否我們輸入的信息有誤,若是這樣的話,我們應當仔細輸入查找信息。
問題三、插入模塊:
可用insert( )函數來實現。其中通過學號的大小來比較的,並且以此來排序。當我們輸入插入信息時,系統卻提示插入不進數據。
解決辦法及步驟:
1、檢查所編寫的程序代碼是否完全正確,若不是,則改之,然後再繼續正確輸入插入信息看能否插入進去得到所要插入的學生信息以及學生的語文、數學、英語和計算機的成績。
2、檢查當我們在輸入插入信息時,看是否我們輸入的插入信息有
『叄』 急求c語言編寫學生成績分段統計設計報告
#include<stdio.h>
#defineMAX_STUDENT_NUM30/*最大學生人數*/
/*統計各段成績的人數*/
voidcountNum(int*count,int*score,int*average)
{
int*p=score;
int*ph=p+MAX_STUDENT_NUM;
while(*p>0&&p<ph)
{
if(*p<60)count[0]++;/*統計不及格人數*/
elsecount[*p/10-5]++;/*統計其餘分段的人數*/
*average+=*p++;/*統計總分數,並移到下一個分數*/
count[6]++;/*統計學生總數*/
}
/*總分加count[6]/2是為了得到四捨五入的結果*/
*average=(*average+count[6]/2)/count[6];
p=score;
while(*p>0&&p<ph)
{
if(*p++>=*average)count[7]++;/*統計等於或高於平均成績的人數*/
}
}
/*輸入學號與成績*/
voidinput(int*num,int*score)
{
int*pNum=num;
int*pScore=score;
int*pNumH=pNum+MAX_STUDENT_NUM;
intreadNum,c;
while(pNum<pNumH)
{
printf(":");
readNum=scanf("%d%d",pNum,pScore);
if(readNum==2)
{
if(*pNum<0){*pScore=-1;break;}/*學號負數是輸入結束*/
if(0>*pScore||*pScore>100)/*分數輸入錯誤*/
{
printf("inputerror,scoremust0~100,pleaseinputagain! ");
continue;
}
pNum++;/*移動指針到下一位置*/
pScore++;
}
else/*輸入錯誤*/
{
printf("inputerror,pleaseinput2number! ");
while((c=getchar())!=' '&&c!=EOF);/*清除輸入緩沖*/
}
}
printf(" ");
}
voidmain()
{
intaverage=0,i;
intcount[8];
intnum[MAX_STUDENT_NUM],score[MAX_STUDENT_NUM];
for(i=0;i<8;i++)count[i]=0;
input(num,score);
countNum(count,score,&average);
/*不及格人數,並列印不及格學生的學號及成績*/
printf("thenumberoffailure:%d num score ",count[0]);
for(i=0;i<MAX_STUDENT_NUM&&num[i]>0;i++)
{
if(score[i]<60)
printf("%d %d ",num[i],score[i]);
}
printf(" ");
/*成績在全班平均分及以上的學生人數,並列印學生的學號和成績;*/
printf("thenumberofbeyondaveragescore:%d num score ",count[7]);
for(i=0;i<MAX_STUDENT_NUM&&num[i]>0;i++)
{
if(score[i]>=average)
printf("%d %d ",num[i],score[i]);
}
printf(" ");
/*各分數段的學生人數及所佔百分比。*/
printf("<60:%5.1f%% ",count[0]*100.0/count[6]);
printf("60~69:%5.1f%% ",count[1]*100.0/count[6]);
printf("70~79:%5.1f%% ",count[2]*100.0/count[6]);
printf("80~89:%5.1f%% ",count[3]*100.0/count[6]);
printf("90~99:%5.1f%% ",count[4]*100.0/count[6]);
printf("100:%5.1f%% ",count[5]*100.0/count[6]);
}
『肆』 怎麼寫c語言綜合實驗設計報告
舉個樓主自己寫的例子吧,僅供參考。
c語言作業報告書
題 目:二次探測再散列法解決沖突建立哈希表並查找
完成時間:2012年5月31號
學 號:2011013290 姓名:聶亮兵 專業班級:信管112班
1. 實習任務與目的
實驗任務:獨立寫出哈希查找的相關代碼並畫出核心的演算法流程圖,記錄相關實驗數據,得出實驗結果。
試驗目的:通過兩者運行時間的對比,加深對哈希查找和順序查找各自優缺點的理解,並進一步熟悉哈希查找的原理和流程。
2. 實習內容及過程
實習內容:用除留余數法和二次探測再散列法解決沖突建立哈希表並查找,通過函數GetTickCount計算運行時間;再同樣計算順序查找的方法的查找時間。
實習過程:
查閱關於庫函數<windows.h>的相關內容,並熟悉函數GetTickCount()的用法。
規劃演算法流程,畫出主要函數的流程圖。具體流程是:讀入文件數據——順序查找——輸出結果——哈希查找——輸出結果。
對應流程寫出相關函數,完善主函數。
進行程序的運行和調試,修改一些不足和bug。
添上相關注釋。
運行程序進行實驗並得出實驗結果,記錄。
完成實驗報告。
3. 實驗結果分析
實驗結果:由於所給數據Data.txt數據量過小,實驗結果不明顯,兩種查找所耗時間均被系統默認為0;如圖所示為編號為37、1294、4091的三個數據元素:
分析:哈希查找的方法適用於數據在區間內隨機分布均並且量大的數據形式;而順序查找原理簡單,但是不適用於大量數據的查找。
4. 核心演算法流程圖
圖1:主函數流程圖
圖2:哈希查找流程圖
5. 實習總結及體會
這個實驗難度不大,但是需要自己高質量的獨立完成,對自己是一個總結歸納,能通過這個實驗清楚自己哪些地方平時沒有注意到,哪些地方是自己擅長並應該繼續保持的。
此外,本實驗的全過程能讓自己了解正式的程序、任務和報告等的完成流程。通過自己獨立完成這個實驗,再和標準的數據結構代碼比較,找出自己代碼的亮點、不足以及欠缺,讓自己明白哪些地方是自己想不到的,哪些方法是自己不能想到的,並以此學習好的編程思想和優秀的編程技巧和編程風格。
本次試驗中:
正式的程序代碼中,外部變數的使用要格外注意,不能隨意使用外部變數。但是本程序具有獨立性,不用與其他程序代碼相銜接,採用外部變數的方法,減少函數調用的時候的復制傳值的次數,提高效率。
正式的編程思想中,要有統一的命名方式。這包括兩個方面。其一是自己的命名規則要統一,不能亂。其二是與合作小組之間的命名規則要統一,提高代碼的可嵌入性。但是本實驗由自己獨立完成,命名規則按照自己的習慣而定,與課本命名規則有點出入。
二次探測再散列法解決沖突中,課本中沒有提到如果H(a)-m^2<0時的處理方法。本程序中採用的方法是取絕對值。二次探測再散列法中,再散列需要在循環中進行,直到找到位置e為止。這個過程中m需要進行兩種互斥變化:一種是 *-1 ;一種是 +1;再循環中不好實現。本程序中採用一個信號變數,每次循環自增1,奇偶數分別執行不同的變化。
『伍』 C語言程序設計實驗報告怎麼寫啊
通過本試驗初步培養計算機邏輯解題能力。熟練掌握賦值語句和if語句的應用;掌握switch多路分支語句和if嵌套語句的使用
『陸』 怎樣做C語言程序設計報告
這是我們的設計報告,你可以有個參考
計算機科學技術繫上機實踐報告
課程名稱:c語言設計 年級: 上機實踐成績:
指導教師:XXX 姓名:
上機實踐名稱: 學號: 上機實踐日期:
上機實踐編號: 組號: 上機實踐時間:2學時
一、目的
對話框、游標、字元串、點陣圖
二、內容與設計思想
1.游標的使用:設計一個自定義游標,通過菜單選擇使用ARROW、WAIT和一個自定義游標。
2.點陣圖的使用:設計四個點陣圖。
3.對話框的使用: 3.1 設計一個模式對話框,復選四個點陣圖的顯示。 3.2 設計一個無模式對話框,單選一個點陣圖進行顯示。 3.3 設計一個打開文件通用對話框,通過消息框顯示獲取的文件名。
4.字元串的使用:在客戶區顯示的文字採用字元串資源定義的方法。所顯示的文字信息不在程序中出現。
5.中英文菜單切換:將菜單項的顯示文字定義為字元串資源,或者通過菜單整體切換。
三、使用環境
VS2010
四、調試過程
問題:出現如下錯誤:<1>error C2664: 「TextOutW」: 不能將參數4 從「char *」轉換為「LPCWSTR」
與指向的類型無關;轉換要求reinterpret_cast、C 樣式轉換或函數樣式轉換
解決:頭文件添加#include<tchar.h>,然後將字元串用_T(「」)括起來。
<2>無法畫出圖標文件。
解決:在WM_COMMAND中未響應其選項
<3>無法畫出不同位置的圖標文件。
解決:圖標文件的ID(連續的),做一個FOR循環
<4>動態菜單的添加
解決:通過老師的實例來完成。
出現的困難:(1)中英文的轉化。
解決方案:建立兩個菜單資源,一個是中文的,一個是英文的。看響應的是哪個。如果是中文的,就調用第一個菜單資源,如果是英文的,就調用第二個菜單資源。
(2)無模式對話框的設計與實現。
解決方案:在設計無模式對話框的時候,只要選中了哪個選項,就直接返回數據,不用通過IDOK來確認。
五、總結
在上機操作的過程中,也出現了一些意想不到的問題。出現錯誤之後,學會看看老師的實常式序,在對比中完成自己的作業。在解決問題的過程中,也學到了新的東西。
六、附錄
Homework3.RAR
另外,團IDC網上有許多產品團購,便宜有口碑
『柒』 C語言實驗報告怎麼寫
#include <stdio.h>
int main()
{
unsigned long a;
char c;
printf("Input a binary number: ");
for(a=0;(c=getchar())!=' ';)
a=a*2+c-'0';
printf("The number is %lu in decimal ",a);
printf("The number is %lo in octal ",a);
printf("The number is %lX in Hexadecimal ",a);
return 0;
}
『捌』 c語言設計程序報告
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
void cut();
void in();
void display();
int keep();
int enter();
struct msg
{
int num;
char name[20];
float score1;
float score2;
float score3;
double ave;
}
main()
{
struct msg student[10];
int i,n=0,k,m;
printf("請輸入學員信息.\n");
n=enter(student);
printf("\n排序前學員信息如下:\n");
printf("\t學號 \t姓名 \t平均成績\n");
for(i=0;i<n;i++)
printf("\t%d \t%s \t%f\n",student[i].num,student[i].name,student[i].ave);
printf("\n");
printf("\n排序後學員信息如下:\n");
display(student,n);
printf("\n\n是否要插入新學員?<y or n>");
k=keep();
if(k==0) exit(k); //如果輸入的不是y退出程序
else
{
in(student,n);
}
printf("\n\n是否要刪除某個學員?<y or n>");
k=keep();
if(k==0) exit(k);
else
{
m=n+1; //之前插入了一個學生,所以數組增加1
cut(student,m);
}
}
int keep() //是否繼續條件判斷函數
{
char ans;
fflush(stdin);
ans=getchar();
if (ans=='y')
return 1;
else
return 0;
}
int enter(struct msg student[10]) //錄入結構數據函數
{
int i,k,n=0;
for(i=0;;i++)
{
student[i].num=i+1;
printf("\n學號:%d\n",student[i].num);
printf("姓名: ");
fflush(stdin);
gets(student[i].name);
if(i==0) printf("\n三門成績:\n");
printf("成績1:");
scanf("%f",&student[i].score1);
printf("成績2:");
scanf("%f",&student[i].score2);
printf("成績3:");
scanf("%f",&student[i].score3);
student[i].ave=(student[i].score1+student[i].score2+student[i].score3)/3.0;
n++;
printf("是否要繼續?<y or n>");
k=keep();
if(k==1)
continue;
else
{
break;
}
}
return n;
}
void display(struct msg student[],int n) //排序函數,多次調用
{
int i,j,temp1;
char temp2[20];
double temp;
printf("\t學號 \t姓名 \t平均成績\n");
for(i=0;i<n;i++)
{
for(j=0;j<n-i-1;j++)
{
if(student[j].ave<student[j+1].ave)
{
temp=student[j].ave;
student[j].ave=student[j+1].ave;
student[j+1].ave=temp;
temp1=student[j].num;
student[j].num=student[j+1].num;
student[j+1].num=temp1;
strcpy(temp2,student[j].name);
strcpy(student[j].name,student[j+1].name);
strcpy(student[j+1].name,temp2);
}
}
}
for(i=0;i<n;i++)
printf("\t%d \t%s \t%f\n",student[i].num,student[i].name,student[i].ave);
}
void in(struct msg student[],int n) //插入函數
{
int k;
k=n+1;
printf("\n請輸入要插入學員的信息\n");
student[n].num=k;
printf("\n學號:%d\n",student[n].num);
printf("姓名:");
fflush(stdin);
gets(student[n].name);
printf("\n三門成績:");
printf("\n成績1:");
scanf("%f",&student[n].score1);
printf("成績2:");
scanf("%f",&student[n].score2);
printf("成績3:");
scanf("%f",&student[n].score3);
student[n].ave=(student[n].score1+student[n].score2+student[n].score3)/3.0;
printf("\n插入新學員後學員的信息如下\n");
display(student,k);
}
void cut(struct msg student[],int n)//刪除函數
{
int i,k1,j,m;
printf("輸入要刪除的學員的學號:");
scanf("%d",&k1);
for(i=0;i<n;i++)
{
if(student[i].num==k1)
break;
}
for(j=i;j<n-1;j++)
{
student[j].num=student[j+1].num;
strcpy(student[j].name,student[j+1].name);
student[j].ave=student[j+1].ave;
}
m=n-1;
printf("\n刪除後學員的信息如下:\n");
display(student,m);
}
這個也是和你差不多的學生成績設計,對其進行排序,刪除,添加,研究一下你那個應該就差不多了
『玖』 C語言程序設計報告的格式
課程設計(實踐周)報告書一般有如下內容:
1. 目錄
目錄是將報告書內的章節標題依次排列。
2. 需求分析
主要內容包括本課程設計(實踐周)題目、課程設計(實踐周)任務及要求、課程設計(實踐周)思想、軟硬體運行環境及開發工具。
3. 概要設計
主要敘述本課題設計的流程圖(各功能模塊)、主要的數據結構、完成本課程設計(實踐周)所用方法及其原理的簡要說明。
4. 詳細設計
主要是本課題所需要的硬體設計與軟體設計,包含建立設計所需的數學模型並列出必要的計算公式、計算過程及說明,主要演算法的設計與實現,寫出設計計算結果;繪出計算機程序框圖,寫出自編的程序。
5. 調試與操作說明
系統調試分析與操作使用說明。
6. 課程設計(實踐周)總結與體會
主要對本課題開發過程進行歸納和總結,本課題在設計過程中所遇到的技術難點及解決方法。還應包括本課題尚存在的問題,以及進一步開發的見解與建議。並寫出通過本次課程設計(實踐周)的收獲和體會。
7. 致謝
以簡短的文字對在設計研究和設計報告撰寫過程中曾直接給予幫助的人員表示自己的謝意
8. 參考文獻
為了反映論文的科學依據和作者尊重他人研究成果的嚴肅態度以及向讀者提供有關信息的出處,應列出本課程設計(實踐周)所涉及的主要參考文獻。
9. 附錄
有些材料編入文章主體會有損於編排的條理性和邏輯性,或有礙於文章結構的緊湊和突出主題思想等,可將這些材料作為附錄編排於全文的末尾。
『拾』 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==0&&x%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日星期演算法(百年%4<>0)
其公式為:
某年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==0&&x%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;i<m;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;i<y;i++)
sum+=numofYear(i);
for(i=1;i<m;i++)
sum+=numofMonth(y,i);
/* ++sum;*/
i=sum%7;
week=(week+i)%7;
return week;}
void empty(int n){
int i;
for(i=0;i<n;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;i<y2;i++)
sum+=numofYear(i);
if(y1==y2){ sum-=d1;
for(i=m1;i<m2;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(sm<0||sm>3);
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=(inkey&0xFF00)>>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;I<5;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(a>b);
printf(「a is larger than b\n」);
for(i=0;i<10;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;i<10;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〕大連理工大學出版