❶ 單片機c語言編程100個實例
51單片機C語言編程實例 基礎知識:51單片機編程基礎 單片機的外部結構: 1. DIP40雙列直插; 2. P0,P1,P2,P3四個8位準雙向I/O引腳;(作為I/O輸入時,要先輸出高電平) 3. 電源VCC(PIN40)和地線GND(PIN20); 4. 高電平復位RESET(PIN9);(10uF電容接VCC與RESET,即可實現上電復位) 5. 內置振盪電路,外部只要接晶體至X1(PIN18)和X0(PIN19);(頻率為主頻的12倍) 6. 程序配置EA(PIN31)接高電平VCC;(運行單片機內部ROM中的程序) 7. P3支持第二功能:RXD、TXD、INT0、INT1、T0、T1 單片機內部I/O部件:(所為學習單片機,實際上就是編程式控制制以下I/O部件,完成指定任務) 1. 四個8位通用I/O埠,對應引腳P0、P1、P2和P3; 2. 兩個16位定時計數器;(TMOD,TCON,TL0,TH0,TL1,TH1) 3. 一個串列通信介面;(SCON,SBUF) 4. 一個中斷控制器;(IE,IP) 針對AT89C52單片機,頭文件AT89x52.h給出了SFR特殊功能寄存器所有埠的定義。 C語言編程基礎: 1. 十六進製表示位元組0x5a:二進制為01011010B;0x6E為01101110。 2. 如果將一個16位二進數賦給一個8位的位元組變數,則自動截斷為低8位,而丟掉高8位。 3. ++var表示對變數var先增一;var—表示對變數後減一。 4. x |= 0x0f;表示為 x = x | 0x0f; 5. TMOD = ( TMOD & 0xf0 ) | 0x05;表示給變數TMOD的低四位賦值0x5,而不改變TMOD的高四位。 6. While( 1 ); 表示無限執行該語句,即死循環。語句後的分號表示空循環體,也就是{;} 在某引腳輸出高電平的編程方法:(比如P1.3(PIN4)引腳) 代碼 1. #include <AT89x52.h> //該頭文檔中有單片機內部資源的符號化定義,其中包含P1.3 2. void main( void ) //void 表示沒有輸入參數,也沒有函數返值,這入單片機運行的復位入口 3. { 4. P1_3 = 1; //給P1_3賦值1,引腳P1.3就能輸出高電平VCC 5. While( 1 ); //死循環,相當 LOOP: goto LOOP; 6. } 注意:P0的每個引腳要輸出高電平時,必須外接上拉電阻(如4K7)至VCC電源。 在某引腳輸出低電平的編程方法:(比如P2.7引腳) 代碼 1. #include <AT89x52.h> //該頭文檔中有單片機內部資源的符號化定義,其中包含P2.7 2. void main( void ) //void 表示沒有輸入參數,也沒有函數返值,這入單片機運行的復位入口 3. { 4. P2_7 = 0; //給P2_7賦值0,引腳P2.7就能輸出低電平GND 5. While( 1 ); //死循環,相當 LOOP: goto LOOP; 6. } 在某引腳輸出方波編程方法:(比如P3.1引腳) 代碼 1. #include <AT89x52.h> //該頭文檔中有單片機內部資源的符號化定義,其中包含P3.1 2. void main( void ) //void 表示沒有輸入參數,也沒有函數返值,這入單片機運行的復位入口 3. { 4. While( 1 ) //非零表示真,如果為真則執行下面循環體的語句 5. { 6. P3_1 = 1; //給P3_1賦值1,引腳P3.1就能輸出高電平VCC 7. P3_1 = 0; //給P3_1賦值0,引腳P3.1就能輸出低電平GND 8. } //由於一直為真,所以不斷輸出高、低、高、低……,從而形成方波 9. } 將某引腳的輸入電平取反後,從另一個引腳輸出:( 比如 P0.4 = NOT( P1.1) ) 代碼 1. #include <AT89x52.h> //該頭文檔中有單片機內部資源的符號化定義,其中包含P0.4和P1.1 2. void main( void ) //void 表示沒有輸入參數,也沒有函數返值,這入單片機運行的復位入口 3. { 4. P1_1 = 1; //初始化。P1.1作為輸入,必須輸出高電平 5. While( 1 ) //非零表示真,如果為真則執行下面循環體的語句 6. { 7. if( P1_1 == 1 ) //讀取P1.1,就是認為P1.1為輸入,如果P1.1輸入高電平VCC 8. { P0_4 = 0; } //給P0_4賦值0,引腳P0.4就能輸出低電平GND 2 51單片機C語言編程實例 9. else //否則P1.1輸入為低電平GND 10. //{ P0_4 = 0; } //給P0_4賦值0,引腳P0.4就能輸出低電平GND 11. { P0_4 = 1; } //給P0_4賦值1,引腳P0.4就能輸出高電平VCC 12. } //由於一直為真,所以不斷根據P1.1的輸入情況,改變P0.4的輸出電平 13. } 將某埠8個引腳輸入電平,低四位取反後,從另一個埠8個引腳輸出:( 比如 P2 = NOT( P3 ) ) 代碼 1. #include <AT89x52.h> //該頭文檔中有單片機內部資源的符號化定義,其中包含P2和P3 2. void main( void ) //void 表示沒有輸入參數,也沒有函數返值,這入單片機運行的復位入口 3. { 4. P3 = 0xff; //初始化。P3作為輸入,必須輸出高電平,同時給P3口的8個引腳輸出高電平 5. While( 1 ) //非零表示真,如果為真則執行下面循環體的語句 6. { //取反的方法是異或1,而不取反的方法則是異或0 7. P2 = P3^0x0f //讀取P3,就是認為P3為輸入,低四位異或者1,即取反,然後輸出 8. } //由於一直為真,所以不斷將P3取反輸出到P2 9. } 注意:一個位元組的8位D7、D6至D0,分別輸出到P3.7、P3.6至P3.0,比如P3=0x0f,則P3.7、P3.6、P3.5、P3.4四個引腳都輸出低電平,而P3.3、P3.2、P3.1、P3.0四個引腳都輸出高電平。同樣,輸入一個埠P2,即是將P2.7、P2.6至P2.0,讀入到一個位元組的8位D7、D6至D0。 第一節:單數碼管按鍵顯示 單片機最小系統的硬體原理接線圖: 1. 接電源:VCC(PIN40)、GND(PIN20)。加接退耦電容0.1uF 2. 接晶體:X1(PIN18)、X2(PIN19)。注意標出晶體頻率(選用12MHz),還有輔助電容30pF 3. 接復位:RES(PIN9)。接上電復位電路,以及手動復位電路,分析復位工作原理 4. 接配置:EA(PIN31)。說明原因。 發光二極的控制:單片機I/O輸出 將一發光二極體LED的正極(陽極)接P1.1,LED的負極(陰極)接地GND。只要P1.1輸出高電平VCC,LED就正向導通(導通時LED上的壓降大於1V),有電流流過LED,至發LED發亮。實際上由於P1.1高電平輸出電阻為10K,起到輸出限流的作用,所以流過LED的電流小於(5V-1V)/10K = 0.4mA。只要P1.1輸出低電平GND,實際小於0.3V,LED就不能導通,結果LED不亮。 開關雙鍵的輸入:輸入先輸出高 一個按鍵KEY_ON接在P1.6與GND之間,另一個按鍵KEY_OFF接P1.7與GND之間,按KEY_ON後LED亮,按KEY_OFF後LED滅。同時按下LED半亮,LED保持後松開鍵的狀態,即ON亮OFF滅。 代碼 1. #include <at89x52.h> 2. #define LED P1^1 //用符號LED代替P1_1 3. #define KEY_ON P1^6 //用符號KEY_ON代替P1_6 4. #define KEY_OFF P1^7 //用符號KEY_OFF代替P1_7 5. void main( void ) //單片機復位後的執行入口,void表示空,無輸入參數,無返回值 6. { 7. KEY_ON = 1; //作為輸入,首先輸出高,接下KEY_ON,P1.6則接地為0,否則輸入為1 8. KEY_OFF = 1; //作為輸入,首先輸出高,接下KEY_OFF,P1.7則接地為0,否則輸入為1 9. While( 1 ) //永遠為真,所以永遠循環執行如下括弧內所有語句 10. { 11. if( KEY_ON==0 ) LED=1; //是KEY_ON接下,所示P1.1輸出高,LED亮 12. if( KEY_OFF==0 ) LED=0; //是KEY_OFF接下,所示P1.1輸出低,LED滅 13. } //松開鍵後,都不給LED賦值,所以LED保持最後按鍵狀態。 14. //同時按下時,LED不斷亮滅,各佔一半時間,交替頻率很快,由於人眼慣性,看上去為半亮態 15. } 數碼管的接法和驅動原理 一支七段數碼管實際由8個發光二極體構成,其中7個組形構成數字8的七段筆畫,所以稱為七段數碼管,而餘下的1個發光二極體作為小數點。作為習慣,分別給8個發光二極體標上記號:a,b,c,d,e,f,g,h。對應8的頂上一畫,按順時針方向排,中間一畫為g,小數點為h。 我們通常又將各二極與一個位元組的8位對應,a(D0),b(D1),c(D2),d(D3),e(D4),f(D5),g(D6),h(D7),相應8個發光二極體正好與單片機一個埠Pn的8個引腳連接,這樣單片機就可以通過引腳輸出高低電平控制8個發光二極的亮與滅,從而顯示各種數字和符號;對應位元組,引腳接法為:a(Pn.0),b(Pn.1),c(Pn.2),d(Pn.3),e(Pn.4),f(Pn.5),g(Pn.6),h(Pn.7)。 如果將8個發光二極體的負極(陰極)內接在一起,作為數碼管的一個引腳,這種數碼管則被稱為共陰數碼管,共同的引腳則稱為共陰極,8個正極則為段極。否則,如果是將正極(陽極)內接在一起引出的,則稱為共陽數碼管,共同的引腳則稱為共陽極,8個負極則為段極。 以單支共陰數碼管為例,可將段極接到某埠Pn,共陰極接GND,則可編寫出對應十六進制碼的七段碼表位元組數據
❷ 求最簡單的C語言程序
#include<stdio.h>
main()
{
int a,b,t=0;
scanf("%d %d",&a,&b);
if (a<b)
{
t=a;
a=b;
b=t;
}
printf("%d %d %d %d %d",(a+b),(a-b),(a/b),(a*b),(a%b));
}
❸ 尋找一個簡單的C語言程序100行左右 注釋詳細 最好原創
#include<bios.h>
#define Up 0*4800
#define DOWN 0*5000
#define LEFT 0*4b00
#define RIGHT 0*4d00
#define SPACE 0*3920
#define ENTER 0*1c0d
Main()
{
Struct point
{
Int x,y;
}a; /*定義a為結構體point類型*/
Int key,key1;
a.x=40; /*設置游標的初始位置*/
a.y=10;
clrscr();
gotoxy(a.x,a.y); /*游標定位在指定位置*/
printf(「%c」,6);
while(bioskey(1)==0)
{
Key=bioskey(0); /*將所按鍵盤的控制碼賦給key*/
Switch(key)
{
Case UP: /*當按鍵為向上鍵時實現向上畫圖*/
{
a.y-=1; /*縱坐標減1*/
if(a.y==0)
a.y=24;
gotoxy(a.x,a.y);
printf(「%c」,6);
break;
}
Case DOWN: /*當按鍵為向下鍵時實現向下畫圖*/
{
a.y+=1; /*縱坐標加1*/
if(a.y==24)
a.y=1;
gotoxy(a.x,a.y);
printf(「%c」,6);
break;
}
Case LEFT: /*當按鍵為向左鍵時實現向左畫圖*/
{
a.x-=1; /*橫坐標減1*/
if(a.x==0)
a.x=80;
gotoxy(a.x,a.y);
printf(「%c」,6);
break;
}
Case RIGHT: /*當按鍵為向右鍵時實現向右畫圖*/
{
a.x+=1; /*橫坐標加1*/
if(a.x==80)
a.x=1;
gotoxy(a.x,a.y);
printf(「%c」,6);
break;
}
Case ENTER: /*當按鍵為回車鍵時游標跳到下一列且不畫圖*/
{a.y+=1;
If(a.y==24)
a.y=1;
gotoxy(a.x,a.y);
break;
}
Case SPACE: /*當按鍵為空格鍵時執行大括弧內的語句*/
{
While (bioskey(1)==0)
{
Key1=bioskey(0); /*將所按鍵盤的控制碼賦給key*/
Switch(key1)
{
Case UP: /*當按鍵為向上鍵時向上清除所畫圖像*/
{
a.y-=1;
if(a.y==0)
a.y=24;
gotoxy(a.x,a.y);
putch(『』);
break;
}
Case DOWN: /*當按鍵為向下鍵時向下清除所畫圖像*/
{
a.y+=1;
if(a.y==24)
a.y=1;
gotoxy(a.x,a.y);
putch(『』);
break;
}
Case LEFT: /*當按鍵為向左鍵時向左清除所畫圖像*/
{
a.x-=1;
if(a.x==0)
a.x=80;
gotoxy(a.x,a.y);
putch(『』);
break;
Case RIGHT: /*當按鍵為向右鍵時向右清除所畫圖像*/
{
a.x+=1;
if(a.x==80)
a.x=1;
gotoxy(a.x,a.y);
putch(『』);
break;
}
Case ENTER: /*當按鍵為回車鍵時游標跳到下一列且不畫圖*/
{a.y+=1;
If(a.y==24)
a.y=1;
gotoxy(a.x,a.y);
break;
}
}
If(key1==0*3920) /*當按鍵為空格鍵時,跳出循環*/
Break;
}
}
}
If(key==0*011b) /*當按鍵為esc時,退出循環*/
Break;
}
}
❹ C語言程序100行
//學生成績管理系統C代碼
/*頭文件*/
#include
#include
#include /*其它說明*/
#include /*字元串函數*/
#include /*內存操作函數*/
#include /*字元操作函數*/
#include /*動態地址分配函數*/
#define LEN sizeof(STUDENT)
typedef struct stu /*定義結構體數組用於緩存數據*/
{
char num[6];
char name[5];
int score[3];
int sum;
float average;
int order;
struct stu *next;
}STUDENT;
/*函數原型*/
STUDENT *init(); /*初始化函數*/
int menu_select(); /*菜單函數*/
STUDENT *create(); /*創建鏈表*/
void print(STUDENT *head); /* 顯示全部記錄*/
void search(STUDENT *head); /*查找記錄*/
STUDENT *delete(STUDENT *head); /*刪除記錄*/
STUDENT *sort(STUDENT *head); /*排序*/
STUDENT *insert(STUDENT *head,STUDENT *newnode); /*插入記錄*/
void save(STUDENT *head); /*保存文件*/
STUDENT *load(); /*讀文件*/
/*主函數界面*/
main()
{
STUDENT *head,newnode;
head=init(); /*鏈表初始化,使head的值為NULL*/
for(;;) /*循環無限次*/
{
switch(menu_select())
{
case 1:head=create();break;
case 2:print(head);break;
case 3:search(head);break;
case 4:head=delete(head);break;
case 5:head=sort(head);break;
case 6:head=insert(head,&newnode);break; /*&newnode表示返回地址*/
case 7:save(head);break;
case 8:head=load(); break;
case 9:exit(0); /*如菜單返回值為9則程序結束*/
}
}
}
/*初始化函數*/
STUDENT *init()
{
return NULL; /*返回空指針*/
}
/*菜單選擇函數*/
menu_select()
{
int n;
struct date d; /*定義時間結構體*/
getdate(&d); /*讀取系統日期並把它放到結構體d中*/
printf("press any key to enter the menu......"); /*按任一鍵進入主菜單*/
getch(); /*從鍵盤讀取一個字元,但不顯示於屏幕*/
clrscr(); /*清屏*/
printf("********************************************************************************\n");
printf("\t\t Welcome to\n");
printf("\n\t\t The student score manage system\n");
printf("*************************************MENU***************************************\n");
printf("\t\t\t1. Enter the record\n"); /*輸入學生成績記錄*/
printf("\t\t\t2. Print the record\n"); /*顯示*/
printf("\t\t\t3. Search record on name\n"); /*尋找*/
printf("\t\t\t4. Delete a record\n"); /*刪除*/
printf("\t\t\t5. Sort to make new a file\n"); /*排序*/
printf("\t\t\t6. Insert record to list\n"); /*插入*/
printf("\t\t\t7. Save the file\n"); /*保存*/
printf("\t\t\t8. Load the file\n"); /*讀取*/
printf("\t\t\t9. Quit\n"); /*退出*/
printf("\n\t\t Made by Hu Haihong.\n");
printf("********************************************************************************\n");
printf("\t\t\t\t%d\\%d\\%d\n",d.da_year,d.da_mon,d.da_day); /*顯示當前系統日期*/
do{
printf("\n\t\t\tEnter your choice(1~9):");
scanf("%d",&n);
}while(n9); /*如果選擇項不在1~9之間則重輸*/
return(n); /*返回選擇項,主函數根據該數調用相應的函數*/
}
/*輸入函數*/
STUDENT *create()
{
int i,s;
STUDENT *head=NULL,*p; /* 定義函數.此函數帶回一個指向鏈表頭的指針*/
clrscr();
for(;;)
{p=(STUDENT *)malloc(LEN); /*開辟一個新的單元*/
if(!p) /*如果指針p為空*/
{printf("\nOut of memory."); /*輸出內存溢出*/
return (head); /*返回頭指針,下同*/
}
printf("Enter the num(0:list end):");
scanf("%s",p->num);
if(p->num[0]=='0') break; /*如果學號首字元為0則結束輸入*/
printf("Enter the name:");
scanf("%s",p->name);
printf("Please enter the %d scores\n",3); /*提示開始輸入成績*/
s=0; /*計算每個學生的總分,初值為0*/
for(i=0;i<3;i++) /*3門課程循環3次*/
{
do{
printf("score%d:",i+1);
scanf("%d",&p->score[i]);
if(p->score[i]score[i]>100) /*確保成績在0~100之間*/
printf("Data error,please enter again.\n");
}while(p->score[i]score[i]>100);
s=s+p->score[i]; /*累加各門成績*/
}
p->sum=s; /*將總分保存*/
p->average=(float)s/3; /*先用強制類型轉換將s轉換成float型,再求平均值*/
p->order=0; /*未排序前此值為0*/
p->next=head; /*將頭結點做為新輸入結點的後繼結點*/
head=p; /*新輸入結點為新的頭結點*/
}
return(head);
}
/* 顯示全部記錄函數*/
void print(STUDENT *head)
{
int i=0; /* 統計記錄條數*/
STUDENT *p; /*移動指針*/
clrscr();
p=head; /*初值為頭指針*/
printf("\n************************************STUDENT************************************\n");
printf("-------------------------------------------------------------------------------\n");
printf("| Rec | Num | Name | Sc1 | Sc2 | Sc3 | Sum | Ave | Order |\n");
printf("-------------------------------------------------------------------------------\n");
while(p!=NULL)
{
i++;
printf("| %3d | %4s | %-4s | %3d | %3d | %3d | %3d | %4.2f | %-5d|\n",
i, p->num,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);
p=p->next;
}
printf("-------------------------------------------------------------------------------\n");
printf("**************************************END**************************************\n");
}
/*查找記錄函數*/
void search(STUDENT *head)
{
STUDENT *p; /* 移動指針*/
char s[5]; /*存放姓名用的字元數組*/
clrscr();
printf("Please enter name for searching.\n");
scanf("%s",s);
p=head; /*將頭指針賦給p*/
while(strcmp(p->name,s) && p != NULL) /*當記錄的姓名不是要找的,或指針不為空時*/
p=p->next; /*移動指針,指向下一結點*/
if(p!=NULL) /*如果指針不為空*/
{printf("\n*************************************FOUND************************************\n");
printf("-------------------------------------------------------------------------------\n");
printf("| Num | Name | sc1 | sc2 | sc3 | Sum | Ave | Order |\n");
printf("-------------------------------------------------------------------------------\n");
printf("| %4s | %4s | %3d | %3d | %3d | %3d | %4.2f | %-5d|\n",
p->num,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);
printf("-------------------------------------------------------------------------------\n");
printf("***************************************END**************************************\n");
}
else
printf("\nThere is no num %s student on the list.\n",s); /*顯示沒有該學生*/
}
/*刪除記錄函數*/
STUDENT *delete(STUDENT *head)
{int n;
STUDENT *p1,*p2; /*p1為查找到要刪除的結點指針,p2為其前驅指針*/
char c,s[6]; /*s[6]用來存放學號,c用來輸入字母*/
clrscr();
printf("Please enter the deleted num: ");
scanf("%s",s);
p1=p2=head; /*給p1和p2賦初值頭指針*/
while(strcmp(p1->num,s) && p1 != NULL) /*當記錄的學號不是要找的,或指針不為空時*/
{p2=p1; /*將p1指針值賦給p2作為p1的前驅指針*/
p1=p1->next; /*將p1指針指向下一條記錄*/
}
if(strcmp(p1->num,s)==0) /*學號找到了*/
{printf("**************************************FOUND************************************\n");
printf("-------------------------------------------------------------------------------\n");
printf("| Num | Name | sc1 | sc2 | sc3 | Sum | Ave | Order |\n");
printf("-------------------------------------------------------------------------------\n");
printf("| %4s | %4s | %3d | %3d | %3d | %3d | %4.2f | %-5d|\n",
p1->num,p1->name,p1->score[0],p1->score[1],p1->score[2],p1->sum,p1->average,p1->order);
printf("-------------------------------------------------------------------------------\n");
printf("***************************************END**************************************\n");
printf("Are you sure to delete the student Y/N ?"); /*提示是否要刪除,輸入Y刪除,N則退出*/
for(;;)
{scanf("%c",&c);
if(c=='n'||c=='N') break; /*如果不刪除,則跳出本循環*/
if(c=='y'||c=='Y')
{
if(p1==head) /*若p1==head,說明被刪結點是首結點*/
head=p1->next; /*把第二個結點地址賦予head*/
else
p2->next=p1->next; /*否則將一下結點地址賦給前一結點地址*/
n=n-1;
printf("\nNum %s student have been deleted.\n",s);
printf("Don't forget to save.\n");break; /*刪除後就跳出循環*/
}
}
}
else
printf("\nThere is no num %s student on the list.\n",s); /*找不到該結點*/
return(head);
}
/*排序函數*/
STUDENT *sort(STUDENT *head)
{int i=0; /*保存名次*/
STUDENT *p1,*p2,*t,*temp; /*定義臨時指針*/
temp=head->next; /*將原表的頭指針所指的下一個結點作頭指針*/
head->next=NULL; /*第一個結點為新表的頭結點*/
while(temp!=NULL) /*當原表不為空時,進行排序*/
{
t=temp; /*取原表的頭結點*/
temp=temp->next; /*原表頭結點指針後移*/
p1=head; /*設定移動指針p1,從頭指針開始*/
p2=head; /*設定移動指針p2做為p1的前驅,初值為頭指針*/
while(t->averageaverage&&p1!=NULL) /*作成績平均分比較*/
{
p2=p1; /*待排序點值小,則新表指針後移*/
p1=p1->next;
}
if(p1==p2) /*p1==p2,說明待排序點值大,應排在首位*/
{
t->next=p1; /*待排序點的後繼為p*/
head=t; /*新頭結點為待排序點*/
}
else /*待排序點應插入在中間某個位置p2和p1之間,如p為空則是尾部*/
{
t->next=p1; /*t的後繼是p1*/
p2->next=t; /*p2的後繼是t*/
}
}
p1=head; /*已排好序的頭指針賦給p1,准備填寫名次*/
while(p1!=NULL) /*當p1不為空時,進行下列操作*/
{
i++; /*結點序號*/
p1->order=i; /*將結點序號賦值給名次*/
p1=p1->next; /*指針後移*/
}
printf("Sorting is sucessful.\n"); /*排序成功*/
return (head);
}
/*插入記錄函數*/
STUDENT *insert(STUDENT *head,STUDENT *newnode)
{STUDENT *p0,*p1,*p2;
int n,sum1,i;
p1=head; /*使p1指向第一個結點*/
p0=newnode; /*p0指向要插入的結點*/
printf("\nPlease enter a newnode record.\n"); /*提示輸入記錄信息*/
printf("Enter the num:");
scanf("%s",newnode->num);
printf("Enter the name:");
scanf("%s",newnode->name);
printf("Please enter the %d scores.\n",3);
sum1=0; /*保存新記錄的總分,初值為0*/
for(i=0;i<3;i++)
{
do{
printf("score%d:",i+1);
scanf("%d",&newnode->score[i]);
if(newnode->score[i]>100||newnode->score[i]<0)
printf("Data error,please enter again.\n");
}while(newnode->score[i]>100||newnode->score[i]<0);
sum1=sum1+newnode->score[i]; /*累加各門成績*/
}
newnode->sum=sum1; /*將總分存入新記錄中*/
newnode->average=(float)sum1/3;
newnode->order=0;
if(head==NULL) /*原來的鏈表是空表*/
{head=p0;p0->next=NULL;} /*使p0指向的結點作為頭結點*/
else
{while((p0->averageaverage)&&(p1->next!=NULL))
{p2=p1; /*使p2指向剛才p1指向的結點*/
p1=p1->next; /*p1後移一個結點*/
}
if(p0->average>=p1->average)
{if(head==p1)head=p0; /*插到原來第一個結點之前*/
else p2->next=p0; /*插到p2指向的結點之後*/
p0->next=p1;}
else
{p1->next=p0;p0->next=NULL;} /*插到最後的結點之後*/
}
n=n+1; /*結點數加1*/
head=sort(head); /*調用排序的函數,將學生成績重新排序*/
printf("\nStudent %s have been inserted.\n",newnode->name);
printf("Don't forget to save the newnode file.\n");
return(head);
}
/*保存數據到文件函數*/
void save(STUDENT *head)
{FILE *fp; /*定義指向文件的指針*/
STUDENT *p; /* 定義移動指針*/
char outfile[10];
printf("Enter outfile name,for example c:\\score\n");
scanf("%s",outfile);
if((fp=fopen(outfile,"wb"))==NULL) /*為輸出打開一個二進制文件,為只寫方式*/
{
printf("Cannot open the file\n");
return; /*若打不開則返回菜單*/
}
printf("\nSaving the file......\n");
p=head; /*移動指針從頭指針開始*/
while(p!=NULL) /*如p不為空*/
{
fwrite(p,LEN,1,fp); /*寫入一條記錄*/
p=p->next; /*指針後移*/
}
fclose(fp); /*關閉文件*/
printf("Save the file successfully!\n");
}
/* 從文件讀數據函數*/
STUDENT *load()
{STUDENT *p1,*p2,*head=NULL; /*定義記錄指針變數*/
FILE *fp; /* 定義指向文件的指針*/
char infile[10];
printf("Enter infile name,for example c:\\score\n");
scanf("%s",infile);
if((fp=fopen(infile,"rb"))==NULL) /*打開一個二進制文件,為只讀方式*/
{
printf("Can not open the file.\n");
return(head);
}
printf("\nLoading the file!\n");
p1=(STUDENT *)malloc(LEN); /*開辟一個新單元*/
if(!p1)
{
printf("Out of memory!\n");
return(head);
}
head=p1; /*申請到空間,將其作為頭指針*/
while(!feof(fp)) /*循環讀數據直到文件尾結束*/
{
if(fread(p1,LEN,1,fp)!=1) break; /*如果沒讀到數據,跳出循環*/
p1->next=(STUDENT *)malloc(LEN); /*為下一個結點開辟空間*/
if(!p1->next)
{
printf("Out of memory!\n");
return (head);
}
p2=p1; /*使p2指向剛才p1指向的結點*/
p1=p1->next; /*指針後移,新讀入數據鏈到當前表尾*/
}
p2->next=NULL; /*最後一個結點的後繼指針為空*/
fclose(fp);
printf("You have success to read data from the file!\n");
return (head);
}
滿意請採納。
❺ 一百行簡單C語言編程,要有解析的啊,速求啊,
////排列
////////////////////////////////輸入數字字元,使之拼成一個數,且輸出的第一個數為各位依次類推如 12 -》21
/*
#include <stdio.h>
int main(void)
{
char c1, c2;
int x;
int i;
c1 = getchar();
c2 = getchar();
printf("%c%c\n", c2, c1); // 如只是簡單輸出
x = (c1 - '0') + (c2 - '0') * 10; // 轉換成數值
printf("%d\n", x); // 輸出數值
return 0;
}
*/
//////////////////////////////////////輸入數字字元串,使得輸入的數字第一個輸入的排到最後一位,依次排列,最後一個輸入的排到第一位
/*
#include <stdio.h>
#include <string.h>
int main(void)
{
char s[1000] ,*p; //定義字元數組,字元指針變數
int c ; //c用來獲取輸入字元的個數
int j; // J用來計算循環次數
int i; // i用來內部循環數字調換
char temp; //temp用來存儲c個字元中末尾的那個字元
p = s; //將字元數組的地址傳給指針變數p使得P擁有s一樣的首地址
c = strlen( gets(s)); //利用strlen函數得到輸入字元的個數
printf("%d\n",c); //輸出輸入的字元個數
for(j = 1;j<c;j++)
{
//temp = *(p+c-1);
temp = *(p +c-j); //p+c-j,當j=1,temp = 4 ,因為如 1 2 3 4,當執行完下面的數字交換語句後
printf("yaode %c\n",temp); // 4 1 2 3,此時只需要在 1 2 3中進行排序當j=2時temp = 3,否則若超出p+3,temp未知
//for(i=0;i<c-1;i++)
for(i=0;i<c-j;i++)
{
// *(p+c-i-1) = *(p+c-1-i-1);
*(p+c-i-j) = *(p+c-1-i-j); // 當i=0,1 2 3 4 ,將p+2->3賦給p+3,1 2 3 3.
} //當i=1,p+1->2賦給p+2,1 2 2 3 ..依次循環
*p = temp; //執行完第一個for(i)循環 1 1 2 3,此時將temp 的值賦給*p即第一個數字處, 4 1 2 3
p = s; ////////忘記了回歸原位 //執行完上面的語句,p此時復位到&s[0],因為下面p = p + j使得p在不斷的發生變化
printf("%s\n",p);
p= p+j;
}
p = s; //////////忘記了回歸原位
printf("The last result is :%s\n",p);
return 0;
}
*/
////////////////////////////////////商,余,++
/*
#include <stdio.h>
int main(void)
{
int i;
int j;
float m,n;
int k;
int j1,j2,j3;
printf("取余和商的題\n");
/////////////////////////////取余和商的題
i = -5/3;
j = 5/3;
m = 5.0/3;
n = 5/3.0;
printf("%d,%d,%f,%f\n",i,j,m,n);
i = 5%3;
j = 5%(-3);
//m = 5.0%3;
//n = 5%3.0;////// '%' : illegal, right operand has type 'const double'
k = -5%3;
printf("%d,%d,%d \n",i,j ,k );
//////////////////////////////////////////////////////////////////////關於i++,++i的一些東西
printf("關於i++,++i的一些東西\n");
i = 1;
j = 5;
k = 0;
k = i++;
printf("k = %d, i = %d\n",k,i);
j = ++i;
printf("k = %d,j = %d,i = %d \n" ,k,j,i );
i = 3;
printf("i = %d \n",i );
printf("%d,%d\n",i,i++);
printf("i = %d \n",i );
printf("%d,%d\n",i,++i);
printf("i = %d \n",i );
printf("%d,%d,%d\n",i,i++,++i);
printf("i = %d \n",i );///////////////////////i=7
j1 = i;
j2 = ++i;
j3 = i++;
printf("j1 = %d,j2 = %d,j3 = %d\n",j1,j2,j3);//////////////8 8 7
printf("i = %d \n",i );//////////////////
i = 7;
printf("i = %d \n",i );
printf("i1 = %d,i2 = %d, i3 = %d\n",i,++i,i++);
printf("i = %d \n",i );
i = 7;
printf("i = %d \n",i );
printf("i1 = %d,i2 = %d,i3 = %d\n" ,i,i++,++i);
printf("i = %d \n",i );
return 0;
}
*/
////////////////////////不同類型數據間的混合運算
/*
#include <stdio.h>
int main(void)
{
char c1,c2;
c1 = 'A';
c2 = c1 + 32;
printf("%d\n",c2); ////////////說明系統自動將字元用ASCII代碼輸出,也可與整數進行的運算
printf("%c\n",c2);
return 0;
}
*/
/////////////////////////////////////////////////強制類型轉換運算符
/*
(double)a; //////將a轉換成double 型
(int)(x+y); //////將x+y的值轉換成int型
(float)(5%3);////將5%3的值轉換成float 型
*/
/*///////////////////////////////////////////////////語句
1 控制語句:用來完成一定控制功能1.if()....else... 2. for()... 3.while()...... 4. do....while()....
5.continue 結束本次循環語句 6.break 終止執行switch或循環語句 7.switch 多分支選擇語句
8.return 從函數返回語句 9.goto 轉向語句(結構化程序中基本不用goto語句)
2 表達式語句:一個表達式後加一個分號就形成了一個表達式語句 a=1;(賦值表達式語句)
3 函數調用語句: 由一個函數調用加一個分號構成例如: printf(" "....);
4 空語句 : ; 只有一個分號,什麼也不做。用來作為流程的轉向點(流程從程序其它地方轉到此語句處),也可以用來作為循環語句中的循環體(
循環體是空語句,表示循環體什麼都不做)
5 復合語句:可以用{}把語句和聲明括起來成為復合語句
*/
///////////////////////////////////////賦值中的類型轉換
/*
l
*/
/*
#include <stdio.h>
int main(void)
{
float i;
double d;
d = 1.12345931231;
i = d;
printf("%f\n",i);
printf("%lf\n",i);
printf("%d\n",i);
i = 'A';
printf("%f\n",i); //////說明'A'只能賦給整形變數,因為ASCII是以整形數字的形式對應字元
i = 'A';
printf("%d\n",i);
int k;
k = 'A';
printf("%d\n",k);
return 0;
}
*/
/*
❻ 求C語言編程實例100行以上,要有文字大概解釋一下
下面是一個用C語言顯示一個簡單的WIndows窗口的小程序。用C語言對Windows編程的基礎。
//+---------------------------------------------------------------------------
//
//HELLO_WIN.C-WindowsGUI'HelloWorld!'示例
//
//+---------------------------------------------------------------------------
#include<windows.h>
#defineAPPNAME"HELLO_WIN"
charszAppName[]=APPNAME;//當前有用程序的名稱
charszTitle[]=APPNAME;//標題行顯示的文字
constchar*pWindowText;
voidCenterWindow(HWNDhWnd);
//+---------------------------------------------------------------------------
//
//Function:WndProc
//
//Synopsis:處理Windows消息的函數
//
//Arguments:sameasalways.
//----------------------------------------------------------------------------
LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam)
{
switch(message){
//-----------------------firstandlast
caseWM_CREATE:
CenterWindow(hwnd);
break;
caseWM_DESTROY:
PostQuitMessage(0);
break;
//-----------------------getoutofit...
caseWM_RBUTTONUP:
DestroyWindow(hwnd);
break;
caseWM_KEYDOWN:
if(VK_ESCAPE==wParam)
DestroyWindow(hwnd);
break;
//-----------------------displayourminimalinfo
caseWM_PAINT:
{
PAINTSTRUCTps;
HDChdc;
RECTrc;
hdc=BeginPaint(hwnd,&ps);
GetClientRect(hwnd,&rc);
SetTextColor(hdc,RGB(240,240,96));
SetBkMode(hdc,TRANSPARENT);
DrawText(hdc,pWindowText,-1,&rc,DT_CENTER|DT_SINGLELINE|DT_VCENTER);
EndPaint(hwnd,&ps);
break;
}
//-----------------------letwindowsdoallotherstuff
default:
returnDefWindowProc(hwnd,message,wParam,lParam);
}
return0;
}
//+---------------------------------------------------------------------------
//
//Function:WinMain
//
//Synopsis:
//
//----------------------------------------------------------------------------
intAPIENTRYWinMain(
HINSTANCEhInstance,
HINSTANCEhPrevInstance,
LPSTRlpCmdLine,
intnCmdShow
)
{
MSGmsg;
WNDCLASSwc;
HWNDhwnd;
pWindowText=lpCmdLine[0]?lpCmdLine:"HelloWindows!";
//
//themainwindow.
ZeroMemory(&wc,sizeofwc);
wc.hInstance=hInstance;
wc.lpszClassName=szAppName;
wc.lpfnWndProc=(WNDPROC)WndProc;
wc.style=CS_DBLCLKS|CS_VREDRAW|CS_HREDRAW;
wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
if(FALSE==RegisterClass(&wc))
return0;
//createthebrowser
hwnd=CreateWindow(
szAppName,
szTitle,
WS_OVERLAPPEDWINDOW|WS_VISIBLE,
CW_USEDEFAULT,
CW_USEDEFAULT,
360,//CW_USEDEFAULT,
240,//CW_USEDEFAULT,
0,
0,
hInstance,
0);
if(NULL==hwnd)
return0;
//Mainmessageloop:
while(GetMessage(&msg,NULL,0,0)>0){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
returnmsg.wParam;
}
//+---------------------------------------------------------------------------
//+---------------------------------------------------------------------------
voidCenterWindow(HWNDhwnd_self)
{
HWNDhwnd_parent;
RECTrw_self,rc_parent,rw_parent;
intxpos,ypos;
hwnd_parent=GetParent(hwnd_self);
if(NULL==hwnd_parent)
hwnd_parent=GetDesktopWindow();
GetWindowRect(hwnd_parent,&rw_parent);
GetClientRect(hwnd_parent,&rc_parent);
GetWindowRect(hwnd_self,&rw_self);
xpos=rw_parent.left+(rc_parent.right+rw_self.left-rw_self.right)/2;
ypos=rw_parent.top+(rc_parent.bottom+rw_self.top-rw_self.bottom)/2;
SetWindowPos(
hwnd_self,NULL,
xpos,ypos,0,0,
SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE
);
}
//+---------------------------------------------------------------------------
❼ 就是C語言經典c程序100例(1--10)
三層循環三個for語句之間是沒有分號的 把第一個和第二個for後面的;去掉
❽ 經典C語言程序例子
題目01:在一個已知的字元串中查找最長單詞,假定字元串中只含字母和空格,空格用來分隔不同的單詞。
(8)c語言簡單程序100例擴展閱讀:
C語言是一門通用計算機編程語言,應用廣泛。C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。
盡管C語言提供了許多低級處理的功能,但仍然保持著良好跨平台的特性,以一個標准規格寫出的C語言程序可在許多電腦平台上進行編譯,甚至包含一些嵌入式處理器(單片機或稱MCU)以及超級電腦等作業平台。