C程序设计(第二版 新版)第一章 习题

-2.空格串替换为最少量的制表符和空格,保持单词之间的间隔不变。

#include<stdio.h>

#define BASIC  8

int main()
{
	freopen("Example.in","r",stdin);
	int nb,nt,c;
	int pos;
	for(pos = 1,nb = nt = 0; (c = getchar()) != EOF; ++pos)
	{
		if(c == ' ')
		{
			if(pos % BASIC)
				++nb;
			else
			{
				nb = 0;
				++nt;
			}
		}
		else
		{
			while(nt)
			{
				putchar('\t');
				--nt;
			}
				
			if(c == '\t')
				nb = 0;
			while(nb)
			{
				putchar(' ');
				--nb;	
			}
				
			if(c == '\n')
				pos = 0;
			else if(c == '\t')
				pos = pos -1 + (BASIC - (pos - 1) % BASIC);
			putchar(c);		
		}
	}
	
	return 0;
}

-1.删除每个输入末尾的空格及制表位,并删除完全是空格的行。

#include<stdio.h>

#define MAXLINE 1000

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

FILE *fp;

int main()
{
	fp = fopen("Example.in","r");
	if(!fp)	return 1;
	int len;
	char line[MAXLINE];
	
	while((len = getline(line,MAXLINE))> 0)
		if(len >= MAXLINE)
			printf("%s",line);
		else if(remove(line,len) > 0)
			printf("%s",line);
	fclose(fp);
	return 0;
}

int getline(char line[],int lim)
{
	int i;
	int c;
	for(i = 0; i < lim -1 && (c = fgetc(fp))!= EOF && c != '\n'; ++i)
		line[i] = c;
	if(c == '\n')
		line[i++] = c;
	line[i] = '\0';
	
	return i;
}

int remove(char line[],int len)
{
	int i = len - 2;
	while(i >= 0 && (line[i] == ' ' || line[i] == '\t'))
		--i;
	if(i >= 0)
	{
		line[++i] = '\n';
		line[++i] = '\0';
	}
	return i;
}


 

0.单词计数(例1.5.4)

#include<stdio.h>

#define OUT 1  /*  在单词内 */
#define IN  0  /*  在单词外 */

int main()
{
	int c,nl,nw,nc,state;
	
	state = OUT;
	nl = nw = nc = 0; // nl:行数 nw:单词数  nc:字符数   
	while((c = getchar()) != EOF)
	{
		++nc;
		if(c == '\n')
			++nl;
		if(c == ' ' || c == '\t' || c == '\n')
			state = OUT;
		else if(state == OUT)
		{
			state = IN;
			++nw;
		}
	}
	printf("%d %d %d\n",nl,nw,nc);
	
	return 0;
} 

 

1. 打印输入单词长度的水平和数值直方图

#include<stdio.h>
#define IN      1
#define OUT     0
#define MAXHIST  21  /* max  length of histogram*/
 
int main()
{
    int i,j,nc,maxvalue,state,len;
    int c;
    int wl[MAXHIST];/* wl[i] 的值表示长度为i的单词的数量*/
    for(i =1; i < MAXHIST; i++)
    	wl[i] = 0;
    state = OUT;    
    nc = 0;
    while( (c = getchar()) != EOF)
    {
        if( c == ' ' || c == '\n' || c == '\t')
        {
            state = OUT;
            if( nc > 0)
                wl[nc] ++;
            nc = 0;
        }
        else if( state == OUT)
        {
            state = IN;
            nc ++;
        }
        else
            nc ++;
	  }

	/*输出水平直方图*/
	for(i = 1; i < MAXHIST; i++)
	{
	    if(wl[i] > 0)
	        len = wl[i];
	    else
	        len = 0;
	    printf("%2d - %2d :", i,len );
	    while( len-- > 0)
	        putchar('*');
	    putchar('\n');
	}
	putchar('\n');
	
	/* 找出单词数量出现最大值*/
	maxvalue = 0;
	for( i = 1; i < MAXHIST; i++)
		if( maxvalue < wl[i])
			maxvalue = wl[i];
	
	/*水平输出直方图*/
	for( i = maxvalue; i > 0; i--)
	{
	    for(j = 1; j < MAXHIST; j++ )
	    	if( wl[j] >= i)
	        	printf(" * ");
	    	else
	       	 	printf("   ");
	    putchar('\n');
	}
	for(i = 1; i < MAXHIST; i++)
		printf("%2d ",i);
	putchar('\n');
	for(i = 1; i < MAXHIST; i++)
   		printf("%2d ",wl[i]);
	putchar('\n');
	getchar();
	return 1;
}

 

2.把较长的输入行"拆"成短一些的两行或多行,折行的位置在第n列之前的最后一个非空格之后(注意空格和制表符)(c程序设计语言 1-22题 )

#include<stdio.h>
#define TABINC       8
#define MAXCOL       10
char line[MAXCOL];

void printl(int pos)
{
    int i;
    for(i=0; i < pos; i++)
    {
    	 putchar(line[i]);
    }
    if(pos > 0)
    	 putchar('\n');
}

int exptab(int pos)
{
    int i;
    while(pos < MAXCOL && pos % TABINC != 0)
    {          
    	 line[pos]=' ';
   		 pos ++;
    }
    if( pos >= MAXCOL)
    {
        printl(MAXCOL);
        return 0;
    }
    else
        return pos;
}

int findblnk(int pos)
{
    int i = pos;
    while( i >= 0 && line[i] != ' ')
    {
    	i --;
    }
    if( i < 0)
        return MAXCOL;
    else
        return i+1;
}

int newpos(int pos)
{
    if( pos <= 0 || pos >= MAXCOL)
        return 0;
    else
    {
        int i;
        for(i=0; pos < MAXCOL; i++,pos++)
                 line[i] = line[pos];
        return i;
    }
}

int main()
{
    int c, pos;
    
    pos = 0;
    while((c = getchar()) != EOF)
    {
    	line[pos] = c;
     	if( c == '\t')
      {
       	 pos = exptab(pos);
      }
      else if( c == '\n')
      {
          printl(pos);
	        pos = 0;
      }
      else if( ++pos >= MAXCOL)
      {
          pos = findblnk(pos - 1);
          printl(pos);
          pos = newpos(pos);
      } 
    }
    getchar();
    return 1;
}


3.删除c语言中的所有注释,正确处理引号中的字符串和字符常量。(1-23)

#include<stdio.h>
void rcomment(int c);
void in_comment(void);
void out_comment(void);
void echo_quote(int c);

int main()
{
    int c;
    while((c = getchar()) != EOF)
    {
          // printf("recomment-in\n");
             rcomment(c);
          // printf("recomment-out\n");
    }
    getchar();
    return 1;
}
void rcomment(int c)
{
     int d;
     if( c == '/')
     {
         d = getchar();
         if(d == '*')
         {
              in_comment();
         }
         else if( d == '/')
         {
              out_comment();
         }
         else
         {
             putchar(c);
             putchar(d);
         }
     }
     else if( c == '\'' || c == '\"')
     {
         echo_quote(c);
     }
     else
         putchar(c);
}
void in_comment(void)
{
     int c ,d;
     c = getchar();
     d = getchar();
     while(c != '*' || d != '/')
     {
             c = d;
             d = getchar();
     }
}
void out_comment(void)
{
     int c;
     while( (c = getchar()) != '\n');
     putchar(c);
}
void echo_quote(int c)
{
     int d;
     while( (d = getchar()) != c)
     {
            putchar(d);
            if( d == '\\')
                putchar(getchar());
     }
     putchar(d);
}

 

4. 查找c语言中的基本语法错误,如圆括号、方括号、花括号不配对等。要正确处理引号(包括单引号和双引号)、转义字符序列与注释(1-24)

#include<stdio.h>

int brace,brack,paren;

void in_comment();
void out_comment();
void in_quote();
void search(int);

int main()
{
	freopen("test.in","r",stdin);
	int c;
	
	while((c = getchar()) != EOF)
	{
		if(c == '/')
		{
			int d = getchar();
			if(d == '*')
				in_comment();
			else if(d == '/')
				out_comment();
			else	
				search(d);
		}
		else if(c == '\'' || c == '\"')
			in_quote(c);
		else
			search(c);
			
		if(brace < 0)
		{
			puts("Unbalanced braces");
			brace = 0;
		}
		if(brack < 0)
		{
			puts("Unbalanced bracks");
			brack = 0;
		}
		if(paren < 0)
		{
			puts("Unbalanced parens");
			paren = 0;
		}
	}
	
	if(brace > 0)
		puts("Unbalanced braces");
	if(brack > 0)
		puts("Unbalanced bracks");
	if(paren > 0)
		puts("Unbalanced parens");

	return 0;
}

void in_comment()
{
	int c = getchar();
	int d = getchar();
	while(c != '*' || d != '/')
	{
		c = d;
		d = getchar();
	}
}

void out_comment()
{
	int c;
	while((c = getchar()) != '/n' && c != EOF);
}

void in_quote(int c)
{
	int d;
	while((d = getchar()) != c)
	{
		if(d == '\\')
			getchar();
	}
}

void search(int c)
{
	switch(c)
	{
		case '{':
			++brace;
			break;
		case '}':
			--brace;
			break;
		case '[':
			++brack;
			break;
		case ']':
			--brack;
			break;
		case '(':
			++paren;
			break;
		case ')':
			--paren;
			break;
	}
}


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值