PTA|C语言|指针+数组练习题_字符串

--------------------------------------------------------------------------------

计算两数的和与差


本题要求实现一个计算输入的两数的和与差的简单函数。

函数接口定义:

void sum_diff( float op1, float op2, float *psum, float *pdiff );

其中op1op2是输入的两个实数,*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;

}


拆分实数的整数与小数部分

本题要求实现一个拆分实数的整数与小数部分的简单函数。

函数接口定义:

void splitfloat( float x, int *intpart, float *fracpart );

其中x是被拆分的实数(0x<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.718
void 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 found
int 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中的数据由(a0a1an−1)变换为(anman−1a0a1anm−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) 
{
    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 8
void 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

输出样例:

defabc
void 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 year
void 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 yer
void 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
thisisnottrue
bool 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;
    }
}

PTA|C语言|指针+数组练习题_字符串_02

这个测试点一直过不去,如果有佬知道的可以告诉我一声,谢~

分类统计各类字符个数

本题要求实现一个函数,统计给定字符串中的大写字母、小写字母、空格、数字以及其它字符各有多少。

函数接口定义:

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
abcdef
char *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;
}