C程序設(shè)計語言:第一章練習(xí)

??練習(xí)1-1?在你自己的系統(tǒng)中運行”hello,world“程序。再有意去掉部分內(nèi)容夫植,會看到什么出錯信息。

??練習(xí)1-2?做個實驗,當(dāng)printf函數(shù)的參數(shù)字符串中包含\c(其中c是上面的轉(zhuǎn)義字符序列中未曾列出的某一個字符)時详民,觀察一下啊情況延欠。
??warning C4129: “c”: 不可識別的字符轉(zhuǎn)義序列

??練習(xí)1-3?修改溫度轉(zhuǎn)換程序,使之能在轉(zhuǎn)換表的頂部打印一個標(biāo)題沈跨。

#include<stdio.h>
int main()
{
    float fahr, celsius;
    float lower, upper, step;

    lower = 0;
    upper = 300;
    step = 20;

    fahr = lower;
    printf(" Fahr    Celsius\n");
    while (fahr<=upper)
    {
        celsius = 5 * (fahr - 32) / 9;
        printf("%3.0f\t%6.1f\n", fahr, celsius);
        fahr = fahr + step;
    }
    getchar();
}

??練習(xí)1-4?編寫一個程序打印攝氏溫度轉(zhuǎn)換為相應(yīng)華氏溫度的的對照表由捎。

#include<stdio.h>
int main()
{
    float fahr, celsius;
    float lower, upper, step;

    lower = 0;
    upper = 300;
    step = 20;

    celsius= lower;
    printf(" Celsius    Fahr\n");
    while (celsius<=upper)
    {
        fahr = celsius * 9 / 5 + 32;
        printf("%3.0f\t%6.1f\n", celsius, fahr);
        celsius = celsius +step;
    }
    getchar();
}

??練習(xí)1-5?修改溫度轉(zhuǎn)換程序,要求以逆序(即按照從300度到0度的順序)打印溫度轉(zhuǎn)換表饿凛。(嘗試用for語句)

#include<stdio.h>
int main()
{
    float fahr, celsius;
    float lower, upper, step;

    lower = 0;
    upper = 300;
    step = 20;

    
    printf(" Fahr    Celsius\n");
    for (fahr = lower; fahr <= upper; fahr = fahr + step)
    {
        printf("%3.0f\t%6.1f\n", fahr, 5 * (fahr - 32) / 9);
    }
    getchar();
}

??練習(xí)1-6?驗證表達式getchar()!=EOF的值是0還是1狞玛。

#include<stdio.h>
int main()
{
    int c;
    while (c=(getchar()!=EOF))
    {
        printf("%d isn't EOF\n", c);
    }
    printf("%d is EOF", c);
    getchar();
}

??練習(xí)1-7?編寫一個打印EOF值的程序。

#include<stdio.h>
int main()
{
    printf("%d is EOF", EOF);
    getchar();
}

??練習(xí)1-8?編寫一個統(tǒng)計空格涧窒、制表符心肪、換行符個數(shù)的程序。

#include<stdio.h>
int main()
{
    int c, row_num, blank_num, t_num;
    row_num = blank_num = t_num = 0;
    while ((c=getchar())!=EOF)
    {
        switch (c)
        {
        case '\n':
            row_num++;
            break;
        case ' ':
            blank_num++;
            break;
        case '\t':
            t_num++;
        default:
            break;
        }
        printf("row_num:%d,blank_num:%d,t_num:%d\n", row_num, blank_num, t_num);
    }
}

??練習(xí)1-9?編寫一個將輸入復(fù)制到輸出的程序纠吴,并將其中連續(xù)多個空格用一個空格代替硬鞍。

#include<stdio.h>
int main()
{
    int a,b;
    while ((a=getchar())!=EOF)
    {
        if (a == ' '&& b==' ')  //如果發(fā)現(xiàn)a為空格,且排在后面的b也為空格則直接跳過該a
        {
            continue;
        }
        else
        {
            b = a;
        }
        printf("%c", b);
    }
}

??練習(xí)1-10?編寫一個將輸入復(fù)制到輸出的程序戴已,并將其中的制表符替換為\t固该,并把回退符替換為\b,并把反斜杠替換為\恭陡。這樣可以將制表符和回退符以可見的方式顯現(xiàn)出來蹬音。

#include<stdio.h>
int main()
{
    int c;
    while ((c=getchar())!=EOF)
    {
        switch (c)
        {
        case '\t':
            printf("\\t");      //putchar()一次只能輸出一個字符不好實現(xiàn)效果
            break;
        case '\b':
            printf("\\b");
            break;
        case '\\':
            printf("\\\\");
            break;
        default:
            break;
        }
    }
}

??練習(xí)1-11?你準(zhǔn)備如何測試單詞計數(shù)程序?如果程序存在某種錯誤休玩,那么什么樣的輸入最可能發(fā)現(xiàn)這類錯誤著淆?

??該單詞計數(shù)程序:

#include<stdio.h>

#define IN  1   //在單詞內(nèi)
#define OUT 0   //在單詞外

//統(tǒng)計輸入行數(shù)、單詞數(shù)與字符數(shù)
int main()
{
    int c, nl, nw, nc, state;

    state = OUT;
    nl = nw = nc = 0;
    while ((c=getchar())!=EOF)
    {
        ++nc;
        if (c == '\n')
        {
            ++nl;
        }
        if (c == ' ' || c == '\n' || c == '\t')
        {
            state = OUT;
        }
        else if (state == OUT)
        {
            state = IN;
            ++nw;
        }
        printf("%d %d %d\n", nl, nw, nc);
    }
}

答:單詞計數(shù)工作要從沒有任何輸入的情況下開始拴疤。此時永部,該程序的輸出結(jié)果應(yīng)該是“0 0 0”,即零行呐矾、零單詞苔埋、零字符。
??接下來測試輸入的單字符單詞的情況蜒犯。此時组橄,該程序的輸入結(jié)構(gòu)應(yīng)該是“1 1 2”,即一行罚随、一個單詞玉工、兩個字符(一個字符加上一個換行符)。
??再測試一個由兩個字符組成的單詞淘菩。此時遵班,該程序的輸入結(jié)果為“1 1 3”,即一行、一個單詞狭郑、三個字符(兩個字母加上一個換行符)腹暖。
??讓后再測試兩個單詞的情況。首先翰萨,兩個單詞出現(xiàn)在同一行脏答,此時的輸出結(jié)果應(yīng)該是“1 2 4”;然后亩鬼,兩個單詞各占一行以蕴,此時的輸出結(jié)果應(yīng)該是“2 2 4”。
??那些滿足邊界條件的輸入情況最有助于發(fā)現(xiàn)單詞計數(shù)程序中的錯誤辛孵。這些邊界條件包括:
??——沒有輸入
??——沒有單詞(只有換行符)
??——沒有單詞(只有空格、制表符赡磅、和換行符)
??——每個單詞各占一行的情況(沒有空格和制表符)
??——單詞出現(xiàn)于文本行行首的情況
??——單詞出現(xiàn)于一串空格之后的情況

??練習(xí)1-12?編寫一個程序魄缚,以每行一個單詞的形式打印其輸入。
??自己的答案:

#include<stdio.h>

int main()
{
    int a, b, state;
    while ((a=getchar())!=EOF)
    {   //a不為空時焚廊,直接賦值給b
        if (a != ' ')
        {
            b = a;
            putchar(b);
        }
        //a位空時分b也為空即連續(xù)空格的情況冶匹,和b不為空格的情況
        if ((a == ' ')&&(b==' '))
        {
            continue;
        }
        if ((a == ' ') && (b != ' '))
        {
            b = a;
            putchar('\n');
        }
    }
}

??標(biāo)準(zhǔn)答案:

#include<stdio.h>

#define IN  1   //在單詞內(nèi)
#define OUT 0   //在單詞外

//統(tǒng)計輸入行數(shù)、單詞數(shù)與字符數(shù)
int main()
{
    int c, state;

    state = OUT;
    while ((c=getchar())!=EOF)
    {
        if (c == ' ' || c == '\n' || c == '\t')
        {
            if (state == IN)
            {
                putchar('\n');      //一個單詞輸入結(jié)束
                state = OUT;
            }
        }
        else if (state == OUT)
        {
            state = IN;
            putchar(c);     //一個單詞輸入開始
        }
        else
        {
            putchar(c);     //在輸入一個單詞時
        }
    }
}

??練習(xí)1-13?編寫一個程序咆瘟,打印輸入中單詞長度的直方圖嚼隘。水平方向的直方圖比較容易繪制,垂直方向的直方圖則要困難些袒餐。

#include<stdio.h>

#define IN  1   //在單詞內(nèi)
#define OUT 0   //在單詞外

int main()
{
    //c為輸入的字符飞蛹,state為當(dāng)前狀態(tài),wLength為當(dāng)前單詞長度
    //Maxnum為數(shù)量最大的單詞單詞長度的個數(shù)
    int c,a,b,state,wLength,Maxnum;

    int wordLength[10];     //設(shè)置一個記錄對應(yīng)單詞長度的個數(shù)的數(shù)組
    for (int i = 0; i < 10; i++)    //比如wordLength[1]表示單詞長度為1的單詞個數(shù)
    {
        wordLength[i] = 0;
    }

    state = OUT;
    wLength = 0;

    //記錄輸入中統(tǒng)計的得出的繪圖數(shù)據(jù)
    //第一種方法
    while ((c=getchar())!=EOF)
    {   
        if ((c == ' ') || (c == '\t') || (c == '\n'))
        {
            if (state == IN)
            {
                state = OUT;
                ++wordLength[wLength];
                wLength = 0;
            }
            else
            {
                continue;
            }
        }
        else if(state==OUT)
        {
            wLength=1;
            state = IN;
        }
        else
        {
            ++wLength;
        }
    }

    //第二種統(tǒng)計數(shù)據(jù)方法
    /*
    while ((a = getchar()) != EOF)
    {
        if ((a != ' ') && (a != '\n'))
        {
            wLength++;
            b = a;
        }
        if (((a == ' ') || (a == '\n')) && (b == ' '))
        {
            continue;
        }
        else if (((a == ' ') || (a == '\n')) && (b != ' '))
        {
            wordLength[wLength]++;
            b = ' ';
            wLength = 0;
        }
    }
    */

    Maxnum = 9;
    /*這樣寫圖表不漂亮
    for (int i = 0; i < 10; i++)
    {   
        if (Maxnum < wordLength[i + 1])
        {
            Maxnum = wordLength[i + 1];
        }
    }
    */

    for (int i = Maxnum; i >= 0; i--)
    {
        printf("%4d", i);
        for (int j = 0; j < 10; j++)
        {
            if (wordLength[j] >= i)
            {
                printf(" * ");
            }
            else
            {
                printf("   ");
            }   
        }
        printf("\n");
    }
    printf("   ");
    for (int i = 0; i < 10; i++)
    {
        printf("%3d", i);
    }

    getchar();
}

??練習(xí)1-14?編寫一個程序灸眼,打印輸入各個字符出現(xiàn)頻度的直方圖卧檐。

??基本思想跟上題類似。分三大塊焰宣,第一塊初始化各個數(shù)據(jù)霉囚,第二塊采集各個數(shù)據(jù),第三塊畫出直方圖匕积。本題可以利用ascii碼來作為數(shù)組序號盈罐。

??練習(xí)1-15?重新編寫1.2中的溫度轉(zhuǎn)換程序,使用函數(shù)實現(xiàn)溫度轉(zhuǎn)換計算闪唆。

#include<stdio.h>

void change(int lower, int upper, int step);

int main()
{
    float lower, upper, step;

    lower = 0;
    upper = 300;
    step = 20;
    change(lower, upper, step);

    getchar();
}

void change(int lower,int upper,int step)
{
    float fahr,celsius;
    fahr = lower;
    printf(" Fahr    Celsius\n");
    while (fahr <= upper)
    {
        celsius = 5 * (fahr - 32) / 9;
        printf("%3.0f\t%6.1f\n", fahr, celsius);
        fahr = fahr + step;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末盅粪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子苞氮,更是在濱河造成了極大的恐慌湾揽,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異库物,居然都是意外死亡霸旗,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門戚揭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诱告,“玉大人,你說我怎么就攤上這事民晒【樱” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵潜必,是天一觀的道長靴姿。 經(jīng)常有香客問我,道長磁滚,這世上最難降的妖魔是什么佛吓? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮垂攘,結(jié)果婚禮上维雇,老公的妹妹穿的比我還像新娘。我一直安慰自己晒他,他們只是感情好吱型,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著陨仅,像睡著了一般津滞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上掂名,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天据沈,我揣著相機與錄音,去河邊找鬼饺蔑。 笑死锌介,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的猾警。 我是一名探鬼主播孔祸,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼发皿!你這毒婦竟也來了崔慧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤穴墅,失蹤者是張志新(化名)和其女友劉穎惶室,沒想到半個月后温自,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡皇钞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年悼泌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片夹界。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡馆里,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出可柿,到底是詐尸還是另有隱情鸠踪,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布复斥,位于F島的核電站营密,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏目锭。R本人自食惡果不足惜卵贱,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望侣集。 院中可真熱鬧,春花似錦兰绣、人聲如沸世分。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽臭埋。三九已至,卻和暖如春臀玄,著一層夾襖步出監(jiān)牢的瞬間瓢阴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工健无, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留荣恐,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓累贤,卻偏偏與公主長得像叠穆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子臼膏,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容