溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

c語(yǔ)言中如何設(shè)計(jì)和編寫(xiě)一個(gè)應(yīng)用系統(tǒng)?

發(fā)布時(shí)間:2020-07-25 14:34:03 來(lái)源:網(wǎng)絡(luò) 閱讀:414 作者:BGD150206327 欄目:編程語(yǔ)言

C程序中,如何設(shè)計(jì)和編寫(xiě)一個(gè)應(yīng)用系統(tǒng)?

 

一、 C語(yǔ)言文件的操作

1、 文件操作的基本方法:

C語(yǔ)言將計(jì)算機(jī)的輸入輸出設(shè)備都看作是文件。例如,鍵盤(pán)文件、屏幕文件等.

向屏幕輸出一個(gè)信息,例如“Hello”是

#include.h>

int main()

{

printf("Hello\\\\n");

}

從鍵盤(pán)接收一個(gè)字符串然后顯示是

#include.h>

int main()

{

   char a[10];

   scanf("%s",&a);

   printf("%s \\\\n",a);

}

那么,如果寫(xiě)一個(gè)字符串到一個(gè)文件中,是什么方式呢?顯示到屏幕上是默認(rèn)的輸出文件,如果是硬盤(pán)中的一個(gè)文件,首先要打開(kāi)一個(gè)文件,然后才能往里寫(xiě),那么就要告訴程序這個(gè)文件在什么地方,按照什么樣的方式打開(kāi)(讀、寫(xiě)、讀和寫(xiě)、添加、覆蓋等),然后打開(kāi)后要給這個(gè)打開(kāi)的文件一個(gè)符號(hào)(指針變量),表示后續(xù)的讀和寫(xiě)都是針對(duì)這個(gè)文件的,而不是到屏幕的,這個(gè)指針變量以后就代表了文件自身了。

定義一個(gè)代表文件的符號(hào)(指針變量)這樣的形式

FILE *fp;

其中FILE是固定的寫(xiě)法,后面的是指針變量名,可以隨意起。

這個(gè)時(shí)候fp還是一個(gè)空的指針變量,什么也沒(méi)有代表,類(lèi)似一個(gè)倉(cāng)庫(kù)里的貨架的標(biāo)簽,什么也沒(méi)有寫(xiě)。

然后讓這個(gè)指針變量指向一個(gè)文件,就是打開(kāi)一個(gè)文件,然后讓這個(gè)指針變量指向這個(gè)打開(kāi)的文件,后續(xù)對(duì)這個(gè)指針變量的操作就都是對(duì)這個(gè)文件的操作了。

打開(kāi)文件的語(yǔ)句是

fopen(文件位置,打開(kāi)模式);

文件位置好理解,就是文件所在的位置,例如c://test.txt

打開(kāi)模式有幾種,

r(read): 讀

w(write): 寫(xiě)

a(append): 追加

t(text): 文本文件,可省略不寫(xiě)

b(banary): 二進(jìn)制文件

+: 讀和寫(xiě)

一般是rt+,也可以寫(xiě)成r+,和w+,就是讀和寫(xiě),能保留原來(lái)的內(nèi)容。

所以打開(kāi)C盤(pán)下my目錄中的文件c:\\\\my\\\\test.txt的語(yǔ)句是

 

fp=fopen("c://my/test.txt","r+");

注意文件夾符號(hào)同上面的不同。

這個(gè)時(shí)候如果打開(kāi)的文件出問(wèn)題的話(huà),往一個(gè)空指針里面寫(xiě)東西是比較危險(xiǎn)的,很容易把系統(tǒng)弄崩潰了。所以在后續(xù)的讀寫(xiě)操作前,最好測(cè)試一下,打開(kāi)文件后這個(gè)文件指針fp是否還是空的,如果是空的話(huà),就不能往下執(zhí)行了。所以語(yǔ)句變成了這樣

if((fp=fopen(" c://my/test.txt ","r+")) == NULL)  

{

    printf("文件沒(méi)有正確打開(kāi),不能往下執(zhí)行了. \\\\n");     

    exit(1);    

}

完整的程序成了這樣

#include.h>

int main()

{

   FILE *fp;

   if((fp=fopen("c://my/test.txt","r+"))==NULL)  

   {

      printf("文件沒(méi)有正確打開(kāi),不能往下執(zhí)行了. \\\\n");

  return(1);

   }

}

你會(huì)看到,程序報(bào)錯(cuò),因?yàn)闆](méi)有my這個(gè)目錄,所以你要在C盤(pán)下先建立一個(gè)my目錄,然后建立一個(gè)test.txt文件。或者你打開(kāi)方式選擇寫(xiě)和讀,如果沒(méi)有目錄或者文件的話(huà),程序會(huì)自動(dòng)幫你建一個(gè)文件。就是這樣

if((fp=fopen("c://my/test.txt","w+"))==NULL)  

有時(shí)間自己可以百度一下C語(yǔ)言打開(kāi)文件的類(lèi)型,功能非常豐富。

然后就可以用前面的輸入和輸出語(yǔ)句,向文件中寫(xiě)內(nèi)容了,同咱們上學(xué)期學(xué)的是一致的,就是在printf和scanf前面加f,成為fprint和fscanf,表示向文件輸出和從文件輸入,不是向屏幕輸出和從鍵盤(pán)輸入。

下面的程序?qū)崿F(xiàn)了從鍵盤(pán)輸入一個(gè)字符,然后寫(xiě)到文件中。

#include.h>

int main()

{

   char a[20];

   char b[20];

   printf("請(qǐng)輸入一個(gè)字符串(小于20個(gè)字符),寫(xiě)到c://my/test.txt中 \\\\n"); 

   scanf("%s",&a);

   

   FILE *fp;

   if((fp=fopen("c://my/test.txt","w+"))==NULL)  

   {

      printf("文件沒(méi)有正確打開(kāi),不能往下執(zhí)行了. \\\\n");

  return(1);

   }

   fprintf(fp,"%s",a); 

   fclose(fp);

}

 

執(zhí)行完后,你打開(kāi)文件看看,你寫(xiě)的字符是否寫(xiě)進(jìn)去了?

然后,你在記事本中在文件中寫(xiě)一個(gè)字符串,例如你的名字,然后用fscanf讀出來(lái),而不用在屏幕上輸入了。

#include.h>

int main()

{

   char a[20];

   

   

   FILE *fp;

   if((fp=fopen("c://my/test.txt","r+"))==NULL)  

   {

      printf("文件沒(méi)有正確打開(kāi),不能往下執(zhí)行了. \\\\n");

  return(1);

   }

   fscanf(fp,"%s",&a); 

   printf("%s \\\\n",a);

   fclose(fp);

}

讀取文件的時(shí)候有個(gè)指針,保證按照順序依次往下讀,如果讀到頭了想從頭再來(lái),類(lèi)似看書(shū)一頁(yè)頁(yè)讀完了想到頭上重新操作,用函數(shù)rewind(fp)就可以了,如果想定位到某個(gè)位置,類(lèi)似將書(shū)翻到某一頁(yè),用fseek(fp,偏移量,基準(zhǔn)),就是在基準(zhǔn)(0代表文件頭,1代表當(dāng)前位置,2代表文件尾)的基礎(chǔ)上便宜多少。

這就是基本的文件的讀寫(xiě)語(yǔ)句。有了文件的讀寫(xiě)后,才能進(jìn)行管理系統(tǒng)的開(kāi)發(fā),因?yàn)槟愕暮芏嘈畔⒁娣诺轿募胁判?,否則在程序中,關(guān)機(jī)后數(shù)據(jù)就沒(méi)有了。

 

 

2、 能存儲(chǔ)多個(gè)信息的結(jié)構(gòu)體和結(jié)構(gòu)體變量

上學(xué)期學(xué)過(guò),一個(gè)變量可以保存一個(gè)數(shù)據(jù),例如

int a; double b; char c[20];

則a可以保存一個(gè)整數(shù),b可以保存一個(gè)實(shí)數(shù),c可以保存一串字符(字符串)。

但是如果一個(gè)系統(tǒng)中,例如學(xué)生信息管理系統(tǒng)中,需要同時(shí)保存一個(gè)學(xué)生的姓名,性別,年齡等信息,那么設(shè)置變量保存很多同學(xué)的這些信息就有點(diǎn)不太方便。類(lèi)似一個(gè)登記本,每一頁(yè)只能寫(xiě)名字,如果你要登記其他的信息,又要添加一個(gè)登記本,只能寫(xiě)性別,如果登記年齡,又要添加一個(gè)登記本,只能寫(xiě)年齡,.,多么的不方便,還容易混亂。解決的方法你一定想,多么簡(jiǎn)單,一個(gè)登記本一頁(yè)中,同時(shí)寫(xiě)姓名,性別,年齡不就行了嗎?C語(yǔ)言也是這樣,如果定義一種形式,一個(gè)變量同時(shí)記錄很多的信息,這樣在管理系統(tǒng)中,就方便很多了。這就是結(jié)構(gòu)體。

結(jié)構(gòu)體首先要定義,因?yàn)槊總€(gè)程序用到的組合在一起的信息不一樣,例如學(xué)生信息管理系統(tǒng)中,可能要將學(xué)號(hào)、姓名、性別、年齡、班級(jí)組合到一起,所以 第一行用struct告訴程序,下面是一個(gè)結(jié)構(gòu)體,后面的stu是這個(gè)結(jié)構(gòu)體的類(lèi)型,類(lèi)似整數(shù)用int表示,這個(gè)stu是你自己起的名字。

typedef stu  

{   int num;/*學(xué)號(hào)*/

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

char sex[5];/*性別*/

int age;/*年齡*/

char sclass[20];/*班級(jí)*/

};

這個(gè)結(jié)構(gòu)體中,包括了5個(gè)變量。

這樣就有了一個(gè)新的變量類(lèi)型,stu,這個(gè)變量類(lèi)型是你自己定義的,同int,float是一樣的。

如果定義一個(gè)整數(shù)變量a,你一定知道是

int a;

a=3;

那個(gè)定義一個(gè)你自己定義的stu類(lèi)型的變量a,這樣的形式,其中前面的struct告訴編譯程序,這個(gè)stu是你自己定義的結(jié)構(gòu)體類(lèi)型,后面的a就是一個(gè)結(jié)構(gòu)體變量了。

struct stu a;

但是賦值的時(shí)候,因?yàn)檫@個(gè)時(shí)候的a,代表了很多的信息,有num,name,sex,class,就是a中實(shí)際上是包括了很多的變量,那么怎么賦值呢?用點(diǎn)運(yùn)算符.,就是a.num,a.name,a.sex,a.class,這個(gè)道理類(lèi)似剛才提到的記錄本每一頁(yè)記錄很多信息,這個(gè)a就代表1頁(yè)紙,里面有很多信息欄,這一頁(yè)紙的學(xué)號(hào)欄就用a.num表示,其他類(lèi)似。如果有很多學(xué)生怎么辦呢?那就多設(shè)置幾個(gè)stu類(lèi)型的變量,例如a1,a2,a3就行放很多同學(xué)的信息,你一定想到,這不是一個(gè)好辦法,因?yàn)樾畔⒍家粯?,有就是登記本每一?yè)的格式都是一樣的,這種方式適合用數(shù)組, 

stu a[80];

這樣,分別用a[0],a[1],a[2],就可以存放至多到80個(gè)同學(xué)的信息了。

所以程序可以這樣

#include.h>

 

struct stu  

{   int num; /*學(xué)號(hào)*/

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

char sex[5];/*性別*/

int age;/*年齡*/

char sclass[20];/*班級(jí)*/

};

int main()

{

struct stu a;

printf("依次輸入學(xué)號(hào),姓名,性別,年齡,班級(jí),用回車(chē)分割,系統(tǒng)會(huì)顯示輸入的內(nèi)容 \\\\n"); 

scanf("%d%s%s%d%s",&a.num,&a.name,&a.sex,&a.age,&a.sclass);

printf("以下是剛才輸入的信息保存到stu類(lèi)型變量a中后的結(jié)果 \\\\n");

printf("%d%s%s%d%s",&a.num,&a.name,&a.sex,&a.age,&a.sclass);

}

 

現(xiàn)在你已經(jīng)很有進(jìn)步了,可以用一個(gè)變量存儲(chǔ)很多信息了。

 

3、 函數(shù)的應(yīng)用和結(jié)構(gòu)化程序設(shè)計(jì)

如果沒(méi)有班級(jí)的話(huà),咱們?nèi)W(xué)生在一個(gè)班里面,可以想象管理會(huì)多么混亂。咱們想了一個(gè)辦法,把同學(xué)按照專(zhuān)業(yè)分到不用的班級(jí)中,這樣管理起來(lái)就方便多了,系里發(fā)通知等,只發(fā)到班長(zhǎng)就行了,由班長(zhǎng)向下傳達(dá),班級(jí)內(nèi)部更改活動(dòng)內(nèi)容,也跟其他班級(jí)沒(méi)有關(guān)系,自己關(guān)起門(mén)來(lái)修改就可以了。所以程序也是這樣,如果是把所有的代碼都放到一起,那跟全校所有的同學(xué)都在一個(gè)班級(jí)一樣,互相之間相互聯(lián)系,程序代碼短還沒(méi)有什么問(wèn)題,程序代碼量一多了,將非常難管理。所以按照功能,將不同的代碼放到一起,用大括號(hào)括起來(lái),然后給這段代碼起個(gè)名字表示,類(lèi)似咱們班級(jí)的名字,然后還要設(shè)置上參數(shù),一遍使用這個(gè)函數(shù)的時(shí)候向里傳遞實(shí)際的值,類(lèi)似一個(gè)加法的函數(shù),完成兩個(gè)數(shù)的相加,我們可以寫(xiě)成

myadd(int a, int b)

{

   int c;

   c=a+b;

   return c;

}

myadd就是我們給這個(gè)函數(shù)起的名字,以便使用,a和b的作用接收調(diào)用者傳遞過(guò)來(lái)的數(shù),然后把接收的兩個(gè)數(shù)相加后返回,這個(gè)函數(shù)的值在調(diào)用后就是返回的值c,所以如果我們想算99+23等于多少,只要調(diào)用我們寫(xiě)好的函數(shù) 

myadd(99,23),這個(gè)時(shí)候函數(shù)的值就是99+23了,如果把結(jié)果保存在變量d中,可以寫(xiě)成

d=myadd(99,23);

有了函數(shù),我們就可以把不同功能的代碼組織到一起,不僅自己方便,而且程序特別簡(jiǎn)單明了,便于修改,其他人寫(xiě)的函數(shù)我們還可以直接拿來(lái)用。

所以我們的這個(gè)學(xué)生信息管理系統(tǒng)形式就非常簡(jiǎn)單了,一共用到了三個(gè)函數(shù)

int main()

{  

  int i,sum;

  pagedis();

  check();

  menu();   

}

第一個(gè)是顯示歡迎頁(yè)面,第二個(gè)是驗(yàn)證用戶(hù)名和口令,第三個(gè)是顯示菜單,并根據(jù)用戶(hù)的輸入選擇執(zhí)行相應(yīng)的操作。

還有一些其他的函數(shù),分別是menu()菜單函數(shù)調(diào)用的子函數(shù)。

結(jié)構(gòu)話(huà)程序后大概的形式就是這樣

 

#include.h>

void pagedis();

void check();

void menu();

int main()

{

  pagedis();

  check();

  menu();  

}

void pagedis(){

printf("我是顯示歡迎界面的模塊,具體內(nèi)容還要再完善! \\\\n");

}

void check(){

printf("我是驗(yàn)證用戶(hù)合法性的模塊,具體內(nèi)容還要再完善! \\\\n");

}

void menu(){

printf("我是引導(dǎo)用戶(hù)執(zhí)行各個(gè)功能的模塊,具體內(nèi)容還要再完善! \\\\n");

}

 

這就是結(jié)構(gòu)化程序設(shè)計(jì),把功能放到函數(shù)中,下一步就可以集中精力,完善函數(shù)中的內(nèi)容。

 

4、 顯示歡迎頁(yè)界面

首先完善顯示歡迎頁(yè)的界面,這個(gè)就是printf(“….)函數(shù)顯示字符串,但是要注意用空格和\\\\n位置定位,使得顯示界面美觀(guān)。

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");

   

}

 

5、 用戶(hù)安全認(rèn)證

 

這個(gè)函數(shù)中,用到了gets()函數(shù),從鍵盤(pán)接收一個(gè)字符,還有strcmp(字符串1,字符串2),比較兩個(gè)字符串是否一致,注意不能用==來(lái)判斷兩個(gè)數(shù)組是否相等,只能用==判斷數(shù)組的元素是否相等。

 

void check()

{

   char userName[5];/*用戶(hù)名*/

   char userPWD[5];/*密碼*/

   int i,sum;

   system("color 4E");

   for(i = 1; i < 4; i++)

   {

      /*用戶(hù)名和密碼均為abcde;*/

    printf("   用戶(hù)名和密碼均為abcde\\\\n\\\\n");

        printf("\\\\n       請(qǐng)輸入您的用戶(hù)名:");

        gets(userName);

        

        printf("\\\\n       請(qǐng)輸入您的密碼:");

        gets(userPWD);

        

        if ((strcmp(userName,"abcde")==0) && (strcmp(userPWD,"abcde")==0))/*驗(yàn)證用戶(hù)名和密碼*/

        {

            printf("用戶(hù)名和密碼正確,顯示主菜單");

            return;

        }

        else

        {

            if (i < 3)

            {

                printf("用戶(hù)名或密碼錯(cuò)誤,提示用戶(hù)重新輸入");

                printf("用戶(hù)名或密碼錯(cuò)誤,請(qǐng)重新輸入!");

            }

            else

            {

                printf("連續(xù)3次輸錯(cuò)用戶(hù)名或密碼,退出系統(tǒng)。");

                printf("您已連續(xù)3次將用戶(hù)名或密碼輸錯(cuò),系統(tǒng)將退出!");

                exit(1); 

            }

        }

   }

}


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI