现在的位置: 首页 > 综合 > 正文

C程序设计语言_Chapter1实例和练习题

2018年05月14日 ⁄ 综合 ⁄ 共 4001字 ⁄ 字号 评论关闭

希望能早点掌握阅读英文原版书的能力,嗯.

这本书买了很长时间了,之前一直没有时间看.

/* 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;
			}
		}
	}
}

抱歉!评论已关闭.