广工 AnyviewC C语言习题 第八章

Anyview 第八章 指针


/**********

【习题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=0,j;
	while (*s)
	{
		i++;
		s++;
	}
	printf("%c\n",*s);
	for (j=0;j<i;j++)
	{
		*(t+j)=*(s-1-j);
	}
}

/**********

【习题8.015】对长度为n的字符串s1,除首、尾字符外,将

其余字符按ASCII码降序排列,组合成一个新的字符串s2。
**********/

void func(char *s1, char *s2, int n)
/* s1为字符串的起始地址,
   s2为新字符串的起始地址,
   n为字符串的长度。
   要求:s1串不能发生改变,
         s2串存放新的字符串。
*/
{
		int i,j;
	*s2=*s1;
	*(s2+n-1)=*(s1+n-1);
	for (i=1;i<n-1;i++)
	{
		*(s2+i)=*(s1+i);
	}	
	for (i=1;i<n-1;i++)
	{
		for (j=1;j<n-1-i;j++)
		{
			if (*(s2+j)<=*(s2+j+1))
			{
				char 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,n=0;
       char*s=s1;
       while (*s1)
       {
        n++;
        s1++;
       }
       s1=s;
         *s2=*s1;
         *(s2+n-1)=*(s1+n-1);
         for (i=1;i<n-1;i++)
            *(s2+i)=*(s1+i);
         for (i=1;i<n-1;i++)
         {
            for  (j=1;j<n-1-i;j++)
            {
                if (*(s2+j)<=*(s2+j+1))
                {
                    char 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串存放新的字符串。
*/
{
		do
	{
		*t=*s;
		s++;
		t++;
	} while (*s!='\0');
}

/**********

【习题8.020】在字符串s中查找字符c,如果找到,返回字符c

首次出现在字符串s中的位置指针;否则,返回空指针NULL。
**********/

char *match(char *s, char c)      
/* 返回字符在串s中首次出现的位置指针 */
{
		int n=0;
do
{
	if (*s==c)
		return s;
	s++;
	n++;
} while (*s!='\0');
s=NULL;
return s;
}

/**********

【习题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 month[12]={31,28,31,30,31,30,31,31,30,31,30,31}; 
	int i,z,y,flag=0;
	int *p1,*p2;
	
	if (year>0 && yearday>0)
	{
		if ((year%4==0 && year %100 !=0) || (year%400==0))
		{
			flag=1;
		}
		
		if (flag)
		{
			month[1]+=1;
			if (yearday>366)
				return 0;
		}
		else
		{
			if (yearday>365)
				return 0;
		}
	//	z=yearday/31;
		
		i=0,z=0;
		y=yearday;
		while (y>0)
		{
			y-=month[i];
			i++;
			z++;
		}
		y+=month[i-1];
		
		if (y==0)
		{
			z-=1;
			y=month[z-1];
		}
		*pmonth=z;
		*pday=y;
		return 1;
	}
	return 0;
}

/**********

【习题8.044】请编写一个函数func,通过略去非数字字符,将字符串

s转换为一个整数(不得调用C语言提供的将字符串转换为整数的函数)。
**********/

long func(char *s) 
/* s是一个数字字符串的地址,
   函数返回值为由s含有的数字字符转换得到的数(包含正负数情况) 
*/
{
	int i=0,flag=0,t=1;
	long n=0;
	char c,*tou;
	tou=s;
	while (*s!='\0')
	{
		c=*s;
		if (c=='-' && s==tou)
		{
			flag=1;
			*s++;
			continue;
		}
		if (c>='0' && c<='9')
		{
			n=(c-'0')+n*10;
			*s++;
			i++;
		}	
		else
		{
			*s++;
			continue;
		}
		
	}
	if (flag)
		n=-n;
	return n;
}

/**********

【习题8.105】请编写一个函数findmax(int []s, int n),返回数组s中

n(>0)个整数中的最大值。注意:要求在函数中采用指针(而不是下标)来
处理数组元素。
**********/

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

/**********

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

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

int func(char *s) 
{
		int n=0;;
	while (*s)
	{
		n++;
		s++;
	}
	return n;
}

/**********

【习题8.222】编写函数,复制指针参数s指向的字

符串到由指针参数t已经指向的存储区域。注意:
字符串结束符是’\0’,不允许调用字符串库函数。
**********/

void func(char *s, char *t)
{
	while (*s)
{
	*t=*s;
	s++;
	t++;
}
}

/**********

【习题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 a;
	for (a=i-1;a<i+n-1;a++)
	{
		*t=*(s+a);
		t++;
	} 
}

/**********

【习题8.246】假设字符串中每个连续字母序列称为

“单词”。编写函数,在字符串s中顺序获取每个单
词,依次存入w指示的二维数组,并返回单词个数。
例如,若有s=“I am a student”,则w={“I”,“am”,
“a”,“student”}。注意:字符串结束符是’\0’,不
允许调用字符串库函数。
**********/

int func(char *s, char (*w)[10])
{
    int n=0,m=0,flag=0;
    //if ((*s>='A' && *s<='Z') || (*s>='a' && *s<='z') )
    while (*s)
    {
        if (*s=='\0')
        {           
            break;
        }
            
        if ((*s>='A' && *s<='Z') || (*s>='a' && *s<='z') )
        {
            flag=1;
            *(*(w+n)+m)=*s;
            s++;        
            m++;
            
        }
        else
        {
            s++;
            if (flag)
                n++;
            m=0;
            flag=0;
            continue;
        }
       
    }
     if (flag)
        n++;
    return n;
}

【习题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,j;
	for (i=0;i<n;i++)
	{
		*(sum+i)=0;
		
		for (j=0;j<4;j++)
		{
			*(sum+i)+=*(*(p+i)+j);
		}
	}
}
  • 13
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值