当前位置: 代码迷 >> 综合 >> pta函数题精选解答
  详细解决方案

pta函数题精选解答

热度:85   发布时间:2024-02-13 14:12:33.0

习题8.4 报数

报数游戏是这样的:有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 20void 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 a[MAXN],i,k=0,count=n,j=0;for(i=0;i<n;i++)    //给每个位置赋初值{a[i]= i;}for(;count!=0;i++){if(a[i%n]!=-1)//-1表示已经退出,{k++;//报数+1if(k==m)//报数满足条件m{out[i%n]=n-count+1;//给对应的位置告诉他是第几个退出的a[i%n]=-1;//用-1赋值,在后面的报数中被屏蔽count--;//退出一个k=0;//重新报数}    }}    
}


习题8.5 使用函数实现字符串部分赋值

本题要求编写函数,将输入字符串t中从第m个字符开始的全部字符复制到字符串s中。

函数接口定义:

void strmcpy( char *t, int m, char *s );

函数strmcpy将输入字符串char *t中从第m个字符开始的全部字符复制到字符串char *s中。若m超过输入字符串的长度,则结果字符串应为空串。

裁判测试程序样例:

#include <stdio.h>
#define MAXN 20void 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 ){t=t+m-1;while(*t!='\0'){*s=*t;s++;t++;}*s='\0';
}

 

习题8.6 删除字符

本题要求实现一个删除字符串中的指定字符的简单函数。

函数接口定义:

void delchar( char *str, char c );

其中char *str是传入的字符串,c是待删除的字符。函数delchar的功能是将字符串str中出现的所有c字符删除。

裁判测试程序样例:

#include <stdio.h>
#define MAXN 20void 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 i,j,n=strlen(str);for(i=0;i<n;i++){if(str[i]==c){for(j=i;j<n;j++)str[j]=str[j+1];i=i-1;//此处注意,必须要有个i=i-1;}}}

 

 


习题11.5 指定位置输出字符串

本题要求实现一个函数,对给定的一个字符串和两个字符,打印出给定字符串中从与第一个字符匹配的位置开始到与第二个字符匹配的位置之间的所有字符。

函数接口定义:

char *match( char *s, char ch1, char ch2 );

函数match应打印s中从ch1到ch2之间的所有字符,并且返回ch1的地址。

裁判测试程序样例:

#include <stdio.h>#define MAXS 10char *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

实现代码:

char *match( char *s, char ch1, char ch2 )
{char *p=s;//先指向swhile(*p!='\0'&&*p!=ch1){p++;}//查找ch1char *q=p;if(*p==ch1&&*q==ch2){printf("%c\n",ch1);return p;}//如果ch1与ch2指向同一个字符直接输出while(*q!='\0'&&*q!=ch2){printf("%c",*q++);if(*q==ch2){printf("%c",ch2);}//这是找的到ch1的情况//先输出再自增移动到下一个位置 }printf("\n");//注意格式,在例子中可以发现有输出空行return p; 
}

 

习题11.6 查找子串

本题要求实现一个字符串查找的简单函数。

函数接口定义:

char *search( char *s, char *t );

函数search在字符串s中查找子串t,返回子串t在s中的首地址。若未找到,则返回NULL。

裁判测试程序样例:

#include <stdio.h>
#define MAXS 30char *search(char *s, char *t);
void ReadString( char s[] ); /* 裁判提供,细节不表 */int main()
{char s[MAXS], t[MAXS], *pos;ReadString(s);ReadString(t);pos = search(s, t);if ( pos != NULL )printf("%d\n", pos - s);elseprintf("-1\n");return 0;
}/* 你的代码将被嵌在这里 */

输入样例1:

The C Programming Language
ram

输出样例1:

10

输入样例2:

10

输入样例2:

The C Programming Language
bored

输出样例2:

-1

实现代码

char *search(char *s, char *t)
{int lens=strlen(s);int lent=strlen(t);int i,j,k;int x=lens-lent;for (i=0; i<=x; i++){for (j=0,k=i; j<lent; j++,k++){if (s[k]!=t[j]) break;}if (j==lent)break;}if (i<=x) return s+i;else return NULL;
}

 

 

  相关解决方案