广东工业大学 Anyviewce C语言 习题八

广东工业大学 anyview c语言 第八章

仅供参考

广东工业大学 Anyviewce C语言 习题七.

广东工业大学 Anyviewce C语言 习题八.

广东工业大学 Anyviewce C语言 习题九.

广东工业大学 Anyviewce C语言 习题十.

广东工业大学 Anyviewce C语言 习题十一.

/**********

【习题8.011】请编写函数func(char s[], char t[], int n),由数组s中长度为n的字符序列构造其逆序列,并存储在数组t中。

例如,由给定字符序列s="are"求得逆序列t=“era”;由s="time"求得t=“emit”。
**********/

void func(char s[], char t[], int n) 
/* 数组s的前n个元素存放给定的字符序列,
   数组t的前n个元素存放s的逆序列。
   注意:数组的下标从0开始。
*/
{
    int i;
    
    for(i=0;i<n;i++)
    {
        t[n-i-1]=s[i];
    }
}

/**********

【习题8.012】请编写函数func(char*s, char *t),由字符串s构造其逆串t。

例如,由给定串s="are"求得逆串t=“era”;由s="time"求得t=“emit”。
**********/

void func(char *s, char *t) 
/* s是给定字符串的起始地址,
   t是求得s的逆串的起始地址
*/
{
    int i,n;
    
    for(n=0;s[n];n++)//在上一题的基础增加测量字符串长度
        ;
    
    for(i=0;i<n;i++)
    {
        t[n-i-1]=s[i];
    }
}

/**********

【习题8.015】对长度为n的字符串s1,除首、尾字符外,将其余字符按ASCII码降序排列,组合成一个新的字符串s2。

**********/

void func(char *s1, char *s2, int n)
/* s1为字符串的起始地址,
   s2为新字符串的起始地址,
   n为字符串的长度。
   要求:s1串不能发生改变,
         s2串存放新的字符串。
*/
{
    int i,j,t;
    for(i=0;i<n;i++)//先将s1复制给s2
        s2[i]=s1[i];
        
    for(i=1;i<n-1;i++0)//除去开头结尾 冒泡排序
        for(j=1;j<=n-i-2;j++)
        {
           if(s2[j]<s2[j+1])
           {
              t=s2[j+1];
              s2[j+1]=s2[j];
              s2[j]=t;
           }
        }
}

/**********

【习题8.016】对字符串s1,除首、尾字符外,将其余字符按ASCII码降序排列,组合成一个新的字符串s2。

**********/

void func(char *s1, char *s2)
{
    
    int i,j,t,n;
    
    for(n=0;s1[n];n++)//测量s1长度
        ;
    
    for(i=0;i<n;i++)//先将s1复制给s2
        s2[i]=s1[i];
        
    for(i=1;i<n-1;i++)//除去开头结尾 冒泡排序
        for(j=1;j<=n-i-2;j++)
        {
           if(s2[j]<s2[j+1])
           {
              t=s2[j+1];
              s2[j+1]=s2[j];
              s2[j]=t;
           }
        }
}

/**********

【习题8.018】以字符串s第m(>=0)个字符开始的所有字符,按升序的次序构成字符串t。

**********/

void substr(char *s, int m, char *t)
/* s为字符串的起始地址,
   m>=0,
   t为新字符串的起始地址,
   注意:字符串尾字符之后跟随着一个结束符‘\0’,
         即ASCII码为0的字符,结束符不属于字符串。
   要求:s串不能发生改变,
         t串存放新的字符串。
*/
{
    int i,j,t1,n,k;
    
    for(n=0;s[n];n++)//测量s长度
        ;
    
    if(m==0)
    {    for(i=0;i<n;i++)
            t[i]=s[i];
         k=n;//将t数组长度赋给t
    }        
    else            
    {    for(i=m-1;i<n;i++)
            t[i]=s[i];
         k=n-m+1;
    }
    
    for(i=0;i<k;i++)// 冒泡排序
        for(j=m-1;j<=n-i-1;j++)
        {
           if(t[j]>t[j+1])
           {
              t1=t[j+1];
              t[j+1]=t[j];
              t[j]=t1;
           }
        }
}

/**********

【习题8.020】在字符串s中查找字符c,如果找到,返回字符c首次出现在字符串s中的位置指针;否则,返回空指针NULL。

**********/

char *match(char *s, char c)      
/* 返回字符在串s中首次出现的位置指针 */
{
    int i,j,flag;
    for(i=0,flag=0;s[i];i++)
    {
        if(s[i]==c)
        {    
            flag=1;
            j=i;//记录位置
        }    
    }
    
    if(flag==1)
        return s+j;
    else
        return NULL;    
}

/**********

【习题8.033】编写函数,计算年份year中第yearday天相应的月和日。

例如,调用函数month_day(2000,61,&m,&d)之后,m=3,d=1,即2000年的第61天是3月1日。
**********/

int month_day(int year, int yearday, int *pmonth, int *pday) 
/* year是年,
   yearday是天数,
   若year和yearday合理,
   则*pmonth和*pday是计算得出的月和日,函数返回1;
   否则,函数返回0。
*/
{
        int k,leap;
        int a[2][13]={
            {0,31,28,31,30,31,30,31,31,30,31,30,31},
            {0,31,29,31,30,31,30,31,31,30,31,30,31},
        };//定义数组存放闰年和非闰年每个月的天数
        
        leap=(year%4==0&&year%100!=0)||year%400==0;   //闰年判别条件
       if((leap==1||leap==0&&yearday<366)&&yearday>0)
       {
           for(k=1;yearday>a[leap][k];k++)
                yearday-=a[leap][k];
            
            *pmonth=k;
            *pday=yearday;        
            
            return 1;     
       }
       else
            return 0;
} 

/**********

【习题8.044】请编写一个函数func,通过略去非数字字符,将字符串s转换为一个整数(不得调用C语言提供的将字符串转换为整数的函数)。

**********/

long func(char *s) 
/* s是一个数字字符串的地址,
   函数返回值为由s含有的数字字符转换得到的数(包含正负数情况) 
*/
{
    int i;
    long n;
    for(i=0,n=0;s[i];i++)
    {
        if(s[i]>='0'&&s[i]<='9')
        {
            n=n*10+s[i]-'0';//累加
        }
    }
    
    if(s[0]=='-')//判断正负
        n=-n;
    
    return n;
}

/**********

【习题8.105】请编写一个函数findmax(int []s, int n),返回数组s中n(>0)个整数中的最大值。

注意:要求在函数中采用指针(而不是下标)来处理数组元素。
**********/

int findmax(int s[], int n)    
/* 返回s中n(>0)个整数的最大值。
   注意:要求在函数中采用指针(而不是下标)来处理数组元素。
*/
{
    int i,max;
    for(i=0,max=*s;i<n;i++)
    {
        if(*(s+i)>max)
            max=*(s+i);
    }
    
    return max;
}

/**********

【习题8.124】请编写一个函数min3adj(int s[], int n),数组s中有n(>0)个整数,返回在s中相邻三个数的和中的最小值。

**********/

int min3adj(int s[], int n)    
/* 数组s含n(>=3)个整数,
   返回在s中相邻三个数的和中的最小值。
*/
{
    int i,min3;
    for(i=0,min3=*s+*(s+1)+*(s+2);i<n-2;i++)
    {
        if(*(s+i)+*(s+i+1)+*(s+i+2)<min3)
            min3=*(s+i)+*(s+i+1)+*(s+i+2);
    }
    
    return min3;
}

/**********

【习题8.132】编写函数,通过指针参数sum将x和y的和赋给相应实际参数。

例如,若x=134、y=378,则sum的实参变量被赋值512。
**********/

void func(int x, int y, int *sum)
{
    *sum=x+y;                    
}

/**********

【习题8.136】编写函数,返回指针参数x和y所指向的变量的值之和。

**********/

int func(int *x, int *y)
{
    return *x+*y;
}

/**********

【习题8.138】编写函数,比较指针参数x和y分别指向的变量,若前者的值较大,则交换两者的值,并返回1;否则无须交换,返回0。

**********/

int func(int *x, int *y)
{
    int t;
    if(*x>*y)
    {
        t=*x;
        *x=*y;
        *y=t;
        return 1;
    }
    else 
        return 0;
        
}

/**********

【习题8.143】假设指针a指向某数组中的一个元素。编写函数,在从元素*a开始的n个元素范围内,向后查找给定值x,一旦找到值等于x的元素,则返回该元素的序号;若找不到,则返回0。

例如,假定a指向的10个元素依次为5,6,3,0,-4,8,9,-6,8,-7,若x=5,则返回1;若x=8,则返回6;若y=4,则返回0。
**********/

int func(int n, int *a, int x)
{
    int i;
    for(i=0;i<n;i++)    
        if(*(a+i)==x)
            return i+1;
    
    return 0;           

}

/**********

【习题8.146】假设指针a指向某数组中的一个元素。编写函数,对从元素*a开始的n个元素,统计并返回值为x的元素个数(若不存在这样的元素,则返回0)。

**********/

int func(int n, int *a, int x)
{
    int i,j;
    for(i=0,j=0;i<n;i++)
    {
        if(*(a+i)==x)
            j++;
    }
    
    return j;                             
}

/**********

【习题8.203】编写函数,返回指针参数s所指向的字符串的长度。

例如,若该串为"I am a student.",则函数返回值是15。
注意:字符串结束符是’\0’,不计入长度。不允许调用库函数strlen()。
**********/

int func(char *s) 
{
    int i;
    for(i=0;*(s+i);i++)
        ;
    return i;    
}

/**********

【习题8.212】编写函数,在指针参数s所指向的字符串中顺序查找由c指定的字符。一旦找到,则返回该字符在串中的序号(串的首个字符的序号为1),否则返回0。

例如,若该串为"I am a student.",c=‘t’,则函数返回值为9。注意:字符串结束符是’\0’,不允许调用字符串库函数。
**********/

int func(char *s, char c)
{                                                        
    int i;
    for(i=0;*(s+i);i++)
    {
        if(*(s+i)==c)
            return i+1;
    }
    
    return 0;
}

/**********

【习题8.215】编写函数,在指针参数s所指向的字符串中统计并返回由c指定的字符的个数。

例如,若该串为"I am a student.",c=‘t’,则函数返回值为2。注意:字符串结束符是’\0’,不允许调用字符串库函数。
**********/

int func(char *s, char c)
{
    int i,n;
    for(i=0,n=0;*(s+i);i++)
    {
        if(*(s+i)==c)
            n++;
    }
    
    return n;
}

/**********

【习题8.222】编写函数,复制指针参数s指向的字符串到由指针参数t已经指向的存储区域。

注意:字符串结束符是’\0’,不允许调用字符串库函数。
**********/

void func(char *s, char *t)
{
    int i;
    for(i=0;*(s+i);i++)
    {
        *(t+i)=*(s+i);
    }    
}

/**********

【习题8.225】编写函数,由指针参数s指向的字符串头n个字符构造一个字符串,并存储到到由指针参数t已经指向的存储区域。

例如,若s指向的字符串为"I am a student.",n=4,则t指向的串为"I am"。注意:字符串结束符是’\0’,不允许调用字符串库函数。
**********/

void func(char *s, int n, char *t) 
{
    int i;
    for(i=0;*(t+i);i++)//t指向的字符串清零
        *(t+i)='\0';
    for(i=0;i<n;i++)
        *(t+i)=*(s+i);
}

/**********

【习题8.228】编写函数,由指针参数s指向的字符串后n个字符构造一个字符串,并存储到到由指针参数t已经指向的存储区域。

例如,若s指向的字符串为"I am a student.",n=8,则t指向的串为"student."。注意:字符串结束符是’\0’,不允许调用字符串库函数。
**********/

void func(char *s, int n, char *t) 
{
    int i,length;
    for(length=0;*(s+length);length++)//获得长度
        ;
        
    for(i=0;i<n;i++)
    {
        *(t+i)=*(s+length-n+i);
    }
}

/**********

【习题8.231】编写函数,由指针参数s指向的字符串中第i个字符开始的n个字符构造一个字符串,并存储到到由指针参数t已经指向的存储区域。

例如,若s指向的串为"I am a student.",i=8,n=7,则t指向的串为"student"。注意:字符串结束符是’\0’,不允许调用字符串库函数。
**********/

void func(char *s, int i, int n, char *t) 
{
    int j,k,length;
    for(length=0;*(s+length);length++)//获得长度
        ;
        
    for(k=i-1,j=0;j<n;k++,j++)
    {
        *(t+j)=*(s+k);
    }
}

/**********

【习题8.234】编写函数,通过将s字符串中所有小写字母转换成大写字母,构造一个字符串并存储在t已经指向的存储区域,但原来的s串不改变。

例如,若s字符串为"I am a student.",则构造的t串为"I AM A STUDENT.”。
**********/

void func(char *s, char *t)
{
    int i;
    for(i=0;*(s+i);i++)
    {
        if(*(s+i)>='a'&&*(s+i)<='z')
            *(t+i)=*(s+i)-32;
        else
            *(t+i)=*(s+i);
    }
}

/**********

【习题8.237】编写函数,通过将s字符串中所有大写字母转换成小写字母,构造一个字符串并存储在t已经指向的存储区域,但原来的s串不改变。

例如,若s字符串为"I Am a Student.",则构造的t串为"i am a student.”。
**********/

void func(char *s, char *t)
{
    int i;
    for(i=0;*(s+i);i++)
    {
        if(*(s+i)>='A'&&*(s+i)<='Z')
            *(t+i)=*(s+i)+32;
        else
            *(t+i)=*(s+i);
    }
}

/**********

【习题8.243】编写函数,在字符串s中顺序查找字符串t,若找到,则返回其出现的位置,否则返回0。

例如,设s=“I am a student.”,若t=“stu”,则返回值是8;若t=“an”,则返回值是0。注意:字符串结束符是’\0’,不允许调用字符串库函数。
**********/

int func(char *s, char *t)
{
    int i,j,flag;
    
    for(i=0;*(s+i);i++)
    {
        if(*(s+i)==*t)//判断第一个字符是否相同
        {
            for(j=0,flag=i+1;*(t+j);j++,i++)//判断字符串是否相同
            {
                if(*(s+i)!=*(t+j))
                    flag=0;
            }
        }    
    }
    
    return flag;
}

/**********

【习题8.246】假设字符串中每个连续字母序列称为“单词”。编写函数,在字符串s中顺序获取每个单词,依次存入w指示的二维数组,并返回单词个数。

例如,若有s=“I am a student”,则w={“I”,“am”,“a”,“student”}。注意:字符串结束符是’\0’,不允许调用字符串库函数。
**********/

int func(char *s, char (*w)[10])
{
    int i,j,n;
        
    for(i=0,n=0;s[i];i++)
    {           
         if(s[i]>='A'&&s[i]<='Z'||s[i]>='a'&&s[i]<='z')//当第一个是字母进入
         {
            j=0;        
            while(s[i]>='A'&&s[i]<='Z'||s[i]>='a'&&s[i]<='z')
            {
                w[n][j]=s[i];
                j++;
                i++;
            }        
            w[n][j]='\0';
            n++;
         }         
    }
    
    return n;
            
}

/**********

【习题8.282】编写函数,查找并返回p指示的二维数组中的元素最大值。

例如,二维数组的元素值依次为{{45,38,-6,78},{34,48,70,4},{-9,0,4,20}},则
函数返回值为78。
**********/

int func(int (*p)[4], int n)
/* 求二维数组中的最大值 */
{
    int i,j,max;
    for(i=0,max=p[0][0];i<n;i++)
    {
        for(j=0;j<4;j++)
            if(p[i][j]>max)
                max=p[i][j];
                             
    }
    
    return max;
    
}

/**********

【习题8.285】编写函数,依次对p指示的二维数组的每一行元素值求和,并存入数组sum中。

例如,若二维数组的元素值依次为 {{45,38,-6,78},{34,48,70,4},{-9,0,4,20}},
则sum[0…2]={155,156,15}。
**********/

void func(int (*p)[4], int n, int *sum)
/* 求二维数组中各行元素值的和 */
{
   int i;
   for(i=0;i<n;i++)*(sum+i)=0;
   for(i=0;i<n;i++)
   {
    for(int j=0;j<4;j++)
    sum[i]+=*(*(p+i)+j);
   }
                                 
        
}

/**********

【习题8.288】编写函数,依次对p指示的二维数组的每一列元素值求平均值,并存入数组avg中。

例如,若二维数组的元素值依次为 {{45,38,-6,78},{34,48,70,4},{-9,0,4,20}},
则avg[0…2]={23.33,28.67,34.00}。
**********/

void func(int (*p)[4], int n, float *avg)
/* 求二维数组中各列元素值的平均值 */
{
     float sum[4];
  for(int j=0;j<4;j++)
  {
   for(int i=0;i<n;i++)
   {
     *(sum+j)+=p[i][j];
     *(avg+j)=*(sum+j)/n;
   }
  }
    
}
  • 8
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值