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