2015年-2017年 计算机技术专业 程序设计题(算法题)实战_c语言程序设计数据结构程序设计分析

news2024/10/23 18:06:44

文章目录

  • 2015
    • 1.C语言算法设计部分
    • 2.数据结构算法设计部分
  • 2016
    • 1.C语言算法设计部分
    • 2.数据结构算法设计部分
  • 2017年
    • 1. C语言算法设计部分
    • 2.数据结构算法设计部分

2015

1.C语言算法设计部分

在这里插入图片描述

int total(int n)
{
    if(n==1) return  1;
    
    return total(n-1)+n+1;
}
//主函数测试代码已省略

2.输入某天的年月日,计算该天为当年的第几天。例如输入:1998,9,25;
输出:9月25日是1998年的第268天(提示闰年第判别方法为能被4整除却不能被100整除,或能被400整除的年份是闰年)。要求使用下面的结构体:
struct Data{int year; int month; int day};

int Func(int month,int day)
{
    int sum=0;
    switch (month-1) {
        case 11:sum+=30 ;
        case 10:sum+=31 ;
        case 9:sum+=30 ;
        case 8:sum+=31 ;
        case 7:sum+=31 ;
        case 6:sum+=30 ;
        case 5:sum+=31 ;
        case 4:sum+=30 ;
        case 3:sum+=31 ;
        case 2:sum+=28 ;
        case 1:sum+=31 ;
    }
    return sum+day;
}

int main()
{
    struct Data data={1998,9,25}; //初始化结构体
    int num=0; //记录一共有多少天
    num=Func(data.month, data.day);
    
    // 判断是否是闰年,如果是则统计的天数+1,如果不是则直接结束
    if(data.year%4==0&&data.year%100!=0)num+1;
    
    printf("%d月%d日是%d年的第%d天\n",data.month,data.day,data.year,num);
}

在这里插入图片描述

3.请编写一个程序,将一字符串的第K个字符开始的全部字符赋值成为另一个字符串,要求:
(1)将复制过程单独写成一个函数,并用指针完成;
(2)在主函数中输入字符串和K的值,并在主函数中输出复制结果

void copy(char *str1,char *str2,int k)
{
    while(k--)str1++;
    str1--;//保证从第k位置开始
    
    while(*str2!='\0')
    {
        *str1=*str2;
        str1++;
        str2++;
    }
    *str1='\0';
    
    
}

int main()
{
   
    char str1[]={"month"};
    char str2[]={"day"};
    copy(str1, str2, 4);
    puts(str1);
   
}

在这里插入图片描述

2.数据结构算法设计部分

在这里插入图片描述
1.

算法基本思想:遍历一遍单链表,定义两个指针一个pre指向当前结点的前一个结点,定义一个cur指针,指向当前结点,首先判断一下前两个结点的关系,明确是升序还是将序,然后开始遍历比较,不成立,直接返回,或者一直成立,直到遍历完。

代码省略,就是遍历单链表

算法基本思想:该问题的关键在于每层,所以,算法的基本思想在于二叉树的层序遍历,辅以队列这种数据结构,重点在于处理每一层,每次计算当前队列的长度,确定,每一层的长度,一次处理一层

代码省略,多次考察

3.设计算法,求出无项连通图中距离顶点V0的最短路径长度为K的所有节点

#define INF -1    // 表示尚未访问的节点
void BFS_K(ALGraph G,VertexType v,VertexType K)
{
    int visit[MASVETEX];  //初始化访问数组
    for(int i=0;i<MASVETEX;i++)visit[i]=INF;
   
    SqQueue Q;
    Queue_Init(Q);
    Queue_En(Q, v);
    visit[v]=0; //顶点0到顶点0的距离为0
    
    while (!Queue_Empty(Q)) {  //假设队列不为空,开始循环
        
        Queue_De(Q, v); //从队列中弹出表头,此时弹出的元素存放在v中
        if (visit[v] > K) break;  //加快操作,以后的循环是没有意义的
        
        ArcNode *p=G.vertices[v].firstArc;
        
        while(p!=NULL)
        {
            if(visit[p->adjvex]==INF)  //没有被访问过
            {
                visit[p->adjvex]=visit[v]+1;  //更新visit数组
                Queue_En(Q, p->adjvex); //将该元素加入队列中
            }
            p=p->nextArc;
        }
        
    }
    
    for(VertexType i=1;i<=G.vexnum;i++)
    {
        if(visit[i]==K)
        {
            printf("%d ",i);
        }
    }
    
}

2016

1.C语言算法设计部分

在这里插入图片描述

思路如下:
第1项是 1 有一个数
第二项是23 有两个数
第三项是 3=4
56 有三个数
外层一个大循环从1到n,内层循环 大循环i的次数,最开始初始化一个1,每次
上++它

代码略

2.某歌咏比赛中,有8个评委对20位选手进行评分,选手按1-20号进行编号,每个评委给出1-10的分数,在统计分数时要除去一个最低分和最高分,计算出其他评委给出分数的平均分作为选手的最后得分。编写程序实现以下功能:评委输入,按评分输出得分最高的三位选手的编号和分数,要求程序执行时间最短。

思路梳理:
因为要求程序执行时间最少,所以不能通过先找第一大,再找第二大,再找第三大这么循环,而是,每拿出一个选手,看看它是否是第一大,是,就依次下移,将原先的第三大挤出,以此类推,然后判断是不是第二大

3.编写程序,查找给定字符在字符串中首次出现的位置。要求:不使用有关字符串处理的库函数;
(1)主函数中键盘输入字符以及查找的字符,调用子函数;
(2)子函数完成查找任务,如果字符串中包含所查找的字符,则返回该字符串首次出现的位置,否则返回0

int first_str(char *p,char c)
{
    int index=1;
    while(*p!='\0')
    {
        if(*p==c) return index;
        p++;
        index++;
    }
    return 0;
}

#define MASIZE 100
int main()
{
    char str[MASIZE];
    scanf("%s",str); //输入字符串
    char c;
    while (getchar() != '\n');
    scanf("%c",&c);
    int index=first_str(str, c);
    if(index!=0)
    {
        printf("出现的位置为:%d\n",index);
    }else
    {
        printf("查找失败\n");
    }
}

在这里插入图片描述

值得积累的点:关于getchar清除缓冲区的问题

在C语言中,while (getchar() != ‘\n’); 这行代码通常用于清除输入缓冲区(input buffer)中直到下一个换行符(newline character,\n)的所有字符。这里,getchar() 是一个标准输入函数,用于从标准输入(通常是键盘)读取下一个可用的字符,并返回这个字符作为 int 类型(实际上返回的是字符的ASCII码值,但可以通过类型转换或字符比较来直接使用)。
当您使用 scanf(“%s”, str); 读取一个字符串时,scanf 会在遇到空格、制表符或换行符时停止读取。然而,换行符(用户按下回车键时产生的)仍然会留在输入缓冲区中。紧接着,当您尝试使用 scanf(“%c”, &c); 读取一个字符时,scanf 会立即从输入缓冲区中读取下一个字符,这通常是之前留在那里的换行符。

2.数据结构算法设计部分

在这里插入图片描述
问题1和问题2:已经出现多次了

问题3:

问题分析:本质上就是一个非连通图的遍历,将每个顶点都以它们为起始节点遍历一遍,用DFS即可实现

int visit[MaxSize]={0};

void DFS_G(ALGraph G,VertexType v)
{
    visit[v]=1; //当前v点被访问
    printf("%d ",v);
    
    ArcNode *p=G.vertices[v].firstArc; //找到该点连接的第一个结点
    
    while(p!=NULL)
    {
        VertexType next=p->adjvex;
        if(visit[next]==0)DFS_G(G, next);
        p=p->nextArc;
    }
}


int traverse_G(ALGraph G)
{
    int sum=0;
    for(int i=1;i<=G.vexnum;i++)
    {
        if(visit[i]==0)
        {
            DFS_G(G,i);
            sum++;
            printf("\n");
        }
        
    }
    return  sum; //返回连通分量的个数
}

在这里插入图片描述

2017年

1. C语言算法设计部分

在这里插入图片描述

第一题:

void printfMultiTable()
{
    for(int i=1;i<=9;i++)
    {
        for(int j=1;j<=i;j++)
        {
            printf("%d*%d=%d ",i,j,i*j);
        }
        printf("\n");     
    }
}

在这里插入图片描述

第二题:

思路为:判断回文,通过取余将每个数存储到数组中,然后双指针判断是否为回文数。
完数电判断就是按照定义,找到每个因子加和计算即可。

不存在既是回文数又是完数的数,这道题emm,代码略

第三题:

新颖的点在于要求了动态链表存储学生成绩

struct Student
{
    int studentID; //学号
    float score;
    struct Student *next;
};

void init_student(int ID,float score,struct Student *&head)
{
    struct Student *p=(struct Student *)malloc(sizeof(struct Student)); //定义一个新结点
    p->studentID=ID;
    p->score=score;
    p->next=head->next;
    
    head->next=p;
}

void function_num(struct Student *head)  //统计结果
{
    struct Student *p=head->next;
    int s60=0;
    int s70=0;
    int s80=0;
    int s90=0;

    while(p!=NULL)
    {
        
        if(p->score>=90&&p->score<=100)
        {
            s90++;
        }else if(p->score>=80)
        {
            s80++;
        }else if(p->score>=70)
        {
            s70++;
        }else
        {
            s60++;
        }
        p=p->next;
    }
   
    printf("90-100分段有%d人\n",s90);
    printf("80-89分段有%d人\n",s80);
    printf("70-79分段有%d人\n",s70);
    printf("60-69分段有%d人\n",s60);
    
}
int main()
{
    struct Student *head=NULL;
    head=(struct Student *)malloc(sizeof(struct Student)); //头指针的初始化
   
    while(1)
    {
        int ID;
        float score;
        scanf("%d",&ID);
        if(ID==0) break;
        scanf("%f",&score);
         init_student(ID, score, head); 
    }
    function_num(head);
}

在这里插入图片描述

2.数据结构算法设计部分

在这里插入图片描述

问题1:略

问题2:

回顾:
结点的度:指该结点的分支个数,如结点A的度为2
树的度:指树中最大的结点度数,如该树的度为3

//统计一个结点的左孩子连同左孩子的右孩子的最大数量
int getDegree(CSTree T)
{
    if(T==NULL) return 0;
    else{
        int maxDegree=0;
        int degree=0;  //根节点的度
        
        for(CSTNode *pchild=T->fristChild;pchild!=NULL;pchild=pchild->nextSibling) 
        {
            degree++;  //for循环执行4次,degree最终为4
           int subdegree=getDegree(pchild); //subdergg本质还是degree是子函数返回的degree
            if(subdegree>maxDegree)maxDegree=subdegree;
        }
        return degree>maxDegree?degree:maxDegree;
    }
}

问题三:

//邻接表的插入操作(头插法)
void insert(VertexType v,VertexType w,ALGraph &rG)
{
    ArcNode *p=(ArcNode *)malloc(sizeof(ArcNode));
    p->adjvex=w;
    p->nextArc=rG.vertices[v].firstArc;
    rG.vertices[v].firstArc=p;
}

void reverse(ALGraph &G,ALGraph &rG)
{
    // 第一步,将G的头结点,赋给rG的头结点
    for(int i=1;i<=G.vexnum;i++)
    {
        rG.vertices[i].data=G.vertices[i].data;
        rG.vertices[i].firstArc=NULL;
    }
    //第二步 将v,w以w,v形式插入到rg中,以分配新的存储空间的形式插入
    for(int i=1;i<=G.vexnum;i++)
    {
        ArcNode *p=G.vertices[i].firstArc;
        VertexType v=G.vertices[i].data;
        while(p!=NULL)
        {
            VertexType w=p->adjvex;
            insert(w,v,rG);
            p=p->nextArc;
        }
    }
    //第三步,将点的数量,弧的数量赋值给rG
    rG.vexnum=G.vexnum;
    rG.arcnum=G.arcnum;
   
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android 15 推出新安全功能以保护敏感数据

Android 15 带来了增强的安全功能&#xff0c;可保护您的敏感健康、财务和个人数据免遭盗窃和欺诈。 它还为大屏幕设备带来了生产力改进&#xff0c;并对相机、消息和密钥等应用进行了更新。 Android 防盗保护 Google 开发并严格测试了一套全面的功能&#xff0c;以在盗窃之…

Ubuntu22.04 制作系统ISO镜像

第一步&#xff1a;安装软件-Systemback 1.如果已经添加过ppa&#xff0c;可以删除重新添加或者跳过此步 sudo add-apt-repository --remove ppa:nemh/systemback 2.添加ppa 我是ubuntu20&#xff0c;但这个软件最后支持的是 ubuntu16.04版本&#xff0c;所以加一个16版本…

【Docker】Harbor 私有仓库和管理

目录 一、搭建本地私有仓库 二、harbor简介&#xff08;特性、构成、架构的数据流向&#xff09; 2.1 什么是Harbor 2.2 Harbor的特性 2.3 Harbor的构成 2.4 Harbor的工作原理&#xff08;运行流程&#xff09; 三、harbor部署以及配置文件 1. 部署 Docker-Compose 服…

2010年国赛高教杯数学建模B题上海世博会影响力的定量评估解题全过程文档及程序

2010年国赛高教杯数学建模 B题 上海世博会影响力的定量评估 2010年上海世博会是首次在中国举办的世界博览会。从1851年伦敦的“万国工业博览会”开始&#xff0c;世博会正日益成为各国人民交流历史文化、展示科技成果、体现合作精神、展望未来发展等的重要舞台。请你们选择感兴…

Hadoop生态圈三大组件:HDFS的读写流程、MapReduce计算流程、Yarn资源调度

文章目录 1. HDFS的读写流程1.1 HDFS读流程1.2 HDFS写流程 2. MapReduce计算流程3. Yarn资源调度一、客户端请求资源二、Resource Manager处理请求三、任务资源计算与申请四、Resource Manager分配资源五、Node Manager执行任务六、任务执行与监控 1. HDFS的读写流程 1.1 HDFS…

C++ 中的友元(Friend)用法详解

什么是友元&#xff08;Friend&#xff09;&#xff1f;&#x1f46d; 友元 (C) | Microsoft Learn 在C中&#xff0c;友元&#xff08;Friend&#xff09;是一种机制&#xff0c;允许外部函数或类访问某个类的私有&#xff08;private&#xff09;或保护&#xff08;protecte…

[Unity Demo]从零开始制作空洞骑士Hollow Knight第十五集:制作更多地图,更多敌人,更多可交互对象

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、第一个代表性场景 1.制作更多敌人2.制作更多可交互对象二、第二个代表性场景 1.制作更多敌人2.制作更多可交互对象三、第三个代表性场景 1.制作更多敌人2.制…

【计算机网络 - 基础问题】每日 3 题(五十二)

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞…

Solr5.5.0单机部署

Solr5.5.0集成Tomcat8部署 1、 准备条件 JDK1.7以上 Solr5.5.0部署包&#xff08;solr-5.5.0.zip&#xff09; Tomcat8部署包 &#xff08;apache-tomcat-8.5.16.tar.gz&#xff09; 上传Solr5.5.0和tomcat8 部署包并解压使用 2、准备部署 将./solr-5.5.0/server/solr-we…

SPI的学习

工作原理 SPI的工作原理基于主从架构。主设备通过四条主要信号线与一个或多个从设备进行通信&#xff1a; MOSI&#xff08;主输出&#xff0c;从输入&#xff09;DI&#xff08;Master Output Slave Input&#xff09;&#xff1a;主设备发送数据到从设备。MISO&#xff08;…

MySQL 回收表碎片实践教程

前言&#xff1a; 在 MySQL 数据库中&#xff0c;随着数据的增删改操作&#xff0c;表空间可能会出现碎片化&#xff0c;这不仅会占用额外的存储空间&#xff0c;还可能降低表的扫描效率&#xff0c;特别是一些大表&#xff0c;在进行数据清理后会产生大量的碎片。本篇文章我们…

MAC电脑的JDK、MAVEN配置及IDEA激活

1、JDK配置环境 vim ~/.bash_profile # 添加 Java 目录&#xff0c;类路径和指令路径的配置&#xff0c;若已存在则用目标值覆盖 export JAVA_HOME/Library/Java/JavaVirtualMachines/jdk1.8.0_311.jdk/Contents/Home export CLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/…

Oracle单实例静默安装

oracle 11g单实例静默安装 在CentOS上静默安装Oracle数据库 引言 在企业环境中&#xff0c;自动化和标准化是提高效率的关键。静默安装&#xff08;也称为无人值守安装&#xff09;是一种无需人工干预的安装方法&#xff0c;适用于大规模部署或需要重复安装的场景。本文将介…

【KEIL那些事 4】CMSIS缺失!!!!导致不能编译!!!!软件自带芯片下载缓慢!!!!!!快速下载芯片包!!!!!

安装了keli发现emmm&#xff0c;CMSIS缺失&#xff01;&#xff01;&#xff01;&#xff01;不能编译&#xff0c;&#xff0c;&#xff0c;自带下载芯片缓慢&#xff0c;&#xff0c;&#xff0c;官网下载emmm&#xff0c;竟然不带动的&#xff01;&#xff01;&#xff01;&…

MySQL根据.idb数据恢复脚本,做成了EXE可执行文件

文章目录 1.代码2.Main方法打包3.Jar包打成exe可执行文件4.使用&#xff08;1.&#xff09;准备一个表结构一样得数据库&#xff08;2.&#xff09;打开软件&#xff08;3.&#xff09;输入路径 5.恢复成功 本文档只是为了留档方便以后工作运维&#xff0c;或者给同事分享文档内…

查看Chrome安装路

谷歌Google浏览器查看安装路径&#xff0c;浏览器Google Chrome浏览器查看安装路径 chrome://version/ 来源&#xff1a;笔记云

(数据结构)单链表——C语言

目录 1 概念与结构 1.1 结点 1.2 链表的性质 2 实现单链表 2.1打印SLPrint 2.2申请一个结点SLBuyNode 2.3尾插SLPushBack 2.4头插SLPushfront 2.5尾删SLPopBack 2.6头删SLPopfront 2.7查找结点位置SLFindNode 2.8在pos位置插入SLInsert 2.9在pos节点之后插入SLInse…

2024HarmonyOS应用开发者高级认证 最新题库第二部分

单选题 1.以下哪个装饰器用来表示并发共享对象。&#xff08;D&#xff09; AShared BState CStyle DSendable 2.hiAppEvent提供的Watcher接口&#xff0c;需要订阅到OS的崩溃事件&#xff0c;正确的实现方式(选下面这个) hiAppEvent.addWatcher({ name:"watcher&…

探索网页组件化:原生JavaScript动态加载HTML与iframe的使用与比较

在网页设计中&#xff0c;将内容作为组件动态加载到页面上是一种提高用户体验和页面性能的有效手段。本文将详细介绍两种实现动态内容加载的方法&#xff1a;使用原生JavaScript动态加载HTML和使用iframe&#xff0c;并对比它们的使用方式和优缺点。 原生JavaScript动态加载HTM…

[论文笔记]HERMES 3 TECHNICAL REPORT

引言 今天带来论文HERMES 3 TECHNICAL REPORT&#xff0c;这篇论文提出了一个强大的工具调用模型&#xff0c;包含了训练方案介绍。同时提出了一个函数调用标准。 为了简单&#xff0c;下文中以翻译的口吻记录&#xff0c;比如替换"作者"为"我们"。 聊天模…