@Arbalest-Laevatain
2018-05-21T15:32:10.000000Z
字数 4094
阅读 1043
C语言
/******
由数组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);
}
}
/******
串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);
}
}
/******
其余字符按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;
}
}
}
}
/******
按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;
}
}
}
}
/******
按升序的次序构成字符串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');
}
/******
首次出现在字符串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;
}
/******
和日。例如,调用函数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;
}
/******
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;
}
/******
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;
}
/******
有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;
}
/******
符串的长度。例如,若该串为"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',不允许调用字符串库函数。
**********/
```c
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++;
}
}
<div class="md-section-divider"></div>
/******
“单词”。编写函数,在字符串s中顺序获取每个单
词,依次存入w指示的二维数组,并返回单词个数。
例如,若有s="I am a student",则w={"I","am",
"a","student"}。注意:字符串结束符是'\0',不
允许调用字符串库函数。
******/
int func(char *s, char (*w)[10])
{
}
<div class="md-section-divider"></div>
/******
每一行元素值求和,并存入数组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)
/* 求二维数组中各行元素值的和 */
{
}