小白入门中:TCPL习题4-1

4-1:编写函数strrindex(s,t),它返回字符串t在s中最右边出现的位置如果s中不包含t,则返回-1;

int strindex(char s[] , char t[])
{
	int i , j , k , coordinate = -1;
	for(i = 0; s[i] != '\0'; i ++)
	{
		for(j = 0 , k = i; t[j] != '\0' && s[k] == t[j] ;j++ , k++)
			;//从第相同字母开始判定到'\0'前
		if(j > 0 && t[j] == '\0')
				coordinate = i ;
	}
	return coordinate ;
}

4-2:对atof函数进行扩充,使之可以处理形如123.45e-6的科学表示法,其中,浮点数后面可能会紧跟一个e或E以及一个指数(可能有正负)

aotf函数如下

double atof(char s[])
{
	int sign , i ;
	double sum , xiaoshu;
	i = 0 ;
	sign = (s[i] == '-') ? -1 : 1 ;	//储存符号
	if(s[i] == '+' || s[i] == '-')
		i ++ ;
	for(sum = 0.0; isdigit(s[i]) && s[i] != '.'; i++)
	{
		sum = sum *10.0 + (s[i] - '0');
	}
	//当遇到小数点
	if(s[i] == '.')
		i++ ;
	for(xiaoshu = 1.0; isdigit(s[i]); i++)
	{
		sum = sum * 10.0 + (s[i] - '0') ;
		xiaoshu *= 10.0 ;			
	}
	return sign * sum / xiaoshu ;
}

扩充后

double atof(char s[])
{
	int sign , i , sign_SN  ;//sign_SN:	sign_Scientific_Notation
	double sum , xiaoshu , exp;
	i = 0 ;
	sign = (s[i] == '-') ? -1 : 1 ;	//储存符号
	if(s[i] == '+' || s[i] == '-')
		i ++ ;
	for(sum = 0.0; isdigit(s[i]) && s[i] != '.'; i++)
	{
		sum = sum *10.0 + (s[i] - '0');
	}
	//当遇到小数点
	if(s[i] == '.')
		i++ ;
	for(xiaoshu = 1.0; isdigit(s[i]); i++)
	{
		sum = sum * 10.0 + (s[i] - '0') ;
		xiaoshu *= 10.0 ;			
	}
	sum = sign * sum / xiaoshu ;//科学技术法前的数字大小
	//当遇到e或E;
	if(s[i] == 'e' || s[i] == 'E')
	{
		sign_SN = (s[++ i] == '-') ? false : true ;
		if(s[i] == '-' || s[i] == '+')
			i ++ ;
		exp = pow(10 , (double)(s[i] - '0'));
		if(sign_SN) 
			sum *= exp ;//指数为正
		else					
			sum /= exp ;//指数为负
	}
	return sum ;
}

4-3——4-11

波兰逆计算器,栈来栈的,天天栈。等我之后再来好好看一下(ko no 不是计算机专业da)直接跳过吧,划水摸鱼 珍惜时间

4-12:使用printfd的思想编写一个itoa函数,通过递归将整数转换为字符串

#include
#include 
#include 
using namespace std ;
/*
使用printfd的思想编写一个itoa函数,通过递归将整数转换为字符串
*/
void printd_itoa(int a , char s[]);
int main()
{
	int a ;
	char s[100]; 
	cin >> a ;
	printd_itoa(a , s);
	printf("%s\n" , s);
	system("pause");
	return 0 ;
}
//将整数转换为字符串
void printd_itoa(int n , char s[])
{
	static int i ;//字符串下标
	if(n / 10)
		printd_itoa(n / 10 , s);
	else
	{
		i = 0; //最后一次递归,i = 0 ,为负号
		if(n < 0)
			s[i++] = '-' ;
	} 
	s[i ++] = abs(n) % 10 + '0' ; 
	s[i] = '\0' ; //在最后一次递归调用时添上字符串结束标志符
}

是递归的内容,学习完发现,我之前对递归的理解居然是错误的
例如有一个递归的函数块

void xxx (int i )
{
	A ---;
	B xxx(i - 1);
	c ---;
}

程序先运行A,然后进入下一个递归调用,在执行A,接着下一个递归调用…
在最后一个递归,运行C,然后返回上一个递归,运行C,直到第一个递归调用的c

4-13:编写一个递归版本的reverse(s)函数,已将字符串s倒置

#include
#include 
#include 
#include 
using namespace std ;
/*
编写一个递归版本的reverse(s)函数,已将字符串s倒置
*/
void re_reverse(char s[]);
int main()
{
	char s[100];
	gets(s);
	re_reverse(s);
	printf("%s" , s);
	system("pause");
	return 0 ;
}
//将字符串倒置
void re_reverse(char s[])
{
	void reverse(char s[] , int i , int len) ;
	reverse(s , 0 , strlen(s));
}
void reverse(char s[] , int i , int len)
{
	static int j ;
	char c ;
	j = len - (i + 1) ; // 去掉换行符
	if(i < j)
	{
		c = s[i];
		s[i] = s[j];
		s[j] = c ;
		reverse(s , ++ i , len);
	}
}

普通的递归,自定义有声明了一个函数,骚操作就完事了.

4-14:用定义宏写一个swap(t , x , y),以交换t类型的2个参数

#define swap(t , x , y) \
		(y) = (x) + (y) - ((x) = (y))

答案

#define swap(t , x , y) \
		t _z ;\
		_z = x;\
		x = y;\
		y = _z;\

你可能感兴趣的:(C语言,小白)