C语言程序设计第三节课作业
1?指針是一個(gè)存儲(chǔ)計(jì)算機(jī)內(nèi)存地址的變量。從指針指向的內(nèi)存讀取數(shù)據(jù)稱作指針的取值。指針可以指向某些具體類型的變量地址,例如int、long和double。指針也可以是void類型、NULL指針和未初始化指針。
根據(jù)出現(xiàn)的位置不同,操作符?*?既可以用來(lái)聲明一個(gè)指針變量,也可以用作指針的取值。當(dāng)用在聲明一個(gè)變量時(shí),*表示這里聲明了一個(gè)指針。其它情況用到*表示指針的取值。
? 鏈表由一系列不必在內(nèi)存中相連的結(jié)構(gòu)組成。每一個(gè)結(jié)構(gòu)均含有表元素和指向包含該元素后繼元的結(jié)構(gòu)指針。我們稱之為next指針。最后一個(gè)單元的next指針指向NULL;該值由C定義并且不能與其它指針混淆。ANSI C規(guī)定NULL為零。
?指針
? 指針是一個(gè)存儲(chǔ)計(jì)算機(jī)內(nèi)存地址的變量。從指針指向的內(nèi)存讀取數(shù)據(jù)稱作指針的取值。指針可以指向某些具體類型的變量地址,例如int、long和double。指針也可以是void類型、NULL指針和未初始化指針。
我們?cè)谑褂胏語(yǔ)言進(jìn)行編寫程序的時(shí)候,就一定會(huì)使用上指針,指針的操作是編寫程序的一個(gè)點(diǎn)。如何更好的使用指針,將是我們進(jìn)行更好的書寫程序的關(guān)鍵。我認(rèn)為弄清楚下面幾個(gè)要點(diǎn),可以更好的理解指針:
(1):指針是一個(gè)地址,指向的是個(gè)類型
(2):指針指向的是地址,地址指向的是內(nèi)容
(3):指針的指針,是面對(duì)于指針的變量
? 鏈表
?鏈表我的理解要包含以下特征:(1).由n個(gè)節(jié)點(diǎn)離散分配;(2).每個(gè)節(jié)點(diǎn)通過(guò)指針連接(3)每一個(gè)節(jié)點(diǎn)由一個(gè)前驅(qū)節(jié)點(diǎn)和一個(gè)后驅(qū)節(jié)點(diǎn)(4).首節(jié)點(diǎn)沒(méi)有前驅(qū)節(jié)點(diǎn),尾節(jié)點(diǎn)沒(méi)有后驅(qū)節(jié)點(diǎn);
? 滿足上面的4條,我們就稱為鏈表;鏈表既然由很多個(gè)節(jié)點(diǎn),那節(jié)點(diǎn)又由什么組成?節(jié)點(diǎn)由兩個(gè)部分組成,一是數(shù)據(jù)域,用來(lái)存放有效數(shù)據(jù);二是指針域,用來(lái)指向下一個(gè)節(jié)點(diǎn);下面用C語(yǔ)言來(lái)構(gòu)建鏈表數(shù)據(jù)結(jié)構(gòu),首先應(yīng)該構(gòu)造出節(jié)點(diǎn),然后再把所有的節(jié)點(diǎn)連起來(lái),就構(gòu)成了鏈表;
例如:
#include<stdio.h>
int main()
{
? ?int*ptr; ? // 聲明一個(gè)int指針
? ?int val =1; ?// 聲明一個(gè)int值
? ?ptr =&val; ?// 為指針?lè)峙湟粋€(gè)int值的引用
? ?int deref =*ptr; ?// 對(duì)指針進(jìn)行取值,打印存儲(chǔ)在指針地址中的內(nèi)容
? printf("deref地址=%ld,值=%d\n",ptr, deref);
? ?第2行,我們通過(guò)*操作符聲明了一個(gè)int指針。接著我們聲明了一個(gè)int變量并賦值為1。然后我們用int變量的地址初始化我們的int指針。接下來(lái)對(duì)int指針取值,用變量的內(nèi)存地址初始化int指針。最終,我們打印輸出變量值,內(nèi)容為1。
? ?第6行的&val是一個(gè)引用。在val變量聲明并初始化內(nèi)存之后,通過(guò)在變量名之前使用地址操作符&我們可以直接引用變量的內(nèi)存地址。
? ?第8行,我們?cè)僖淮问褂?操作符來(lái)對(duì)該指針取值,可直接獲得指針指向的內(nèi)存地址中的數(shù)據(jù)。由于指針聲明的類型是int,所以取到的值是指針指向的內(nèi)存地址存儲(chǔ)的int值。
? ?這里可以把指針、引用和值的關(guān)系類比為信封、郵箱地址和房子。一個(gè)指針就好像是一個(gè)信封,我們可以在上面填寫郵寄地址。一個(gè)引用(地址)就像是一個(gè)郵件地址,它是實(shí)際的地址。取值就像是地址對(duì)應(yīng)的房子。我們可以把信封上的地址擦掉,寫上另外一個(gè)我們想要的地址,但這個(gè)行為對(duì)房子沒(méi)有任何影響。
2?
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"conio.h"
#define PAGE 3
#define MAX 1000
#define N 5
int k=0;
??/*結(jié)構(gòu)體類型*/
typedef struct ?
{ ??int num;/*學(xué)號(hào)*/
????char name[20];/*姓名*/
char sex[5];/*性別*/
int age;/*年齡*/
char studentclass[20];/*班級(jí)*/
int score;/*成績(jī)*/
}STUDENTS;
?
int read_file(STUDENTS stu[])
{FILE *fp;
????int i=0;
if((fp=fopen("stu.txt","rt"))==NULL)
{printf("\n\n*****庫(kù)存文件不存在!請(qǐng)創(chuàng)");
?return 0;
}
while(feof(fp)!=1)
????{
fread(&stu[i],sizeof(STUDENTS),1,fp);
if(stu[i].num==0)
break;
else
i++;
}
fclose(fp);
return i;
}
void save_file(STUDENTS stu[],int sum)
{FILE*fp;
?int i;
?if((fp=fopen("stu.txt","wb"))==NULL)
?{printf("寫文件錯(cuò)誤!\n");
??return;
?}
???for(i=0;i<sum;i++)
???if(fwrite(&stu[i],sizeof(STUDENTS),1,fp)!=1)
???printf("寫文件錯(cuò)誤!\n");
???fclose(fp);
}
?
?
/*創(chuàng)建學(xué)生信息*/
int input(STUDENTS stu[])
{ ?int i,x;
???for(i=0;i<1000;i++)
???{
????system("cls"); ?
????printf("\n\n ????????????????錄入學(xué)生信息 ?(最多%d個(gè))\n",MAX);
????printf(" ??????????????----------------------------\n");
???
????????printf("\n ????????????????????第%d個(gè)學(xué)生",k+1);
????printf("\n?請(qǐng)輸入學(xué)生的學(xué)號(hào):");
????????scanf("%d",&stu[k].num);
????????printf("\n?請(qǐng)輸入學(xué)生的姓名:");
????????scanf("%s",stu[k].name);
??printf("\n?請(qǐng)輸入學(xué)生的性別:");
????????scanf("%s",stu[k].sex);
????????printf("\n?請(qǐng)輸入學(xué)生的年齡:"); ??
????????scanf("%d",&stu[k].age); ?
????????printf("\n?請(qǐng)輸入學(xué)生的班級(jí):");
????????scanf("%s",stu[k].studentclass); ???????
????????printf("\n?請(qǐng)輸入學(xué)生的成績(jī):");
????????scanf("%d",&stu[k++].score);
????????printf("\n?請(qǐng)按1鍵返回菜單或按0鍵繼續(xù)創(chuàng)建");
scanf("%d",&x);
if(x)
??break;
???}
??????
???????return k;
}
?
?
/*刪除學(xué)生信息*/
void deletel(STUDENTS stu[])
??{ system("cls");
???char Stuname2[20];
???int i,j;
???printf("請(qǐng)輸入學(xué)生姓名:");
???scanf("%s",Stuname2);
???printf("\n");
???for(i=0;i<k;i++)
???if(strcmp(stu[i].name,Stuname2)==0) ??
?????for(j=0;j<20;j++)
???????stu[i].name[j]=stu[i+1].name[j];
???k--;
??
???printf("刪除成功\n");
???printf("按任意鍵加回車返回主菜單!");
???scanf("%d",&i);
???getchar();
}
?
/*打印學(xué)生信息*/ ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
void output(STUDENTS stu[])
{ ?system("cls");
???int i;
???for(i=0;i<k;i++) ?
?????printf("學(xué)號(hào):%d,姓名:%s,性別:%s,年齡:%d,班級(jí):%s,成績(jī): %d\n",stu[i].num,stu[i].name,
??stu[i].sex,stu[i].age,stu[i].studentclass,stu[i].score);
???printf("按任意鍵加回車返回主菜單!");
???scanf("%d",&i);
???getchar();
}
?
/*查詢學(xué)生信息*/
void inquire(STUDENTS stu[])
??{ int i;
????int num;
????system("cls");
????printf(" ????\n\n請(qǐng)輸入您要查找的學(xué)生的學(xué)號(hào)");
????scanf("%d",&num);
????for(i=0;i<k;i++)
??????if(num==stu[i].num)
?????????printf("\n\n\n學(xué)號(hào):%d,姓名:%s,性別:%s,年齡:%d,班級(jí):%s,成績(jī): %d\n",stu[i].num,stu[i].name,
?stu[i].sex,stu[i].age,stu[i].studentclass,stu[i].score);
????printf("按任意鍵加回車返回主菜單!");
scanf("%d",&i);
????getchar();
??}
?
?
/*修改學(xué)生信息*/
void change(STUDENTS stu[])
??{ ?int num,i,choice;
?????system("cls");
?printf("\n\n\n ?????請(qǐng)輸入您要修改的學(xué)生的學(xué)號(hào)");
?????scanf("%d",&num);
?????for(i=0;i<k;i++)
?????{ if(num==stu[i].num)
?????????printf("\n學(xué)號(hào):%d,姓名:%s,性別:%s,年齡:%d,班級(jí):%s,成績(jī): %d\n",stu[i].num,stu[i].name,
?stu[i].sex,stu[i].age,stu[i].studentclass,stu[i].score);
?
?????printf("\n\n\n ????********請(qǐng)輸入您想要修改的數(shù)據(jù)********\n\n");
?????printf(" ???????????????1.?學(xué)號(hào)\n\n");
?????printf(" ???????????????2.?姓名\n\n");
?printf(" ???????????????3.?性別\n\n");
?????printf(" ???????????????4.?年齡\n\n");
?????printf(" ???????????????5.?班級(jí)\n\n");
?????printf(" ???????????????6.?成績(jī)\n\n");
?????printf(" ????????????????請(qǐng)選擇(1-6):");
??scanf("%d",&choice);
??switch(choice)
??{case 1:{
???????printf("\n ??請(qǐng)輸入你改的新學(xué)號(hào)");
???????????scanf("%d",&stu[i].num);
???break;
???}
???case 2:{
???????printf("\n ??請(qǐng)輸入你改的新姓名");
???????????scanf("%s",stu[i].name);
???break;
??}
???case 3:{
???????printf("\n ??請(qǐng)輸入你改的新性別");
???????????scanf("%s",stu[i].sex);
???break;
??}
???case 4:{
???????printf("\n ??請(qǐng)輸入你改的新年齡");
???????????scanf("%d",&stu[i].age);
???break;
??}
???case 5:{
???????printf("\n ??請(qǐng)輸入你改的新班級(jí)");
???????????scanf("%s",stu[i].studentclass);
???break;
??}
???case 6:{
???????printf("\n ??請(qǐng)輸入你改的新成績(jī)");
???????????scanf("%d",&stu[i].score);
???break;
??}
??}
?
???printf("學(xué)號(hào):%d,姓名:%s,性別:%s,年齡:%d,班級(jí):%s,成績(jī): %d\n",stu[i].num,stu[i].name,
?stu[i].sex,stu[i].age,stu[i].studentclass,stu[i].score);
???????printf("按任意鍵加回車返回主菜單!");
???scanf("%d",&i);
???break;
?}
}
?
?
/*學(xué)生成績(jī)信息排名*/
void sort(STUDENTS stu[])
??{ ?int i,j,n=1,x;
?????system("cls");
?????int t;
??????for(i=0;i<k-1;i++)
for(j=i+1;j<k;j++)
if(stu[i].score<stu[j].score)
{ t=stu[i].score;
??stu[i].score=stu[j].score;
??stu[j].score=t;
??????????????t=stu[i].num;
??stu[i].num=stu[j].num;
??stu[j].num=t;
?
}
?????for(i=0;i<k;i++)
printf("排名 ???學(xué)號(hào) ???成績(jī)\n %d ??????%d ??????%d\n",n++,stu[i].num,stu[i].score);
?????printf("按任意鍵加回車返回主菜單!");
?scanf("%d",&x);
?????getchar();
??}
?
void pagedis()
{
???printf(" \n\n\n ??????????????????**********************************\n");
???printf(" ??????????????????* ???????????????????????????????*\n");
???printf(" ??????????????????* ???????????????????????????????*\n");
???printf(" ??????????????????* ???????????????????????????????*\n");
???printf(" ??????????????????* ????歡迎進(jìn)入學(xué)生信息管理系統(tǒng) ??*\n");
???printf(" ??????????????????* ???????????????????????????????*\n");
???printf(" ??????????????????* ???????????????????????????????*\n");
???printf(" ??????????????????* ???????????????????????????????*\n");
???printf(" ??????????????????**********************************\n");
???
}
void check()
{
???char userName[5];/*用戶名*/
???char userPWD[5];/*密碼*/
???int i,sum;
???system("color 4E");
???for(i = 1; i < 4; i++)
???{
??????/*用戶名和密碼均為abcde;*/
????printf(" ??用戶名和密碼均為abcde\n\n");
????????printf("\n ??????請(qǐng)輸入您的用戶名:");
????????gets(userName);
????????
????????printf("\n ??????請(qǐng)輸入您的密碼:");
????????gets(userPWD);
????????
????????if ((strcmp(userName,"abcde")==0) && (strcmp(userPWD,"abcde")==0))/*驗(yàn)證用戶名和密碼*/
????????{
????????????printf("用戶名和密碼正確,顯示主菜單");
????????????return;
????????}
????????else
????????{
????????????if (i < 3)
????????????{
????????????????printf("用戶名或密碼錯(cuò)誤,提示用戶重新輸入");
????????????????printf("用戶名或密碼錯(cuò)誤,請(qǐng)重新輸入!");
????????????}
????????????else
????????????{
????????????????printf("連續(xù)3次輸錯(cuò)用戶名或密碼,退出系統(tǒng)。");
????????????????printf("您已連續(xù)3次將用戶名或密碼輸錯(cuò),系統(tǒng)將退出!");
????????????????exit(1);
????????????}
????????}
???}
}
void menu()
{
??STUDENTS stu[20];
??int choice,k,sum;
??sum=read_file(stu);
??if(sum==0)
???{ ?printf("首先錄入基本庫(kù)存信息!按回車后進(jìn)入*****\n");
??????getch();
??sum=input(stu);
???}
??
??do
??{ ?system("cls"); ?
?????printf("\n\n\n ??????????????********學(xué)生信息管理系統(tǒng)********\n\n");
?????printf(" ?????????????????????1.?創(chuàng)建學(xué)生信息\n\n");
?????printf(" ?????????????????????2.?打印學(xué)生信息\n\n");
?printf(" ?????????????????????3.?查詢學(xué)生信息\n\n");
?????printf(" ?????????????????????4.?修改學(xué)生信息\n\n");
?????printf(" ?????????????????????5.?刪除學(xué)生信息\n\n");
?????printf(" ?????????????????????6.?學(xué)生成績(jī)信息排名\n\n");
?????printf(" ?????????????????????0.?退出系統(tǒng)\n\n");
?????printf(" ??????????????????????請(qǐng)選擇(0-6):");
?????scanf("%d",&choice);
????switch(choice)
????{
??????case 1: k=input(stu); break;/*創(chuàng)建學(xué)生信息*/
??????case 2: output( stu) ; break;/*打印學(xué)生信息*/
??????case 3: inquire(stu); break;/*查詢學(xué)生信息*/
??????case 4: change(stu); break;/*修改學(xué)生信息*/
??????case 5: deletel(stu); break;/*刪除學(xué)生信息*/
??????case 6: sort(stu); break;/*學(xué)生成績(jī)信息排名*/
??????case 0: break;
????}
??}while(choice!=0);
??save_file(stu,sum);
}
int main()
{ ?
???
??
??int i,sum;
??pagedis();
??check();
??menu(); ??
??
}
}
轉(zhuǎn)載于:https://blog.51cto.com/11649559/1789602
總結(jié)
以上是生活随笔為你收集整理的C语言程序设计第三节课作业的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。