-刷题小结19

题目一

cs 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//将字符指针s所指字符串中的字符倒序
void reverseStr(char * s); 

int main() {
    char s[100+1];
    gets(s);
    reverseStr(s);
    printf("result=%s\n",s);
    return 0;
}

/* 请在这里填写答案 */

具体解法

利用strlen函数计算字符串s的长度n(即字符的个数,不包括字符串结束语\0);

通过循环遍历字符串的前半部分(i从0到n/2-1),将当前位置i的字符与对称位置n-i-1的字符进行交换;

由于字符串是以字符指针的形式传递,交换操作会直接修改原字符串的内容,无需返回新字符串。

cs 复制代码
//将字符指针s所指字符串中的字符倒序
void reverseStr(char * s){
    int n=strlen(s);
    for(int i=0;i<n/2;i++){
        int temp=s[i];
        s[i]=s[n-i-1];
        s[n-i-1]=temp;
    }
}

题目二

cs 复制代码
#include <stdio.h>
#define HERB_NAME_LEN 1000
#define HERB_EPITHET_NUM 10

char errorMsg[] = "没有那么多别名!";
struct HerbMedicine {
   int herbNo;//中药编号
   char name[HERB_NAME_LEN+1];//中药正名
   char epithet[HERB_EPITHET_NUM][HERB_NAME_LEN+1];//每个中药保存最多HERB_EPITHET_NUM个别名
   int epithetNum; // 别名个数
};
char* getEpithet(struct HerbMedicine *pHerb, int i);

int main()
{
  struct HerbMedicine herb = {10000, "麦冬", {"麦门冬","杭寸冬","杭麦冬","寸冬","大麦冬"}, 5};
  int i;
  scanf("%d", &i);

  printf("%s\n", getEpithet(&herb, i));

  return 0;

}

/* 请在这里填写答案 */

题目分析

理解结构体与参数含义:

struct HerbMedicine结构体包括:

epithet:存储别名的二维字符数组(最多HERB_EPITHET_NUM个别名);

epithetNum:实际的别名个数;

函数参数i是用户传入的"第i个别名"(注意:用户输入的i是从1开始的序号,而数组下标是从0开始的)。

具体解法

  1. 将用户传入的i转换为数组下标(i-1),并检查改下标是否在有效范围内(i-1既不小于0,也不超过实际别名个数);
  2. 若下标有效,返回结构体中对应的下标别名;
  3. 若无效,返回全局定义的错误信息errorMsg。
cs 复制代码
char* getEpithet ( struct HerbMedicine *pHerb, int i ){
    if(i-1>=0&&i-1<pHerb->epithetNum){
        return pHerb->epithet[i-1];
    }
    else return errorMsg;
    }

题目三

解题思路

统一文件名格式:所有字母先转小写,再将首字母(若为字母)转大写。

具体解法

  1. 读取文件名的数量n;
  2. 循环n次,每次读取一个文件名存入字符数组s(保证了多组输入);
  3. 遍历文件名的每个字符,如果字符为大写字母,通过加32(ASCII码偏移)转换为对应的小写字母,数字和-保持不变;
  4. 在处理后的字符中,如果首字符为小写字符,通过减32转换为对应的大写字母,若首字母是数字或-,保持不变;
  5. 每次处理完一个文件名后,直接输出结果。
cs 复制代码
#include <stdio.h>
#include <string.h>

int main(){
    int n;
    scanf("%d",&n);
    while(n--){
        char s[50];
        scanf("%s",s);
        int a=strlen(s);
        for(int i=0;i<a;i++){
            if(s[i]>='A'&&s[i]<='Z'){
                s[i]+=32;
            }
        }
        if(s[0]>='a'&&s[0]<='z'){
            s[0]-=32;
        }
        printf("%s\n",s);
    }
    return 0;
}

题目四

具体解法

  1. 首先读取班级数量N,接着读取N个班级的学生人数,存入数组a,最后读取每个场地能容纳的学生人数C;
  2. 通过循环遍历数组a,累加所有班级的学生人数,得到总人数sum;
  3. 计算所需场地数量:如果总人数sum能被C整除,则场地数为sum/C,若不能整除,则场地数为sum/C+1(需额外一个场地容纳剩余学生);
  4. 最后输出结果x。
cs 复制代码
#include <stdio.h>

int main(){
    int N;
    scanf("%d",&N);
    int a[N];
    for(int i=0;i<N;i++){
        scanf("%d",&a[i]);
    }
    int C;
    scanf("%d",&C);
    int x,sum=0;
    for(int i=0;i<N;i++){
        sum+=a[i];
    }
    if(sum%C!=0)x=sum/C+1;
    else x=sum/C;
    printf("%d",x);
    return 0;
}
相关推荐
爱学大树锯2 小时前
1361 · 文字并排
算法
Tisfy2 小时前
LeetCode 2483.商店的最少代价:两次遍历 -> 一次遍历
算法·leetcode·题解·遍历
YGGP2 小时前
【Golang】LeetCode 279. 完全平方数
算法·leetcode
im_AMBER2 小时前
Leetcode 87 等价多米诺骨牌对的数量
数据结构·笔记·学习·算法·leetcode
import_random2 小时前
[算法]时间序列(介绍)
算法
wuk9982 小时前
MATLAB中求解和分析马蒂厄方程
人工智能·算法·matlab
Wang201220133 小时前
LSTM和Transformer对比
人工智能·算法·架构
KingRumn3 小时前
Linux进程间通信之D-Bus
linux·算法
fufu03113 小时前
Linux环境下的C语言编程(四十九)
linux·c语言·算法