C程序設計語言_Chapter1實例和練習題

希望能早點掌握閱讀英文原版書的能力,嗯.

這本書買了很長時間了,之前一直沒有時間看.

/* 1.2溫度轉換 */

#include<stdio.h>

main(){
	//int x = 0;
	//int fahr;
	for(int fahr = 0; fahr <= 300; fahr = fahr + 20){ 
		printf("%3d\t %9.1f\t%d\n",fahr, (5.0 / 9.0) * (fahr - 32),&fahr);
	}

	/*
	int lower,upper,step;
	float fahr,celsius; 
	lower = 0;
	upper = 300;
	step = 20;
	
	fahr = lower;
	//printf("華氏\t攝氏\n");
	while(fahr <= upper){
		celsius = 5 * (fahr - 32) / 9;
		printf("%3.0f%.2f\n",fahr,celsius);
		fahr = fahr + step;
	}
	*/
}

/* 1.4 符號常量 */

#include<stdio.h>

#define LOWER 0
#define UPPER 300
#define STEP 20

main3(){
	int fahr;

	for(fahr = LOWER; fahr <= UPPER; fahr = fahr + STEP){
		printf("%3d\t%6.2f\n",fahr,(5.0 / 9.0) * (fahr - 32));
	}
}

VS的C編輯器好難用,跟ECLIPSE寫JAVA的感覺沒法比.

/* 1.5 統計字符和行數 */
#include<stdio.h>

main(){
	long nc;
	nc = 0;
	while(getchar() != EOF)
		++nc;
	printf("%ld",nc);

	int c ;
	while((c = getchar()) != EOF){
		putchar(c);
	}
	//putchar(c);
	printf("EOF != c:%d\n" + (c!=EOF));
	printf("EOF:%d\n" , EOF);
	getchar();
}

很簡單的練習,有了編程經驗再學這些東西,感覺都知道一樣,但有些東西需要再確定一下.

/* 1.5.4單詞計數 */

#include<stdio.h>

#define IN 1
#define OUT 0

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\t%d\t%d\n", nl, nw, nc);
}
/* 1.6 使用數組統計一些字符的出現字數 */

#include<stdio.h>

main(){
	int c, i, nwhite, nother;
	int ndijit[10];

	nwhite = nother = 0;

	for(i = 0; i < 10; ++i)
		ndijit[i] = 0;

	while((c = getchar()) != EOF){
		if(c >= '0' && c <= '9')
			++ndijit[c - '0'];
		else if( c == ' ' || c == '\n' || c == '\t')
			++nwhite;
		else
			++nother;
	}

	printf("dijit = ");
	for(i = 0; i < 10; ++i)
		printf(" %d",ndijit[i]);
	printf(", white space = %d,other = %d\n",nwhite, nother);

	getchar();
}
在考慮要不要改成JAVA式的駝峯命名方式,那個方式更科學啊.但就沒有了使用c的感覺了,哈哈

/* 1.9 字符數組,統計最長行的長度 */

#include<stdio.h>
#define MAXLINE 10000

int getline(char line[], int maxline);
void copy(char to[], char from[]);

main(){
	int len, max;
	char line[MAXLINE];
	char longest[MAXLINE];

	max = 0;
	while((len = getline(line, MAXLINE)) > 0){
		if(len > max){
			max = len;
			copy(longest, line);
		}
	}

	if(max > 0)
		printf("%s\n", longest);
	return 0;
}

int getline(char s[], int lim){
	int c, i;

	for(i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
		s[i] = c;
	if(c == '\n'){
		s[i] = c;
		++i;
	}
	s[i] = '\0';
	return i;
}

void copy(char to[], char from[]){
	int i;

	i = 0;
	while((to[i] = from[i]) != '\0')
		++i;
}

char類型是小整形,是整形的一種,它屬於整形.

字符串在內存中以字符數組的形式存儲,以'\0'作爲字符串結束記號.

發現在上個例子中,while裏面的if語句沒有帶大括號,於是在java裏面也試了一下,果然if語句塊只算一條語句,一條語句是不需要括起來的.

package com.dh.test;

public class MainTest {
	public static void main(String[] args) {
		System.out.println("start");
		int i = 0;
		while(true)
			if(i == 0){
				break;
			}
		System.out.println("out of while");
	}
}

外部變量的練習.

/* 1.10 外部變量和作用域 打印最長行 */
#include<stdio.h>
#define MAXLINE 1000

int max;
char line[MAXLINE], longest[MAXLINE];

int getLine(void);
void copy(void);

main(){
	int len;
	extern int max;
	extern char longest[];

	max = 0;
	while((len = getLine()) > 0){
		if(len > max){
			max = len;
			copy();
		}
	}
	if(max > 0)
		printf("%s\n", longest);
	//return 0;
}

int getLine(void){
	int c, i;
	extern char line[];

	for(i = 0; i < MAXLINE -1 && (c = getchar()) != EOF && c != '\n'; ++i )
		line[i] = c;
	if(i == '\n'){
		line[i] = c;
		++i;
	}
	line[i] = '\0';
	return i;
}

void copy(void){
	int i;
	extern char line[], longest[];

	i = 0;
	while((longest[i] = line[i]) != '\0')
		++i;
}


第一章的練習,不明白爲什麼在同一行字符後面[CTRL + Z]無法結束循環.

/* 練習1-20 TAB替換爲空格 */
/* 接受一行輸入;如果包含TAB,則計算當前位與TAB結束位的差,替換爲空格 */

#include<stdio.h>
#define TABLENGTH 8
#define MAXLENGTH 1000
char text[MAXLENGTH];
int getText(void);

main(){
	extern char text[];
	getText();
	printf("%s\n",text);
}

int getText(void){
	extern char text[];
	int c, i, j;
	int spaceCount = 0; /* 要填充的空格個數 */
	int linePosition = 0; /* 當前行的位置 */
	for(i = 0; (i < MAXLENGTH - 1) && (c = getchar()) != EOF; ++i){
		printf("value of c:%d\n" , c);
		if(c == '\n')
			linePosition = 0;
		if(c == 't'){
			spaceCount = TABLENGTH - (linePosition % TABLENGTH);
		}
		if(spaceCount > 0){
			for(j = 0; j < spaceCount; ++j){
				text[i + j] = c;
			}
			i += spaceCount;
		}
		else
			text[i] = c;
		linePosition++;
	}

	printf("out of for loop");
}

2013年9月15日0:01:17

大師就是大手筆,連練習都那麼費時間.

/* 練習1-21 將空格轉換爲TAB */
/*
while(行未結束){
	if(是空格){
		if(上個字符不是空格)
			記錄空格起始位置;
		if(位置在TAB終止位上)
			替換從空格起始位置到該位置的所有空格位TAB字符;
	}
}
  */
#include<stdio.h>
#define MAXLENGTH 1000
#define TABLENGTH 8
void entab(void);
char text[MAXLENGTH];

main(){
	extern char text[];
	entab();
	printf("value of tab:%d\n",'\t');
	printf("%s",text);
	return 0;
}

void entab(){
	int ss;//空格起始位置;
	int i;
	int cc = 0;//字符計數
	char c;
	extern char text[];
	for(i = 0; i < MAXLENGTH -1 && (c = getchar()) != EOF; ++i){
		++cc;
		text[i] = c;
		if(c == ' '){
			if(i == 0 || text[i - 1] != ' ')
				ss = i;
			if(cc % TABLENGTH == TABLENGTH){
				text[ss] = '\t';
				i = ss;
			}
		}
	}
}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章