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

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

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

??練習(xí)1-3?修改溫度轉(zhuǎn)換程序,使之能在轉(zhuǎn)換表的頂部打印一個(gè)標(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?編寫(xiě)一個(gè)程序打印攝氏溫度轉(zhuǎn)換為相應(yīng)華氏溫度的的對(duì)照表。

#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語(yǔ)句)

#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?驗(yàn)證表達(dá)式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?編寫(xiě)一個(gè)打印EOF值的程序。

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

??練習(xí)1-8?編寫(xiě)一個(gè)統(tǒng)計(jì)空格、制表符、換行符個(gè)數(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?編寫(xiě)一個(gè)將輸入復(fù)制到輸出的程序,并將其中連續(xù)多個(gè)空格用一個(gè)空格代替。

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

??練習(xí)1-10?編寫(xiě)一個(gè)將輸入復(fù)制到輸出的程序,并將其中的制表符替換為\t,并把回退符替換為\b,并把反斜杠替換為\。這樣可以將制表符和回退符以可見(jiàn)的方式顯現(xiàn)出來(lái)。

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

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

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

#include<stdio.h>

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

//統(tǒng)計(jì)輸入行數(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);
    }
}

答:?jiǎn)卧~計(jì)數(shù)工作要從沒(méi)有任何輸入的情況下開(kāi)始。此時(shí),該程序的輸出結(jié)果應(yīng)該是“0 0 0”,即零行、零單詞、零字符。
??接下來(lái)測(cè)試輸入的單字符單詞的情況。此時(shí),該程序的輸入結(jié)構(gòu)應(yīng)該是“1 1 2”,即一行、一個(gè)單詞、兩個(gè)字符(一個(gè)字符加上一個(gè)換行符)。
??再測(cè)試一個(gè)由兩個(gè)字符組成的單詞。此時(shí),該程序的輸入結(jié)果為“1 1 3”,即一行、一個(gè)單詞、三個(gè)字符(兩個(gè)字母加上一個(gè)換行符)。
??讓后再測(cè)試兩個(gè)單詞的情況。首先,兩個(gè)單詞出現(xiàn)在同一行,此時(shí)的輸出結(jié)果應(yīng)該是“1 2 4”;然后,兩個(gè)單詞各占一行,此時(shí)的輸出結(jié)果應(yīng)該是“2 2 4”。
??那些滿足邊界條件的輸入情況最有助于發(fā)現(xiàn)單詞計(jì)數(shù)程序中的錯(cuò)誤。這些邊界條件包括:
??——沒(méi)有輸入
??——沒(méi)有單詞(只有換行符)
??——沒(méi)有單詞(只有空格、制表符、和換行符)
??——每個(gè)單詞各占一行的情況(沒(méi)有空格和制表符)
??——單詞出現(xiàn)于文本行行首的情況
??——單詞出現(xiàn)于一串空格之后的情況

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

#include<stdio.h>

int main()
{
    int a, b, state;
    while ((a=getchar())!=EOF)
    {   //a不為空時(shí),直接賦值給b
        if (a != ' ')
        {
            b = a;
            putchar(b);
        }
        //a位空時(shí)分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)計(jì)輸入行數(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');      //一個(gè)單詞輸入結(jié)束
                state = OUT;
            }
        }
        else if (state == OUT)
        {
            state = IN;
            putchar(c);     //一個(gè)單詞輸入開(kāi)始
        }
        else
        {
            putchar(c);     //在輸入一個(gè)單詞時(shí)
        }
    }
}

??練習(xí)1-13?編寫(xiě)一個(gè)程序,打印輸入中單詞長(zhǎng)度的直方圖。水平方向的直方圖比較容易繪制,垂直方向的直方圖則要困難些。

#include<stdio.h>

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

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

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

    state = OUT;
    wLength = 0;

    //記錄輸入中統(tǒng)計(jì)的得出的繪圖數(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)計(jì)數(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;
    /*這樣寫(xiě)圖表不漂亮
    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ě)一個(gè)程序,打印輸入各個(gè)字符出現(xiàn)頻度的直方圖。

??基本思想跟上題類似。分三大塊,第一塊初始化各個(gè)數(shù)據(jù),第二塊采集各個(gè)數(shù)據(jù),第三塊畫(huà)出直方圖。本題可以利用ascii碼來(lái)作為數(shù)組序號(hào)。

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

#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)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容