PTA-2023第十三次练习题目题解

发布时间 2023-12-15 12:06:45作者: 一只傲娇璇

PTA-2023第十三次练习题目题解

以下代码已做防抄袭处理,切勿抄袭。

注意:手机端因为屏幕限制,代码会有(不希望的)换行。解决方案:1.建议使用电脑端打开。2.点击代码进入全屏观看。

6-25 实验9_5_反向打印字符串

思路就是每次先找到字符串的最后一位,然后输出这一位,输出之后将这一位改为‘\0’,然后递归。

void reversePrint(char str[])
{
	int i = 0;//控制str的位数
	while (str[i] != '\0') i++;//如果没有找到字符串的末尾,就i++向后找
	if (i == 0)  return;//如果字符串为空就结束递归
	printf("%c", str[i - 1]);//打印当前位数
	str[i - 1] = '\0';//修改为'\0'
	return reversePrint(str//递归
}

6-26 实验9_6_单词字符统计

我们定义一个数组,用来储存每个字母出现的次数。并且用下标代表字母的ASCII值,下标对应的数值表示字母出现的次数。

例如:如果有一个'a'字符,他对应的ASCII值是97,那我们就s[97]++;

最后遍历一遍s数组中97-122之间的数值找到最大值和最小值

int s[200];
int  getResult(char word[])
{
	int i = 0;//指向word数组
	while (word[i] != '\0')
	{
		s[word[i++]]++;//向s数组中储存
	}
	int max = -1, min = 200;
	for (int j = 'a'; j <= 'z'; j++)//寻找最大值,最小值
	{
		if (s[j] != 0)
		{
			if (s[j] > max) max = s[j];
			if (s[j] < min)  min = s[j];
		}
	}
	//判断是否是质数
	if (isPrime(max - min)) return max - min;
	else return -1;
}

6-27 实验9_7_设计函数int getVowel(char str[],char vowel[])

利用双指针,指针i指向str,指针j指向vowel,如果str[i]满足条件,就将str[i]储存到vowel[j]中,并且j向后移动一位。

最后不要忘记补充'\0'。

int getVowel(char str[], char vowel[])
{
    int  j = 0;//设定两个指针指向两个数组
    for(int i =0;str[i]!='\0';i++)
    {
        //如果说str[i]满足条件
   if (str[i] == 'a' || str[i] == 'e' || str[i] == 'i' || str[i] == 'o' || str[i] == 'u')
      {
       //将这一位储存到vowel中,并将j向后平移一位
            vowel[j++] = str[i];
      }
    }
    //字符串末尾补充'\0'
    vowel[j] = '\0';
    //返回位数
    return j;
}

6-28 实验10_1_英超一

遍历一遍字符串,然后根据题目所给的条件计算就好。

int getScore(char* s)
{
    int score = 0;//储存最终得分
    for (int i = 0; s[i] != '\0';i++)//遍历字符串
    {
        if (s[i] == 'W')//如果赢,加3分
        {
            score += 3;
        }
        else if (s[i] == 'D')//平局加1分
        {
            score += 1;
        }
    }
    return score;//返回分数
}

6-31 实验10_4_设计函数 locatesubstr

如果str1中的某一个字母和str2中的第一个字母相同了,那就判断这个字母之后的那个字符串是否与str2相同。以此类推。只要注意使用指针就好了

bool check(char* str1, char* str2)
{
    while (*str2 != '\0')//遍历一遍str2
    {
        if (*str1 == '\0') return false;//如果长度不相同,就返回false
        if (*str2 != *str1) return false;//如果不是子串,也返回false
        str2++;
        str1++;
    }
    //如果是子串,返回true
    return true;
}

char* locatesubstr(char* str1, char* str2)
{
    while(*str1 !='\0')//遍历一遍str1
    {
        if (*str1 == *str2)//如果str1中的某一个字母和str2中的第一个字母相同
        {
            if (check(str1,str2))//判断这个位置之后的那个字符串是否与str2相同
            {
                return str1;//如果相同返回这个位置的指针
            }
        }
        str1++;
    }
    //如果没有找到,返回NULL
    return NULL;
}

6-33 实验10_8_设计函数 void delcharfun(char *str,char ch)

我们定义一个新数组,用来储存删除后的字符串,最后将新字符串储存回原字符串中就好了。

void delcharfun(char* str, char ch)
{
    char str2[99999];//储存新字符串
    int j = 0;
    for (int i = 0; str[i] != '\0'; i++)
    {
        if (str[i] == ch)//如果是需要删除的字符,就跳过这一个字符
        {
            continue;
        }
        else//否则就储存到str2中
        {
            str2[j++] = str[i];
        }
    }
    //复制回原数组
    for (int k = 0; k < j; k++)
    {
        str[k] = str2[k];
    }
    //末尾加'\0'
    str[j] = '\0';
}