C++ Primer Plus第六版编程练习8.6解答

ps:这题的具体化函数实现博主用了两种方法。


方法一:使用strcmp

/***************

具体化函数思路:
比较字符串大小可以用strcmp函数,而考虑到strcmp函数
比较字符串大小时是按ASCII码顺序比较的,也就是说大写
字母会比小写字母小,譬如:字符串"Hello"比字符串"hello"小,
可这显然不是我们想要的结果,我们想要的结果是字符串"Hello"
与字符串"hello"大小相等。于是我先创建一个包含5个元素的
字符串数组,把函数调用时传进来的字符串复制到这个数组
然后把这些字符串全部替换为小写的形式,再对它们进行比较,
这样就能得到想要的结果了。

PS:要创建数组来存放复制的字符串的原因:
如果用了char *p="Hello"来定义字符串,其实这样定义的字符串
是相当于const char *p="Hello"的,也就是说不能修改里面的值。
所以不能把它里面的大写改为小写,于是要用char str[StrSize]
来存放复制的结果,才可以修改里面每个字符。

***************/

#include 
   
   
    
    
#include 
    
    
     
       //for strcmp, strcpy, strlen

const int StrSize=20;

//模板函数声明
template 
     
     
      
      
T maxn(T a[],int n);

//具体化函数声明
template <> char * maxn
      
      
       
       (char *s[],int n);

int main(void)
{
    int arr_i[6]= {23,35,344,643,235,34};
    std::cout<<"int type\n";
    std::cout<<"The max number is "<
       
       
         < 
        
          T maxn(T a[],int n) { T max=a[0]; for(int i=1; i 
         
           max) max=a[i]; } return max; } //具体化函数的定义 template <> char * maxn 
          
            (char *s[],int n) { char tempStr[5][StrSize]= {'\0'}; //定义了5个字符串数组,每个的大小为StrSize //先把5个字符串形参复制到tempStr数组 int i,j; for(i=0; i 
           
             0) { num=i; strcpy(MaxStr,tempStr[i]); } } return s[num]; //返回最大的字符串 } 
            
           
          
         
       
      
      
     
     
    
    
   
   

方法二:对每个字符串的字符进行逐个比较

/***************

具体化函数思路:
不用strcmp函数,而是用循环逐个字符进行比较。当然
这也会遇到第一种方法里提到的大小写的ASCII码顺序的
问题,这时候可以用cctype里的tolower或toupper函数来解决。

***************/

#include 
   
   
    
    
#include 
    
    
     
       //for strlen
#include 
     
     
      
      

const int StrSize=20;

//模板函数声明
template 
      
      
       
       
T maxn(T a[],int n);

//具体化函数声明
template <> char * maxn
       
       
         (char *s[],int n); int main(void) { int arr_i[6]= {23,35,344,643,235,34}; std::cout<<"int type\n"; std::cout<<"The max number is "< 
        
          < 
         
           T maxn(T a[],int n) { T max=a[0]; for(int i=1; i 
          
            max) max=a[i]; } return max; } //具体化函数的定义 template <> char * maxn 
           
             (char *s[],int n) { char ch_m,ch; int max=0; //max存储最大的字符串的编号 int i,j; for(i=1; i 
            
              tolower(ch_m)) //每个字符串里有大写也有小写 { max=i; break; } else break; } } return s[max]; } 
             
            
           
          
         
       
      
      
     
     
    
    
   
   

总结:

对比这两种方法,使用第二种比较节省空间,因为不用修改实参的字符串内容,所以不用另外开辟存储空间。这要得益于cctpye里的tolower函数,它可以返回大写字符对应的小写,然后我们再进行比较就可以得到想要的结果了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值