??練習(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;
}
}