
--------------------------------------------------------------------------------
计算两数的和与差
本题要求实现一个计算输入的两数的和与差的简单函数。
函数接口定义:
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.00void sum_diff( float op1, float op2, float *psum, float *pdiff )
{
*psum = op1+op2;
*pdiff = op1-op2;
}拆分实数的整数与小数部分
本题要求实现一个拆分实数的整数与小数部分的简单函数。
函数接口定义:
void splitfloat( float x, int *intpart, float *fracpart );其中x是被拆分的实数(0≤x<10000),*intpart和*fracpart分别是将实数x拆分出来的整数部分与小数部分。
裁判测试程序样例:
#include <stdio.h>
void splitfloat( float x, int *intpart, float *fracpart );
int main()
{
float x, fracpart;
int intpart;
scanf("%f", &x);
splitfloat(x, &intpart, &fracpart);
printf("The integer part is %d\n", intpart);
printf("The fractional part is %g\n", fracpart);
return 0;
}
/* 你的代码将被嵌在这里 */输入样例:
2.718输出样例:
The integer part is 2
The fractional part is 0.718void splitfloat( float x, int *intpart, float *fracpart )
{
*intpart=(int)x;
*fracpart=x-*intpart;
}在数组中查找指定元素
本题要求实现一个在数组中查找指定元素的简单函数。
函数接口定义:
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输入样例2:
5
1 2 2 5 4
0输出样例2:
Not foundint search( int list[], int n, int x )
{
int index=-1;
for(int i=0;i<n;i++)
{
if(x==list[i])
{
index=i;
break;
}
}
return index;
}数组循环右移
本题要求实现一个对数组进行循环右移的简单函数:一个数组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 4void ArrayShift(int a[], int n, int m)
{
m %= n;
int temp[n];
for (int i = 0; i < n; i++) {
temp[i] = a[(n - m + i) % n];
}
for (int i = 0; i < n; i++) {
a[i] = temp[i];
}
}报数
报数游戏是这样的:有n个人围成一圈,按顺序从1到n编好号。从第一个人开始报数,报到m(<n)的人退出圈子;下一个人从1开始报数,报到m的人退出圈子。如此下去,直到留下最后一个人。
本题要求编写函数,给出每个人的退出顺序编号。
函数接口定义:
void CountOff( int n, int m, int out[] );其中n是初始人数;m是游戏规定的退出位次(保证为小于n的正整数)。函数CountOff将每个人的退出顺序编号存在数组out[]中。因为C语言数组下标是从0开始的,所以第i个位置上的人是第out[i-1]个退出的。
裁判测试程序样例:
#include <stdio.h>
#define MAXN 20
void CountOff( int n, int m, int out[] );
int main()
{
int out[MAXN], n, m;
int i;
scanf("%d %d", &n, &m);
CountOff( n, m, out );
for ( i = 0; i < n; i++ )
printf("%d ", out[i]);
printf("\n");
return 0;
}
/* 你的代码将被嵌在这里 */输入样例:
11 3输出样例:
4 10 1 7 5 2 11 9 3 6 8void CountOff( int n, int m, int out[] )
{
int count=n,i,num=0,j=1;
int s[MAXN];
for(i=0;i<n;i++)
s[i]=i+1;
while(count)
{
for(i=0;i<n;i++)
{
if(s[i]!=0)
{
num++;
if(num==m)
{
s[i]=0;
out[i]=j;//弹出了一个人的新队列,这个位置应该是j,也就是重新从1开始报数
count--;
j++;
num=0;//准备处理下一个m个元素
}
}
}
}
}这道题需要解决的问题有,为了实现报数的功能,每次记录好退出人下标之后都需要计数
需要标识每个人退出或不退出的状态
每次轮到这圈的最后一个人需要继续跳到下一圈,但计数器不能清零
已退出的人不能再参与计数,每轮参与计数的人都在减少
用count来控制循环是否进行,count表示的是还在圈内的人,将n赋值给count,每次当有人从圈里出去,我们的count就要减一,表示人数减少了一个,等到count变为0,即圈内没有人时,我们的循环也就停止了。
人怎么出去?通过if条件语句和一个变量num来控制是否提出了这个人,如果提出了则将这个单位赋值为0,这样就可以在for循环下设置是否要进行操作,判断语句就是这个位置是否为0,当s[i]!=0时我们就继续循环。
移动字母
本题要求编写函数,将输入字符串的前3个字符移到最后。
函数接口定义:
void Shift( char s[] );其中char s[]是用户传入的字符串,题目保证其长度不小于3;函数Shift须将按照要求变换后的字符串仍然存在s[]里。
裁判测试程序样例:
#include <stdio.h>
#include <string.h>
#define MAXS 10
void Shift( char s[] );
void GetString( char s[] ); /* 实现细节在此不表 */
int main()
{
char s[MAXS];
GetString(s);
Shift(s);
printf("%s\n", s);
return 0;
}
/* 你的代码将被嵌在这里 */输入样例:
abcdef输出样例:
defabcvoid Shift( char s[] )
{
int i;
char a[3];
int n=strlen(s);
for(i=0;i<3;i++)
a[i]=s[i];
for(i=3;i<n;i++)
s[i-3]=s[i];
s[n-3]=a[0];
s[n-2]=a[1];
s[n-1]=a[2];
}使用函数实现字符串部分复制
本题要求编写函数,将输入字符串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 yearvoid strmcpy( char *t, int m, char *s )
{
int i=m-1,k=0;
while(t[i]!='\0')
{
s[k]=t[i];
i++;
k++;
}
s[k]='\0';
}删除字符
本题要求实现一个删除字符串中的指定字符的简单函数。
函数接口定义:
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 yervoid delchar( char *str, char c )
{
for(int i=0;str[i]!='\0';i++)
{
if(str[i]==c)
{
for(int j=i;str[j]!='\0';j++)
str[j]=str[j+1];
i--;
}
}
}判断回文字符串
本题要求编写函数,判断给定的一串字符是否为“回文”。所谓“回文”是指顺读和倒读都一样的字符串。如“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输入样例2:
thisisnottrue输出样例2:
No
thisisnottruebool palindrome( char *s )
{
int length=strlen(s);
int flag=0;
for(int i=0;i<length/2;i++,length--)
{
if(s[i]!=s[length-i-1])
{
flag=1;
break;
}
if(flag==0)
return true;
else
return false;
}
}
这个测试点一直过不去,如果有佬知道的可以告诉我一声,谢~
分类统计各类字符个数
本题要求实现一个函数,统计给定字符串中的大写字母、小写字母、空格、数字以及其它字符各有多少。
函数接口定义:
void StringCount( char *s );其中 char *s 是用户传入的字符串。函数StringCount须在一行内按照
大写字母个数 小写字母个数 空格个数 数字个数 其它字符个数的格式输出。
裁判测试程序样例:
#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&*?
093 Az输出样例:
2 2 1 3 4#include<string.h>
void StringCount( char *s )
{
int capital=0,small=0,blank=0,digit=0,other=0;
int len=strlen(s);
for(int i=0;i<len;i++)
{
if(s[i]>='A'&&s[i]<='Z')
capital++;
else if(s[i]>='a'&&s[i]<='z')
small++;
else if(s[i]==' ')
blank++;
else if(s[i]>='0'&&s[i]<='9')
digit++;
else
other++;
}
printf("%d %d %d %d %d\n",capital,small,blank,digit,other);
}字符串的连接
本题要求实现一个函数,将两个字符串连接起来。
函数接口定义:
char *str_cat( char *s, char *t );函数str_cat应将字符串t复制到字符串s的末端,并且返回字符串s的首地址。
裁判测试程序样例:
#include <stdio.h>
#include <string.h>
#define MAXS 10
char *str_cat( char *s, char *t );
int main()
{
char *p;
char str1[MAXS+MAXS] = {'\0'}, str2[MAXS] = {'\0'};
scanf("%s%s", str1, str2);
p = str_cat(str1, str2);
printf("%s\n%s\n", p, str1);
return 0;
}
/* 你的代码将被嵌在这里 */输入样例:
abc
def输出样例:
abcdef
abcdefchar *str_cat( char *s, char *t )
{
char *p=s;//保存原始字符串s的地址
s=s+strlen(s);//获取s的长度并添加到当前位置,这样s当前指向的就是s的末尾位置
while(*t!='\0')
{
*s=*t;//往s的末尾添加元素
s++;
t++;
}
return p;
}字符串排序
本题要求编写程序,读入5个字符串,按由小到大的顺序输出。
输入格式:
输入为由空格分隔的5个非空字符串,每个字符串不包括空格、制表符、换行符等空白字符,长度小于80。
输出格式:
按照以下格式输出排序后的结果:
After sorted:
每行一个字符串输入样例:
red yellow blue black white输出样例:
After sorted:
black
blue
red
white
yellow#include<stdio.h>
#include<string.h>
#define MAXSIZE 100
int main()
{
char s[5][MAXSIZE];
char temp[MAXSIZE];
for (int i=0; i<5;i++)
scanf("%s",s[i]);
for(int i=0;i<4;i++)
{
for(int j=i+1;j<5;j++)
{
if(strcmp(s[i],s[j])>0)
{
strcpy(temp,s[i]);
strcpy(s[i],s[j]);
strcpy(s[j],temp);
}
}
}
printf("After sorted:\n");
for (int i=0;i<5;i++)
printf("%s\n",s[i]);
return 0;
}









