c和指针第四章编程练习代码

1.课后答案

#include<stdio.h>
#include<stdlib.h>

int main()
{
	float new_guess ;
	float last_guess ;
	float number ;
	
	printf ( "Enter a number:" ) ;
	scanf ( "%f", &number ) ;
	if ( number < 0 )
		{
			printf ( "Cannot compute the square root of a"
						"negative numbe!\n" ) ;
			return EXIT_FAILURE ;
		}
	
	new_guess = 1 ;
	do{
		last_guess = new_guess ;
		new_guess = ( last_guess + number / last_guess ) / 2 ;
		printf ( "%.15e\n", new_guess ) ;
	} while ( new_guess != last_guess ) ;
	
	printf ( "Square root of %g is %g\n", number, new_guess ) ;
	return EXIT_SUCCESS ;
}

2.

#include<stdio.h>
#define MAX 100
int main()
{
	int i, j, k ;
	for ( i = 1; i < MAX; i++ )
	{
		k = 0 ;
		for ( j = 1; j < i + 1; j++ )
		{
			if ( i % j == 0 )
				k++ ;	 
		}

		if ( k == 2 )
			printf ( "%d ", i ) ; 
	}
	return 0 ;
}

3.

#include<stdio.h>
int main()
{
	int i, j, k ;
	scanf ( "%d %d %d", &i, &j, &k ) ;
	
	if ( i + j > k && i + k > j && j + k > i )
	{
		if ( i == j || i == k || j == k )
		{
			if ( i == j && j == k )
				printf ( "这是等边三角形。" ) ;
				
			else
				printf ( "这是等腰三角形。" ) ; 
		}
		else
			printf ( "这是不等边三角形。" ) ;
	}
	else
		printf ( "这不是三角形。" ) ; 
		
	return 0 ; 
}

4.

#include<stdio.h>
#define MAX 1000

void copy_n ( char dst[], char src[], int n ) ;

int main()
{
	int  n, i, k  ;
	char ch ;
	char src[MAX] ;
	char dst[MAX] ;

	printf ( "请输入n:" ) ;
	scanf ( "%d", &n ) ;
	printf ( "请输入字符串:" ) ; 
	while ( (ch = getchar() ) != EOF )	//读取字符并逐个处理  EOF:windows用Ctrl+z,LINUX用Ctrl+d 
	{
		for ( i = 0; ch != '\n'; i++ )	//将输入的字符由getchar一个个的返回出来,并储存在src中 
		{
			src[i] = ch ;
			ch = getchar() ;
		}
	}
	
	copy_n ( dst, src, n ) ;
	printf ( "%s\n", dst ) ;
 }
 
void copy_n ( char dst[], char src[], int n )
{
	int dst_index, src_index ;
	src_index = 0 ;
	for ( dst_index = 0;dst_index < n; dst_index++ )
	{
		dst[dst_index] = src[src_index] ;
		if ( src[src_index] != 0 )
			src_index++ ;
	}
  }

5.这题的第二段代码从网上找的,其中在一维数组中插入"\n"避免了用二维数组,幸好我学过二维数组

#include<stdio.h>
#include<string.h>
#define MAX 128

int main()
{
	int  j, i = 0 ;			
	char str[MAX] ;		 	//储存可输出字符串 
	char input[MAX] ;		//储存输入字符串 
	char output[MAX][MAX] ;	//储存输出字符串 
	
	while ( gets (input) != NULL )	//逐行读取 
	{
		if ( strcmp ( str, input ) != 0 )	//如果前后字符串不等 
			strcpy ( str, input ) ;			//将input的内容复制到str 
		else
		{	
			if ( strcmp ( output[i -1], input ) != 0)	//如果和前一个输出不等 
			{ 
				strcpy ( output[i], input ) ;	//将input的内容复制到output
				i++ ;	//计数加一 
			}
			strcpy ( str, input ) ;	//相等则将input的内容复制到str 
		}
	  }
	
	for ( j = 0; j < i; j++ )	//将output的内容打印 
	{
	  	printf ( "%s\n", output[j] ) ;
	  }
	  
	return 0 ;
  }
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
main()
{
      char string1[10] = "", string2[10] = "",string3[10]="",string4[100]="";
      int r,i=0,j=0;
      while ( string1[0] != 'Z')
      {
            gets(string1);
            r = strcmp(string1,string2);  //r记录的是判断string1和string2是否相等    如果相等r=0否则r=1
            if (!r)//果然两个字符串相等则执行下面代码
            {
                if(strcmp(string3,string1))   //下面代码的功能是判断是否需要输出
                {
                    i=0;       //为了拼接字符串,i和j用来标示位置所在
                    j=0;
                    //之后写一段代码类似于下面这样的功能
                    //string4 = string4+"\n"+string1;
                    
                    while(string4[i] !='\0')
                        i++;
                    while(string1[j] !='\0')
                        string4[i++]=string1[j++];     //下面两句是拼接最后输出的字符串。如果符合则追加到string4的末尾
                        
                    string4[i]='\n';     //为了不让他们在一行显示,这里我们追加一次就换一行显示
                    strcpy(string3,string1);
                    //为了判断是否要将它显示出来,这里设定个string3来做个标示,如果相同输入的,就只显示一个就可以了
                }
            }
            strcpy(string2,string1);//想一般大家都会想到用指针取值的方式来赋值,那样是不可以的。这能这样写   不可以这样*string2=*string1
      }
      printf("");
      puts(string4);
      system("pause");
      return 0;
}

6.

#include<stdio.h>
#include<string.h>
#define MAX 1000

int substr ( char dst[], char src[], int start, int len ) ;

int main()
{
	int i = 0 ;
	int start, len, sum ;
	int ch ;
	char src[MAX] ;
	char dst[MAX] ;
	
	printf ( "请输入start:") ;
	scanf ( "%d", &start ) ;
	printf ( "请输入len:") ;
	scanf ( "%d", &len ) ;
	 
	while ( ( ch = getchar() ) != EOF )
	{
		src[i] = ch ;
		i++ ;
	}
	
	sum = substr ( dst, src, start, len ) ;
	printf ( "%d", sum ) ;
 } 
 
int substr ( char dst[], char src[], int start, int len )
{
	int i ;
	if ( start >= strlen ( src ) && start < 0 && len < 0 )
		dst == NULL ;
	 
	for ( i = 0; i < len; i++ )
	{
		if ( src[start] != '\n' )
			dst[i] = src[start] ;
		start++ ;
	}
	return strlen ( dst ) ;
}

7.用goto也是无奈之举,不用goto只能删去一半的空格,不过也省的我想破脑子写循环

#include<stdio.h>
#include<string.h>
#define MAX 1000

void deblank ( char string[] ) ;
int main()
{
	char string[MAX] ;
	gets ( string ) ;
	
	deblank ( string ) ;
	printf ( "%s", string ) ;
}

void deblank ( char string[] )
{
	int i, j ;
	char *temp = string ;

	for ( i=0, j=0; i <= strlen ( string ); )
	{
		string[j++] = temp[i++] ;
		a:if ( string[i] == ' ' && string[i + 1] == ' ' )
		{
			i++ ;
			if(string[i] == ' ' && string[i + 1] == ' ')
			goto a ;
		}
	}
	
}


发布了12 篇原创文章 · 获赞 3 · 访问量 2330

猜你喜欢

转载自blog.csdn.net/lhg1714538808/article/details/79336189