亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        關(guān)于C語言教學(xué)方法和程序設(shè)計(jì)的探討

        2007-01-01 00:00:00陳仲民
        計(jì)算機(jī)教育 2007年6期

        摘要:本文討論了C語言教學(xué)方法及若干程序設(shè)計(jì)技巧。

        關(guān)鍵詞:C語言;教學(xué)方法;程序設(shè)計(jì)

        中圖分類號(hào):G642 文獻(xiàn)標(biāo)識(shí)碼:B

        文章編號(hào):1672-5913(2007)06-0003-04

        C語言是目前國內(nèi)理工科專業(yè)的首選教學(xué)語言,它功能強(qiáng)大,表達(dá)靈活方便,面向硬件,但學(xué)生接受起來有一定的難度。如何提高教學(xué)質(zhì)量,讓學(xué)生盡快掌握這門語言,值得探討。下面根據(jù)筆者多年來的教學(xué)體會(huì),談?wù)勛约旱南敕ā?/p>

        1 研究教學(xué)方法,提高教學(xué)水平

        首先要培養(yǎng)學(xué)生的學(xué)習(xí)興趣。教師要在教學(xué)方法與手段上多下功夫,加強(qiáng)對(duì)學(xué)生的引導(dǎo),在講清語法規(guī)則的基礎(chǔ)上,可通過許多具體有趣的實(shí)例,如“兔子問題”、“水仙花數(shù)”、“競(jìng)賽記分”等來激發(fā)學(xué)生的學(xué)習(xí)主動(dòng)性與積極性,綜合利用板書、課件、程序演示等手段,做好師生互動(dòng),使學(xué)生加強(qiáng)理解和記憶。

        教學(xué)過程上要講究循序漸進(jìn)。教師要在充分備課的基礎(chǔ)上,吃透教學(xué)內(nèi)容,對(duì)課程的重難點(diǎn)胸中有數(shù),重視層次性和條理性,既注意教學(xué)內(nèi)容本身的系統(tǒng)性和科學(xué)性,又要注意通俗性、可接受性和啟發(fā)性,由淺到深,由表及里,環(huán)環(huán)相扣,真正做到精選精講,授課時(shí)突出解題思路、方法和步驟,使學(xué)生掌握如何分析和解決問題,逐漸培養(yǎng)學(xué)生進(jìn)行程序設(shè)計(jì)的正確思維模式。

        要特別重視培養(yǎng)學(xué)生的實(shí)踐動(dòng)手能力。學(xué)好一門語言除了理解語法規(guī)則和掌握算法思想外,最重要的就是多編程、多上機(jī)、多調(diào)試。任務(wù)驅(qū)動(dòng)下的協(xié)作學(xué)習(xí)是學(xué)習(xí)C語言課程的好方法,教師要在教學(xué)實(shí)踐中為學(xué)生創(chuàng)造協(xié)作學(xué)習(xí)的環(huán)境,及時(shí)發(fā)現(xiàn)問題并予以指導(dǎo)。除正常的上機(jī)實(shí)驗(yàn)課外,可通過布置大作業(yè)及安排實(shí)習(xí)周的模式,來強(qiáng)化對(duì)學(xué)生的訓(xùn)練。

        最后,要作好課外輔導(dǎo)。建立C語言學(xué)習(xí)網(wǎng)站,包括課程內(nèi)容、習(xí)題解答、實(shí)驗(yàn)指導(dǎo)、在線測(cè)試、網(wǎng)上答疑等,充分發(fā)揮學(xué)生的主觀能動(dòng)性,充分利用計(jì)算機(jī)網(wǎng)絡(luò)為教學(xué)服務(wù),進(jìn)一步提高教學(xué)質(zhì)量。

        2 關(guān)于C語言程序設(shè)計(jì)中值得注意的若干問題

        2.1 幾個(gè)易出錯(cuò)的問題

        (1)++ i和i++的區(qū)別:++ i是先執(zhí)行i=i+1后,再使用i的值;而i++是先使用i的值后,再執(zhí)行i=i+1。如:i=3,printf(″%d″, + + i)輸出值為4;若用printf(″%d″,i + +),則輸出值為3?!? -”與此類似。

        (2)對(duì)邏輯與,如果第一個(gè)操作數(shù)的值為0,則第二個(gè)操作數(shù)就不再被計(jì)值;而對(duì)邏輯或||,如果第一個(gè)操作數(shù)為1,則第二個(gè)操作數(shù)不再被計(jì)值。

        例如下述的程序段寫法有問題:

        if(a>3 b = = (c=5*3))

        a=c;

        else a=c+1;

        其目的是當(dāng)a大于3而且b與c的值(5×3)相等時(shí),把c值賦給a。但實(shí)際上當(dāng)a不大于3時(shí),第二個(gè)表達(dá)式(c=5*3)不再被計(jì)值,所以c的值并不等于15(因?yàn)闆]有運(yùn)算5*3并賦值給c),從而a=c+1的結(jié)果就不正確。在編程中遇到這類問題,應(yīng)把必須參加運(yùn)算的表達(dá)式寫在前面。因而上例應(yīng)改寫成:

        if(b = = (c = 5 * 3) a>3)……

        再如:int x=5, y=0, z=6, i;

        i=x-3 | | + + y | | z*5;

        printf(\"i=%d, y=%d, z=%d\",i, y, z);

        其結(jié)果是i=1, y=0, z=6,而不是i=1, y=1, z=30。理由很簡(jiǎn)單,由于x-3非零值,即可得出i結(jié)果1(真),不再繼續(xù)判斷y和z*5的值。

        (3)比較兩數(shù)是否相等用“= =”,而不是“=”,因?yàn)楹笳呤琴x值運(yùn)算符。但比較兩字符串是否相等,則用庫函數(shù)“strcmp(char *, char * )”,而不能用“= =”。

        (4)庫函數(shù)getchar使用中應(yīng)注意的問題。請(qǐng)看下面的一個(gè)例子:

        # include

        main( )

        {

        int ch;

        int year;

        do {

        printf(\"please input year: \\ n\");

        scanf(\"%d\", year);

        if(year%4 = = 0 year% 100! =0 || year% 400 = = 0)

        printf(\"YES %d \\ n\",year);

        else

        printf(\"NO%d\\", year);

        printf(\"Y-continue, any key - -

        exit \\ n\");

        error:ch=getchar ( ) ;

        } while (ch = = `Y`|| ch = =`Y`);

        }

        上面程序其本意是,當(dāng)輸入完年份后,按“Y”或“y”繼續(xù),其實(shí)做不到,因?yàn)槊枯斎胍粋€(gè)數(shù)還須按一下回車,為了去掉這個(gè)回車,須再加一個(gè)getchar()語句。將標(biāo)號(hào)為error的語句改為getchar(),ch=getchar();就可以了。

        (5)關(guān)于文件讀寫語句,fread函數(shù)和fwrite函數(shù)一般只適宜于讀寫數(shù)據(jù)塊,尤其是讀寫結(jié)構(gòu)體變量最為合適,而對(duì)文本文件的讀寫用fscanf函數(shù)和fprintf函數(shù)最方便。另外,對(duì)文件的讀寫應(yīng)注意文件指針的位置。如下例,要求從鍵盤中輸入若干行字符(每行長(zhǎng)度不等),輸入后把它們存儲(chǔ)到一磁盤文件中,再從該文件中讀入這些數(shù)據(jù),將其小寫轉(zhuǎn)換成大寫字母在顯示屏上輸出。

        # include\"stdio.h\"

        main( )

        {

        char c;

        FILE* fp;

        it((fp=fopen(\"c:czmt\", \"w+\")) = = NULL)

        { printf(\"\\ ncan`t open file\");

        exit(0);}

        while((c=getchar())! =EOF)

        fputc(c,fp);

        linel: while((c = fgetc(fp))! =EOF)

        { if(c>=`a`c< =`z`) c=c -32;

        putchar(c);}

        fclose(fp);

        }

        上面程序達(dá)不到要求的效果。原因在于執(zhí)行完\"fputc(c,fp);\"后,文件指針已不在開始位置,應(yīng)用rewind函數(shù)使文件指針重新回到文件開頭,在標(biāo)號(hào)為linel語句前加上一句\"rewind(fp);\"就可以了。

        2.2 遞歸和指針

        C語言中,遞歸的應(yīng)用比較靈活,如下面的例子,將一個(gè)整數(shù)n轉(zhuǎn)換成字符串,例如,輸入483,應(yīng)輸出字符串“483”,n位數(shù)不確定,可以是任意位數(shù)的整數(shù)。用遞歸法編制的程序如下:

        include\"stdio.h\"

        void change(m)

        int m;

        {int k= m%10;

        if(m/10) m = m/10, change(m);

        printf(\"%d\",k);

        }

        main()

        { int i;

        printf(\"\\ nplease input a number \\ n\");

        scanf(\"%d\", i);

        if(i<0)i=-i, printf(\"-\");

        change(i);

        }

        指針是C語言中最靈活、最復(fù)雜且最重要的類型,將指針、函數(shù)、數(shù)組與運(yùn)算符結(jié)合時(shí),經(jīng)常使一些說明語句變得很復(fù)雜,使人難以理解。例如:int(* p)[],由于加括號(hào)后*號(hào)的優(yōu)先級(jí)最高,故應(yīng)讀做:指向整型數(shù)組的指針;而int* p[ ]由于[]比*的優(yōu)先級(jí)高,則應(yīng)讀做指向整數(shù)型的指針數(shù)組。同理,對(duì)int* p()[],函數(shù)圓括號(hào)()與[]的優(yōu)先級(jí)相同,但由于它出現(xiàn)在方括號(hào)前面,因此,它的優(yōu)先級(jí)高些,故讀做返回整型指針數(shù)組(首地址)的函數(shù)。

        3 靈活應(yīng)用C語言編制程序

        對(duì)同一個(gè)問題可以多種方法實(shí)現(xiàn),如下面的例子,在A盤上有一個(gè)數(shù)據(jù)文件js.dat,文件中有10個(gè)整數(shù)為:3 8 17 28 39 44 56 73 80 95,編程從js.dat中取出這10個(gè)數(shù),將其中的素?cái)?shù)輸出到文件A:js.out中,要求求素?cái)?shù)過程必須用子函數(shù)prime( )。我們可用3種方法實(shí)現(xiàn),一是函數(shù)不設(shè)返回值,main函數(shù)和prime函數(shù)都對(duì)同一個(gè)數(shù)組操作;二是每次只返回一個(gè)值,多次調(diào)用prime函數(shù);還有一種方法就是,函數(shù)的返回值設(shè)為指針(數(shù)組的首地址),調(diào)用一次prime函數(shù)即可。程序分別如下:

        /* filel.c* /

        #include\"stdio.h\"

        # include\"math.h\"

        void prime( );

        int a[10];

        main( )

        {

        FILE* fp, * fpl;

        int i;

        if((fp=fopen(\"a:js.dat\",\"r\")) = = NULL)

        {printf(\" \\ n can`t open file\");

        exit(0);}

        for (i=0;i< = 9; i + +)

        fscanf(fp, \"%d\", a[i]);

        if ((fpl=fopen(\"a:js.out\", \"w\")) = = NULL)

        {

        printf(\" \\ n can`t write file\");

        exit(0); }

        prime(a);

        for(i=0;a[i]! =0i< = 9; i + +)

        fprintf(fpl, \"%d\", a[i]);

        fclose(fp), fclose(fpl);

        }

        void prime(a)

        int a[ ];

        {

        int i,j,k,m=0;

        for(i=0;i<=9;i+ +)

        {

        k=sqrt(a[i]);

        for(j=2;j<=k;j + + )

        {if(a[i]%j = =0)break;}

        if(j>k) a[m + + ] = a[i];

        }

        for(;m< =9;m + + )

        a[m] = 0 ;

        return;

        }/* end* /

        / * file2. c* /

        # include < stdio.h >

        # include < math.h >

        main()

        {

        int a[10], b, i;

        FILE* fp, * fpl;

        if((fp=fopen(\"A:js.dat\", \"r\"))= = NULL)

        { printf(\"can`t open a:js. dat \\ n\");

        exit(1);}

        if ((fpl=fopen(\"A:js. out\", \"w\"))= = NULL)

        { printf(\"can`t open a:js. out \\ n\");

        exit(1);}

        for(i=0;i<= 9;i+ +)

        fscanf(fp, \"%d\", a[i]);

        for(i=0;i< =9; i + +)

        {b=prime(a[i]);

        if(b! =0)

        fprintf(fpl, \"%d\\ n\",b); }

        fclose(fp), fclose(fpl);

        }

        int prime(a)

        int a;

        {

        int k, t, b;

        k=sqrt(a);

        for(t=2;t< =k; t+ +)

        if ((a%t)= = 0)break;

        if(t>k)return(a);

        else retun (0);

        }/* end* /

        /* file3.c* /

        # include

        # include

        int* prime();

        main()

        {

        int i;

        static int a[10];

        int* b;

        FILE* fp, * fpl;

        if((fp=fopen(\"A:js.dat\",\"r\")) = = NULL)

        { printf(\"can`t open a:js. dat \\ n\");

        exit(1);}

        if ((fpl=fopen(\"A:js.out\",\"w\")) = =NULL)

        {printf(\"can`t open file \\ n\");

        exit(1);}

        for(i=0;i<=9;i + +)

        fscanf(fp, \"%d\", a[i]);

        b=prime(a);

        while (* b)

        {

        fprintf(fpl, \"%d\", * b + +);

        }

        fclose(fp), fclose(fpl);

        }

        int* prime(a)

        int a[ ];

        {

        int i,j,k,m=0;

        static int b[10];

        for(i=0;i< =9;i + +)

        {

        k=sqrt(a[i]);

        for(j=2; j< =k;j + +)

        if((a[i]%j) = =0) break;

        if (j>k)b[m + + ] = a[i];

        }

        return(b);

        }/* end*/

        參考文獻(xiàn):

        [1] 譚浩強(qiáng).C程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,1991.

        [2] Boris Allan.C Programming principles practice[M].Paradigm Publishing,1987.

        收稿日期:2006-11-29

        作者簡(jiǎn)介:陳仲民(1964-),男,副教授,研究方向:并行與分布式計(jì)算,軟件工程。

        国产精选污视频在线观看| 久久久久久成人毛片免费看| 亚洲一区二区三区成人| 久久久精品国产亚洲麻色欲| 青青青爽在线视频免费播放| 一本久道综合色婷婷五月| 野花社区视频www官网| 91精品全国免费观看青青| 少妇人妻字幕一区二区| 亚洲人成在久久综合网站| 中文字幕丰满伦子无码| 亚洲美女影院| 精品国产一区二区三区男人吃奶| 穿着白丝啪啪的av网站| 亚洲国产精品毛片av不卡在线| 国模私拍福利一区二区| 天堂女人av一区二区| 国产亚洲精品久久情侣| gv天堂gv无码男同在线观看| 久久亚洲精品成人| 日本一区二区三区在线视频观看 | 曰韩少妇内射免费播放| 日本丰满熟妇bbxbbxhd| 国产成人久久蜜一区二区| av资源在线免费观看| 亚洲午夜久久久久久久久电影网 | 亚洲AV无码一区二区三区ba| 国产自拍精品视频免费观看| 18禁止进入1000部高潮网站| 国产乱人伦在线播放| 一本一道AⅤ无码中文字幕| 一区二区三区精品免费| 最新日本一道免费一区二区| 四虎永久免费一级毛片| 久久色悠悠亚洲综合网| 久久午夜精品人妻一区二区三区| 中国熟妇人妻xxxxx| 亚洲午夜久久久久中文字幕久 | 国产精品久久久久乳精品爆| 色综合久久丁香婷婷| 蜜桃av一区二区三区久久|