6-1计算输入的两数的和与差的简单函数。
函数接口定义:
void sum_diff( float op1, float op2, float *psum, float *pdiff );
其中op1
和op2
是输入的两个实数,*psum
和*pdiff
是计算得出的和与差。
裁判测试程序样例:
#include <stdio.h>
void sum_diff( float op1, float op2, float *psum, float *pdiff );
int main()
{
float a, b, sum, diff;
scanf("%f %f", &a, &b);
sum_diff(a, b, &sum, &diff);
printf("The sum is %.2f\nThe diff is %.2f\n", sum, diff);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
4 6
结尾无空行
输出样例:
The sum is 10.00
The diff is -2.00
结尾无空行
void sum_diff( float op1, float op2, float *psum, float *pdiff )
{//对指针变量的赋值
*psum=op1+op2;//指针前不要忘记加*
*pdiff=op1-op2;
}
6-2 利用指针找最大值 (10 分)
本题要求实现一个简单函数,找出两个数中的最大值。
函数接口定义:
void findmax( int *px, int *py, int *pmax );
其中px
和py
是用户传入的两个整数的指针。函数findmax
应找出两个指针所指向的整数中的最大值,存放在pmax
指向的位置。
裁判测试程序样例:
#include <stdio.h>
void findmax( int *px, int *py, int *pmax );
int main()
{
int max, x, y;
scanf("%d %d", &x, &y);
findmax( &x, &y, &max );
printf("%d\n", max);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
3 5
结尾无空行
输出样例:
5
结尾无空行
void findmax( int *px, int *py, int *pmax )
{
if(*px>*py)
*pmax=*px;
else
*pmax=*py;
}
6-3 使用函数找出数组中的最大值 (15 分)
本题要求实现一个找出整型数组中最大值的函数。
函数接口定义:
int FindArrayMax( int a[], int n );
其中a
是用户传入的数组,n
是数组a
中元素的个数。函数返回数组a
中的最大值。
裁判测试程序样例:
#include <stdio.h>
#define MAXN 10
int FindArrayMax( int a[], int n );
int main()
{
int i, n;
int a[MAXN];
scanf("%d", &n);
for( i=0; i<n; i++ ){
scanf("%d", &a[i]);
}
printf("%d\n", FindArrayMax(a, n););
return 0;
}
/* 请在这里填写答案 */
输入样例:
4
20 78 99 -14
结尾无空行
输出样例:
99
结尾无空行
int FindArrayMax( int a[], int n )
{
int m=0,i;
for (i=0;i<n;i++)
{
if(a[i]>a[m])
m=i;
}
return a[m];
}
6-4 在数组中查找指定元素 (15 分)
本题要求实现一个在数组中查找指定元素的简单函数。
函数接口定义:
int search( int list[], int n, int x );
其中list[]
是用户传入的数组;n
(≥0)是list[]
中元素的个数;x
是待查找的元素。如果找到
则函数search
返回相应元素的最小下标(下标从0开始),否则返回−1。
裁判测试程序样例:
#include <stdio.h>
#define MAXN 10
int search( int list[], int n, int x );
int main()
{
int i, index, n, x;
int a[MAXN];
scanf("%d", &n);
for( i = 0; i < n; i++ )
scanf("%d", &a[i]);
scanf("%d", &x);
index = search( a, n, x );
if( index != -1 )
printf("index = %d\n", index);
else
printf("Not found\n");
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例1:
5
1 2 2 5 4
2
结尾无空行
输出样例1:
index = 1
结尾无空行
int search( int list[], int n, int x )
{
for(int i=0;i<n;i++)
{
if(list[i]==x) return i;
}
return -1;
}
6-5 使用函数的选择法排序 (25 分)
本题要求实现一个用选择法对整数数组进行简单排序的函数。
函数接口定义:
void sort( int a[], int n );
其中a
是待排序的数组,n
是数组a
中元素的个数。该函数用选择法将数组a
中的元素按升序排列,结果仍然在数组a
中。
裁判测试程序样例:
#include <stdio.h>
#define MAXN 10
void sort( int a[], int n );
int main()
{
int i, n;
int a[MAXN];
scanf("%d", &n);
for( i=0; i<n; i++ )
scanf("%d", &a[i]);
sort(a, n);
printf("After sorted the array is:");
for( i = 0; i < n; i++ )
printf(" %d", a[i]);
printf("\n");
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
4
5 1 7 6
结尾无空行
输出样例:
After sorted the array is: 1 5 6 7
结尾无空行
void sort( int a[], int n )
{//使用选择排序
int t;
for(int i=0;i<n-1;i++)
{
for(int j=i+1;j<n;j++)
{
if(a[i]>a[j])//每次找出最小的元素
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
}
6-6 数组循环右移 (20 分)
本题要求实现一个对数组进行循环右移的简单函数:一个数组a中存有n(>0)个整数,将每个整数循环向右移m(≥0)个位置,即将a中的数据由(a0a1⋯an−1)变换为(an−m⋯an−1a0a1⋯an−m−1)(最后m个数循环移至最前面的m个位置)。
函数接口定义:
void ArrayShift( int a[], int n, int m );
其中a[]
是用户传入的数组;n
是数组的大小;m
是右移的位数。函数ArrayShift
须将循环右移后的数组仍然存在a[]
中。
裁判测试程序样例:
#include <stdio.h>
#define MAXN 10
void ArrayShift( int a[], int n, int m );
int main()
{
int a[MAXN], n, m;
int i;
scanf("%d %d", &n, &m);
for ( i = 0; i < n; i++ ) scanf("%d", &a[i]);
ArrayShift(a, n, m);
for ( i = 0; i < n; i++ ) {
if (i != 0) printf(" ");
printf("%d", a[i]);
}
printf("\n");
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
6 2
1 2 3 4 5 6
结尾无空行
输出样例:
5 6 1 2 3 4
结尾无空行
//数组循环右移
void ArrayShift( int a[], int n, int m )
{
int t;
for(int i=0;i<m;i++)
{
t=a[n-1];
for(int i=n-2;i>=0;i--)
{
a[i+1]=a[i];
}
a[0]=t;
}
}
//数组循环左移
void ArrayShift( int a[], int n, int m )
{
for(int i=0;i<m;i++)
{
int t=a[0];//将数组第一个元素拿出
for(int j=0;j<n;j++)
{
a[j]=a[j+1];
}
a[n-1]=t;
}
}
6-7 判断回文字符串 (20 分)
本题要求编写函数,判断给定的一串字符是否为“回文”。所谓“回文”是指顺读和倒读都一样的字符串。如“XYZYX”和“xyzzyx”都是回文。
函数接口定义:
bool palindrome( char *s );
函数palindrome
判断输入字符串char *s
是否为回文。若是则返回true
,否则返回false
。
裁判测试程序样例:
#include <stdio.h>
#include <string.h>
#define MAXN 20
typedef enum {false, true} bool;
bool palindrome( char *s );
int main()
{
char s[MAXN];
scanf("%s", s);
if ( palindrome(s)==true )
printf("Yes\n");
else
printf("No\n");
printf("%s\n", s);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例1:
thisistrueurtsisiht
结尾无空行
输出样例1:
Yes
thisistrueurtsisiht
bool palindrome( char *s )
{
int n;
n=strlen(s);//求出字符串长度
int i,j;
for( i=0,j=n-1;i<j;i++,j--)
{
if(s[i]!=s[j]) return 0;
}
return 1;//最后加在循环外面,为回文序列
}
6-8 字符定位(最后一次找到的字符) (15 分)
本题要求定义一个函数,在字符串中查找字符,并定位在最后一次找到的位置。
函数接口定义:
char * match(char *s, char ch);
其中s是字符串首地址,ch是要查找的字符。要求函数在字符串s中查找字符ch,如果找到,返回最后一次找到的该字符在字符串中的位置(地址);否则,返回空指针NULL。
裁判测试程序样例:
#include <stdio.h>
char *match(char *s, char ch);
int main(void )
{
char ch, str[80], *p = NULL;
scanf("%s", str);
getchar(); /* 跳过输入字符串和输入字符之间的分隔符 */
ch = getchar(); /* 输入一个字符 */
p = match(str, ch); /* 调用函数match() */
if( p != NULL ){ /* 找到字符ch */
printf("%s\n", p);
}else{
printf("Not Found.\n");
}
return 0;
}
/* 请在这里填写答案 */
输入样例1:
program
r
结尾无空行
输出样例1:
ram
结尾无空行
char * match(char *s, char ch)
{
int n;
n=strlen(s);
char *p=NULL;
for(int i=0;i<n;i++)
{
if(s[i]==ch) p=&s[i];//重要
}
return p;
}
6-23 分类统计字符个数 (15 分)
本题要求实现一个函数,统计给定字符串中英文字母、空格或回车、数字字符和其他字符的个数。
函数接口定义:
void StringCount( char s[] );
其中
char s[]
是用户传入的字符串。函数StringCount
须在一行内按照letter = 英文字母个数, blank = 空格或回车个数, digit = 数字字符个数, other = 其他字符个数
的格式输出。
裁判测试程序样例:
#include <stdio.h> #define MAXS 15 void StringCount( char s[] ); void ReadString( char s[] ); /* 由裁判实现,略去不表 */ int main() { char s[MAXS]; ReadString(s); StringCount(s); return 0; } /* Your function will be put here */
输入样例:
aZ & 09 Az
输出样例:
letter = 4, blank = 3, digit = 2, other = 1
void StringCount( char s[] )
{
int n=strlen(s),letter=0,blank=0,digit=0,other=0;
for(int i=0;i<n;i++)
{
if(s[i]>='A'&&s[i]<='Z'||s[i]>='a'&&s[i]<='z')
letter++;
else if(s[i]==' '||s[i]=='\n')
blank++;
else if(s[i]>='0'&&s[i]<='9')
digit++;
else
other++;
}
printf("letter = %d, blank = %d, digit = %d, other = %d",letter,blank,digit,other);
}
6-24 删除字符 (20 分)
本题要求实现一个删除字符串中的指定字符的简单函数。
函数接口定义:
void delchar( char *str, char c );
其中
char *str
是传入的字符串,c
是待删除的字符。函数delchar
的功能是将字符串str
中出现的所有c
字符删除。裁判测试程序样例:
#include <stdio.h> #define MAXN 20 void delchar( char *str, char c ); void ReadString( char s[] ); /* 由裁判实现,略去不表 */ int main() { char str[MAXN], c; scanf("%c\n", &c); ReadString(str); delchar(str, c); printf("%s\n", str); return 0; } /* 你的代码将被嵌在这里 */
输入样例:
a happy new year
输出样例:
hppy new yer
void delchar( char *str, char c )
{
int n=strlen(str);
for(int i=0;i<n;i++)
{
while(str[i]==c) //删除一位,后面的都要后移
{
for(int j=i;j<n;j++)
str[j]=str[j+1];
}
}
}
6-25 函数实现字符串逆序 (15 分)
本题要求实现一个字符串逆序的简单函数。
函数接口定义:
void f( char *p );
函数
f
对p
指向的字符串进行逆序操作。要求函数f
中不能定义任何数组,不能调用任何字符串处理函数。裁判测试程序样例:
#include <stdio.h> #define MAXS 20 void f( char *p ); void ReadString( char *s ); /* 由裁判实现,略去不表 */ int main() { char s[MAXS]; ReadString(s); f(s); printf("%s\n", s); return 0; } /* 你的代码将被嵌在这里 */
输入样例:
Hello World!
结尾无空行
输出样例:
!dlroW olleH
结尾无空行
void f( char *p )
{
int n=0;//用在循环里的变量n=n+1;必须赋初值
for(int i=0;p[i]!=0;i++)//求字符串长度
{
n++;
}
for(int i=0;i<n/2;i++)
{
int t=*(p+i);
*(p+i)=*(p+n-1-i);
*(p+n-1-i)=t;
}
}
6-26 指定位置输出字符串 (20 分)
本题要求实现一个函数,对给定的一个字符串和两个字符,打印出给定字符串中从与第一个字符匹配的位置开始到与第二个字符匹配的位置之间的所有字符。
函数接口定义:
char *match( char *s, char ch1, char ch2 );
函数
match
应打印s
中从ch1
到ch2
之间的所有字符,并且返回ch1
的地址。裁判测试程序样例:
#include <stdio.h> #define MAXS 10 char *match( char *s, char ch1, char ch2 ); int main() { char str[MAXS], ch_start, ch_end, *p; scanf("%s\n", str); scanf("%c %c", &ch_start, &ch_end); p = match(str, ch_start, ch_end); printf("%s\n", p); return 0; } /* 你的代码将被嵌在这里 */
输入样例1:
program r g
结尾无空行
输出样例1:
rog rogram
结尾无空行
输入样例2:
program z o
输出样例2:
(空行) (空行)
输入样例3:
program g z
输出样例3:
gram gram
char *match( char *s, char ch1, char ch2 )
{
int n=strlen(s),a=-1,b=-1;
char *p;//p这个指针,指向字符型数据,代表字符型数据的地址
for(int i=0;i<n;i++)
{
if(s[i]==ch1)
{
p=&s[i];
a=i;
}
if(s[i]==ch2)
{b=i;break;}//找到a,b的值后,退出循环
}
if(a>0&&b>0)
{
for(int j=a;j<=b;j++)
{
printf("%c",s[j]);
}
}
else if(a>0&&b<0)
{
for(int j=a;j<n;j++)
{
printf("%c",s[j]);
}
}
else
printf(" ");
printf("\n");//由样例输出格式可知
return p;
}
6-27 使用函数实现字符串部分复制 (20 分)
本题要求编写函数,将输入字符串t中从第m个字符开始的全部字符复制到字符串s中。
函数接口定义:
void strmcpy( char *t, int m, char *s );
函数
strmcpy
将输入字符串char *t
中从第m
个字符开始的全部字符复制到字符串char *s
中。若m
超过输入字符串的长度,则结果字符串应为空串。裁判测试程序样例:
#include <stdio.h> #define MAXN 20 void strmcpy( char *t, int m, char *s ); void ReadString( char s[] ); /* 由裁判实现,略去不表 */ int main() { char t[MAXN], s[MAXN]; int m; scanf("%d\n", &m); ReadString(t); strmcpy( t, m, s ); printf("%s\n", s); return 0; } /* 你的代码将被嵌在这里 */
输入样例:
7 happy new year
输出样例:
new year
void strmcpy( char *t, int m, char *s ) { int n=strlen(t); for(int i=0;i<n;i++) { if(m<=n) { *(s+i)=*(t+m-1+i);//将第m个字符,即从下标为m-1的字符开始赋到字符数组s中 } else *(s+i)=0; } }