嵌入式全栈开发学习笔记---C语言笔试复习大全13(编程题9~16)

目录

9.查找字符数组中字符位置(输入hello e    输出2);

10、查找字符数组中字符串的位置(输入hello ll 输出3);

11、字符数组中在指定位置插入字符;(输入hello 3 a   输出heallo)

12、在字符数组中指定开始位置插入字符串;(输入hello 3 aa  输出heaallo)

13、有n个人围成一圈,顺序排号,从第一个开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位?(约瑟夫环,笔试常考)

14、输入一个字符串,计算字符串中子串出现的次数。

15、编写一个C函数,将”I am from shanghai ”倒置为”shanghai from am I”,即将句子中的单词位置倒置,而不改变单词内部结构。

第一步:获取键盘输入的几个单词,

第二步:转置每个单词里面的每一个字母,

第三步:将每一个单词里面的字母单独装置

16、输入一个字符串,同时输入帧头和帧尾(可以是多个字符),将该字符串中合法的帧识别出来。


上一篇复习了关键字,这一篇我们来做第二次的8道编程题

说明:我们学过单片机的一般都是有C语言基础的了,网上关于C语言的资料有很多,大家如果对C语言不熟悉的话可以先去详细学一下,再以这篇博文作为复习资料学习。

这篇博文的目的是复习C语言,我们会陆续以30多个编程题作为复习要点,这30多个编程题基本涵盖了C语言所有的内容了,只要你掌握了这30多个编程题,那么你的C语言基本就没什么问题了。

注意:由于本专栏是嵌入式全栈开发专栏,为了我们能熟悉以后实际工作中的开发环境,我们写C语言全部在Linux中的vim编辑器中写,这么做事为了我们能够熟练掌握Linux系统的常用命令以及Linux上的vim编辑器的常用工作命令,以达到对口训练的目的!

vim编辑器的一些工作命令在上一篇博文中已经详细介绍过了,如果不了解可以先去看看。

我们正式开始:

建议新建一个homework目录来存放这8个编程题的程序文件。

上次我们讲过第1~8道编程题了

嵌入式全栈开发学习笔记---C语言笔试复习大全7(编程题1~8)-CSDN博客

这次我们开始讲第9~16道:

9.查找字符数组中字符位置(输入hello e    输出2);

提示:我们只要遍历数组,将数组中的每一个元素和该字符对比,直到相等,则输出字符的位置。

参考代码:

#include <stdio.h>
#include <string.h>

int get_char_index(char str[],char ch)
{

    int i;
    int length=strlen(str);
    for(i=0;i<length;i++)
    {
        if(ch==str[i])
        {
            return i+1;
        }
    }   
    return -1;
}

int main()
{
    char str[32]={0};
    char ch;
    printf("输入 字符串 字符\n");
    scanf("%s %c,str,&ch);
    int index=get_char_index(str,ch);
    if(-1==index)
    {
        printf("没有该字符\n");
    }
    else
    {
        printf("该字符的地址是%d\n",index);

    }
    return 0;
}

                

运行结果:

10、查找字符数组中字符串的位置(输入hello ll 输出3);

提示:用strncmp()字符串处理函数比较两个字符,如果相等则输出字符串的位置。

参考代码:

#include <stdio.h>
#include <string.h>

int get_sub_index(char str[],char sub[])
{
    int length_str=strlen(str);
    int length_sub=strlen(sub);
    int i;
    for(i=0;i<length_str-length_sub+1;i++)
    {   
        if(strncmp(str+i,sub,length_sub)==0)
        {
            return i+1;
        }
    }   
    return -1;
}

int main()
{
    char str[32]={0};
    char sub[32]={0};

    printf("输入 字符串 要查找的字符串\n");
    scanf("%s %s",str,sub);

    int index=get_sub_index(str,sub);

    if(-1==index)
    {
        printf("没有要查找的字符串\n");
    }
    else
    {
        printf("该字符串的位置是%d\n",index);
    }
    return 0;
}

运行结果:

11、字符数组中在指定位置插入字符;(输入hello 3 a   输出heallo)

我们可以把后面三个字符向后移动三位,然后将a放在第三个位置,然后将那三个字符赋值给后面三个位置。

参考代码:

#include <stdio.h>
#include <string.h>

int main()
{
    int num;
    int ch;
    char str[32]={0};
    int i;

    printf("输入 字符串 插入位置 插入字符\n");
    scanf("%s %d %c",str,&num,&ch);
    int length=strlen(str);//计算字符串长度

    for(i=0;i<length-num+1;i++)
    {   
        str[length-i]=str[length-1-i];  //移动后三位字符
    }   

    str[num-1]=ch;//插入字符
    printf("%s\n",str);
    return 0;
}

运行结果:

12、在字符数组中指定开始位置插入字符串;(输入hello 3 aa  输出heaallo)

提示:将he用strncpy拷贝到另外一个字符数组里面,然后用strcat将he和aa拼接起来,再将剩下的llo接在heaa后面,最后用strcpy将heaallo拷贝回原来的数组中去。

参考代码:

#include <stdio.h>
#include <string.h>

void insert_str(char str[],char insert[],int num)
{
    int length_str=strlen(str);
    int length_insert=strlen(insert);
    char tmp[32]={0};

    strncpy(tmp,str,num-1);
    strcat(tmp,insert);
    strcat(tmp,str+num-1);
    strcpy(str,tmp);
}

int main()
{
    char str[32];
    char insert[32];
    int num;

    printf("请输入 字符串 要插入的字符串 要插入的位置\n");
    scanf("%s %s %d",str,insert,&num);
    int length_str=strlen(str);
    if(num<=length_str)
    {   
     insert_str(str,insert,num);
    }   
    else
    {   
        printf("字符串长度不够,请重新确认要插入的位置\n");
    }  
    printf("%s\n",str);
    return 0;
}

运行结果:

13、有n个人围成一圈,顺序排号,从第一个开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位?(约瑟夫环,笔试常考)

提示:题目的意思请看图:

参考代码:

#include <stdio.h>

int main()
{
    int num;//总人数
    int person;//剩余人数
    int flag[1024]={0};//每个人的状态位,0保持,1出局
    int k=1;//报数
    int i=1;//flag数组下标

    printf("请输入游戏人数\n");
    scanf("%d",&num);
    person=num;

    while(person>1)//当剩余人数大于1就继续报数
    {   
        //每一次报数
        if(flag[i]==0)//没有出局的人
        {
            k++;//报数
            if((k>3)
            {
                flag[i]=1;//报到3的出局
                person--;//剩余人数减1
                k=1;//重新报数
            }
        }
            i++;//为了下一轮报数的时候先判断这个人还是不是0
            if(num+1==i){i=1;}//重新开始,从1号这人开始
    }

    //找出状态位为0的那个人
    for(i=1;i<num+1;i++)
    {
        if(flag[i]==0)
        { printf("剩下的那个人是第%d号\n",i);
            break;
        }
    }   
 return 0;
}

运行结果:

14、输入一个字符串,计算字符串中子串出现的次数。

提示:用strncmp进行比较,如果比较的结果是0,那就计数count++

参考代码:

#include <stdio.h>
#include <string.h>

int get_sub_count(char str[],char sub[])
{
    int length_str=strlen(str);
    int length_sub=strlen(sub);
    int i;
    int count=0;
    for(i=0;i<length_str-length_sub+1;i++)
    {   
        if(!strncmp(str+i,sub,length_sub))
        {
            count++;
        }
    }   
    return count;
}

int main()
{
    char str[32]={0};
    char sub[32]={0};

    printf("请输入 字符串 要计算的子串\n");
    scanf("%s %s",str, sub);
    int count=get_sub_count(str,sub);
    printf("子串的次数为%d\n",count);
    return 0;
}

运行结果:

15、编写一个C函数,将”I am from shanghai ”倒置为”shanghai from am I”,即将句子中的单词位置倒置,而不改变单词内部结构。

提示:先将整个句子倒转成”iahgnahs.....ma I.”,然后对单个单词进行倒转”shanghai....am I”。这道题使用gets()和scanf()来获取句子是不行的,我们要使用一个新的函数叫getchar()函数可以获取整个句子,空格也是字符,它遇到换行的时候结束。

第一步:获取键盘输入的几个单词,

参考代码:

#include <stdio.h>

int main()
{
    char str[1024]={0};
    int i=0;
    char ch;

    printf("请输入几个单词\n");
    while(ch!='\n')
    {   
        ch=getchar();//从键盘中获取单个字符
        str[i]=ch;
        i++;
    }   
    printf("%s\n",str);
    return 0;
}

运行结果:

第二步:转置每个单词里面的每一个字母,

参考代码:

#include <stdio.h>

void reverse(char str[], int start,int end)
{
    int i;
    char tmp;//交换专用变量
    for(i=0;i<(start+end)/2;i++)
    {
        int tmp=str[end-1-i];
        str[end-1-i]=str[start+i];
        str[start+i]=tmp;
     }   
}

int main()
{
    char str[1024]={0};
    int i=0;
    char ch;

    printf("请输入几个单词\n");
    while(ch!='\n')
    {   
        ch=getchar();//从键盘中获取单个字符
        str[i]=ch;
        i++;
    }

     reverse(str,0,i);//0是整个句子的开始位置,i是整个句子的结束位置
     printf("%s\n",str);
     return 0;
}

运行结果:

第三步:将每一个单词里面的字母单独装置

最终参考代码:

#include <stdio.h>

void reverse(char str[], int start,int end)
{
    int i;
    char tmp;//交换专用变量
    for(i=0;i<(end-start)/2;i++)
    {   
        int tmp=str[end-1-i];
        str[end-1-i]=str[start+i];
        str[start+i]=tmp;
    }   
}

int main()
{
    char str[1024]={0};
    int i=0;
    char ch;
    printf("请输入几个单词(单词)\n");
    while((ch=getchar())!='\n')
    {   
        str[i++]=ch;
    }   
    reverse(str,0,i);//0是整个句子的开始位置,i是整个句子的结束位置
    i=0;
    int begin=0;
    while(str[i]!='\0')//翻转所有单词
    {
        if(str[i]==' ')//翻转一个单词
        {
            reverse(str,begin,i);
            begin=i+1;//下一个单词的开始
        }
        i++;//下一个字符
    }
    reverse(str,begin,i);//'\0'之前的一个单词
    printf("%s\n",str);
    return 0;
}

最终运行结果:

16、输入一个字符串,同时输入帧头和帧尾(可以是多个字符),将该字符串中合法的帧识别出来。

提示:帧头和帧尾分别是head和tail,字符串”asdheadhauboisoktail”中headhauboisoktail是合法帧。

可以先找到帧头和帧尾的位置,最后把帧头和帧尾的位置之间的字符拷贝到另一个数组中打印出来。

参考代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int get_index(char str[],char sub[])
{
    int length_str=strlen(str);
    int length_sub=strlen(sub);
    int i;

    for(i=0;i<length_str-length_sub+1;i++)
    {
        if(strncmp(str+i,sub,length_sub)==0)
        {
            return i;
        }
    }   
    return -1; 
}
int main()
{
    char str[32]={0};
    char head[32]={0};
    char tail[32]={0};
    printf("请输入 字符串 帧头 帧尾\n");
    scanf("%s %s %s",str, head, tail);

    int index_head=get_index(str,head);
    int index_tail=get_index(str,tail);

    if(-1==index_head||-1==index_tail)
    {
        printf("输入有误\n");
        exit(1);//退出整个程序
    }

    char tmp[32]={0};
    int length_tail=strlen(tail);
    strncpy(tmp,str+index_head,index_tail-index_head+length_tail);

    printf("%s\n",tmp);
    return 0;
}

运行结果:

以上就是这篇内容,如想了解更多,欢迎订阅本专栏!

如有问题可评论区或者私信留言,如果想要进交流群请私信!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/599390.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

编程算法赛

1偶数累加 2、统计字符的数量 3、计算表达式的值 4、哥德巴赫猜想 5、进制的转换

英语学习笔记5——Nice to meet you.

Nice to meet you. 很高兴见到你。 词汇 Vocabulary Mr. 先生 用法&#xff1a;自己全名 / 姓 例如&#xff1a;Mr. Zhang Mingdong 或 Mr. Zhang&#xff0c;绝对不能是 Mr. Mingdong&#xff01; Miss 女士&#xff0c;小姐 未婚 用法&#xff1a;自己全名 / 姓 例如&#…

【论文阅读】Fuzz4All: Universal Fuzzing with Large Language Models

文章目录 摘要一、介绍二、Fuzz4All的方法2.1、自动提示2.1.1、自动提示算法2.1.2、自动提示的例子2.1.3、与现有自动提示技术的比较 2.2、fuzzing循环2.2.1、模糊循环算法2.2.2、Oracle 三、实验设计3.1、实现3.2、被测系统和baseline3.3、实验设置以及评估指标 四、结果分析4…

P8801 [蓝桥杯 2022 国 B] 最大数字

P8801 [蓝桥杯 2022 国 B] 最大数字 分析 dfs 思路&#xff1a;题目的意思&#xff0c;要让一个数最大&#xff0c;用贪心去考虑&#xff0c;从高位开始&#xff0c;对其进行a / b操作&#xff0c;使其变为9&#xff0c;可让该数最大 1.a 操作&#xff1a;1&#xff1b;b 操…

嵌入式学习<1>:建立工程、GPIO

嵌入式学习_part1 本部分笔记用于学习记录&#xff0c;笔记源头 >>b站江科大_STM32入门教程 建立工程、GPIO 开发环境&#xff1a;keil MDK、STM32F103C8T6 1 &#xff09;建立工程 &#xff08;1&#xff09;基于寄存器开发、基于标准库 或者 基于HAL库开发; &…

【代码随想录——哈希表】

1.哈希表理论基础 首先什么是 哈希表&#xff0c;哈希表&#xff08;英文名字为Hash table&#xff0c;国内也有一些算法书籍翻译为散列表&#xff0c;大家看到这两个名称知道都是指hash table就可以了&#xff09;。 那么哈希表能解决什么问题呢&#xff0c;一般哈希表都是用…

高素质高学历婚恋相亲交友平台有哪些?分享我的网上找对象成功脱单经历!

尽管觉得在社交软件上找到真爱的可能性很小&#xff0c;但我却时常看到别人成功的案例&#xff0c;这也让我跃跃欲试了。没想到&#xff0c;我真的成功了&#xff01;以下是我亲身使用过的一些方法&#xff0c;在此与大家分享&#xff0c;仅供参考哦&#xff01; &#x1f449;…

c++ cpp 在类中执行线程 进行恒定计算

在编程中&#xff0c;顺序执行是常见的模式&#xff0c;但是对cpu的利用率不是很高&#xff0c;采用线程池&#xff0c;又太麻烦了&#xff0c;原因是还得不断地把任务拆分&#xff0c;扫描返回值。 如果 初始化n个类的时候&#xff0c;传递数据自身即可异步计算&#xff0c;那…

六、文件查找

一、文件查找 1.查找文件内容 ​ 命令&#xff1a;grep keywords /dir_path/filename 2.查找系统命令 ​ 命令&#xff1a;which command 3.查找命令及配置文件位置 ​ 命令&#xff1a;whereis command 4.find查找 ​ find $find_path -name|-type|-perm|-size|-atime…

【前端】HTML基础(3)

文章目录 前言一、HTML基础1、表格标签1.1 基本使用1.2 合并单元格 2、列表标签2.1 无序列表2.2 有序列表2.3 自定义列表 3、 表单标签2.1 form标签2.2 input标签2.3 label标签2.4 select标签2.5 textarea标签 4、无语义标签5、HTML特殊字符 前言 这篇博客仅仅是对HTML的基本结…

RVM(相关向量机)、CNN_RVM(卷积神经网络结合相关向量机)、RVM-Adaboost(相关向量机结合Adaboost)

当我们谈到RVM&#xff08;Relevance Vector Machine&#xff0c;相关向量机&#xff09;、CNN_RVM&#xff08;卷积神经网络结合相关向量机&#xff09;以及RVM-Adaboost&#xff08;相关向量机结合AdaBoost算法&#xff09;时&#xff0c;每种模型都有其独特的原理和结构。以…

streamlit通过子目录访问

运行命令&#xff1a; streamlit hello 系统默认使用8501端口启动服务&#xff1a; 如果想通过子目录访问服务&#xff0c;可以这么启动服务 streamlit hello --server.baseUrlPath "app" 也可以通过以下命令换端口 streamlit hello --server.port 9999 参考&…

2024最新CTF入门的正确路线

目录 前言 一、什么是CTF比赛&#xff1f; 二、CTF比赛的流程 三、需要具备的知识 四、总结 前言 随着网络安全意识的增强&#xff0c;越来越多的人开始涉足网络安全领域&#xff0c;其中CTF比赛成为了重要的学习和竞赛平台。本人从事网络安全工作多年&#xff0c;也参加过…

甲小姐对话柳钢:CEO对股东最大的责任,是对成功的概率负责|甲子光年

只有看见最微小的事物&#xff0c;才能洞悉伟大的定律。 来源&#xff5c;甲子光年 作者&#xff5c;甲小姐 刘杨楠 编辑&#xff5c;栗子 商业史上&#xff0c;职业经理人成为“空降CEO”的故事往往胜少败多。 “究其原因有三条——容易自嗨、喊口号&#xff1b;不顾公司历…

笔试强训Day19 数学知识 动态规划 模拟

[编程题]小易的升级之路 题目链接&#xff1a;小易的升级之路__牛客网 思路&#xff1a; 按题目写即可 注意辗转相除法。 AC code&#xff1a; #include<iostream> using namespace std; int gcd(int a, int b) {return b ? gcd(b, a % b) : a; } int main() {int n…

三步学会苹果手机怎么关震动的方法!

苹果手机的震动功能在某些情况下可能会被认为是不必要的&#xff0c;比如在会议、课堂或者晚间睡眠时。因此&#xff0c;学会如何关闭苹果手机的震动功能是非常实用的。苹果手机怎么关震动&#xff1f;在本文中&#xff0c;我们将介绍三个步骤&#xff0c;帮助你关闭苹果手机的…

openEuler 22.03 GPT分区表模式下磁盘分区管理

目录 GPT分区表模式下磁盘分区管理parted交互式创建分区步骤 1 执行如下步骤对/dev/sdc磁盘分区 非交互式创建分区步骤 1 输入如下命令直接创建分区。 删除分区步骤 1 执行如下命令删除/dev/sdc1分区。 GPT分区表模式下磁盘分区管理 parted交互式创建分区 步骤 1 执行如下步骤…

ThingsBoard版本控制配合Gitee实现版本控制

1、概述 2、架构 3、导出设置 4、仓库 5、同步策略 6、扩展 7、案例 7.1、首先需要在Giitee上创建对应同步到仓库地址 ​7.2、giit仓库只能在租户层面进行配置 7.3、 配置完成后&#xff1a;检查访问权限。显示已成功验证仓库访问&#xff01;表示配置成功 7.4、添加设…

喜报 | 擎创科技荣获NIISA联盟2023年度创新技术特等奖!

为深入实施创新驱动发展战略&#xff0c;紧紧把握全球科技革命和产业变革方向&#xff0c;密切跟踪前沿科技新趋势&#xff0c;经科技部中国民营促进会业务主管部门批准以及国家互联网数据中心产业技术创新战略联盟&#xff08;以下简称联盟&#xff09;总体工作安排&#xff0…