@Arbalest-Laevatain
2018-05-21T15:32:10.000000Z
字数 4094
阅读 1182
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',不允许调用字符串库函数。**********/```cvoid 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)/* 求二维数组中各行元素值的和 */{}