【趣学C语言和数据结构100例】36-40

简介: 《趣学C语言和数据结构100例》精选5个编程问题及其实现,涵盖字符串处理、递归算法、数组操作与数据转换。包括找出最长单词、计算勒让德多项式值、处理学生成绩、十六进制转十进制及整数转字符串。这些问题不仅锻炼编程技巧,还加深对数据结构和算法的理解,适合初学者和开发者提升技能。

【趣学C语言和数据结构100例】

问题描述

  1. 写一个函数,输入一行字符,将此字符串中最长的单词输出。

  2. 用递归方法求 n 阶勒让德多项式的值

  3. 输入 10 个学生 5 门课的成绩,分别用函数实现下列功能 1. 计算每个学生的平均分; 2. 计算每门课的平均分; 3. 找出所有 50 个分数中最高的分数所对应的学生和课程; 4. 计算平均分方差;

  4. 一个函数,输入一个十六进制数,输出相应的十进制数

  5. 用递归法将一个整数 n 转换成字符串。例如,输入 483,应输出字符串“483”。n 的位数不确定,可以是任意位数的整数。

    代码分析

    ==36.找到最长的单词==
    分析:使用gets得到一行字符str,定义一个空的数组存储最长的单词。定义一个函数loogestword(line,word);在进入函数,定义一个for循环,==每次遇到空格,将它赋值为\0==,得到当前p(p刚开始指向头部,每次赋值\0,以后都继续移动到新的位置,即==p=原字符头部+移动i次+1==;)的长度,如果长度>最大长度,则更新最大长度,并使用strcpy(word,p)复制函数到存储中。

==37.递归方法求 n 阶勒让德多项式的值==
分析:输入2个参数x和n,由于是浮点型,所以使用scanf("%lf",&x);使用递归pnx函数,递归的结束条件为n= =0时为1,n==1时为x,递归体为result=(2n-1)xpnx(n-1,x)-(n-1)pnx(n-2,x)/n;

==38.数组即函数的使用==
分析:本题先采用数组的形式解答。使用二维数组,存储数据。分别使用函数计算每个学生的平均分,每门课的平均分等即可。

==39.十六进制转十进制数==
使用gets输入十六进制数,使用函数来处理转换。使用for循环遍历,如果在0-9,则s[i]=s[i]-'0'; (得到数值)n=n16+s[i];,如果在a-f或A-F,则s[i]=s[i]-'a'+10; (得到数值)n=n16+s[i];,得到十进制数结果

==40.递归输出和整数转字符串==
分析:先输入整数。如果为负数,即<0,则先输出一个putchar(-);并且是n=-n;然后使用函数继续递归输出,如果(i=n/10) !=0,即一直取到它的第一位,开始输出。剩下的在使用n%10+'0'得到字符串输出。putchar为输出一个字符串。

代码实现

#include <stdio.h>
#include <string.h> 
#define N 10
#define M 5

void loogestword(char str[],char word[]){
   
    int max_len=0;
    int len=0;
    char *p = str; 
    for(int i=0;str[i]!='\0';i++){
   
        if(str[i]==' '){
   
            str[i] ='\0';
            len=strlen(p);
            if(len>max_len){
   
                max_len=len;
                strcpy(word,p);
            }
            p=str+i+1;
        }
    }
    len = strlen(p);
    if (len > max_len) {
   
        max_len = len;
        strcpy(word, p);
    }
} 

double pnx(float n,float x){
   
    float result;
    if(n==0){
   
        result=1;
    }
    if(n==1){
   
        result=x;
    }
    if(n>1){
   
        result=(2*n-1)*x*pnx(n-1,x)-(n-1)*pnx(n-2,x)/n;
    }
    return result;
}

float score[N][M];
float a_stv[N],a_covr[M];
int r,c;

void input_stu(){
   
    for(int i=0;i<N;i++){
   
        printf("输入第%d个学生的成绩:\n",i+1);
        for(int j=0;j<M;j++){
   
            scanf("%f",&score[i][j]);
        }
    }
}

void aver_stu(){
   
    for(int i=0;i<N;i++){
   
        float sum=0;
        for(int j=0;j<M;j++){
   
            sum += score[i][j];
        }
        sum /= M;
        printf("第%d个学生的平均分: %f\n",i+1,sum);
    }
}

void aver_cver(){
   
    for(int j=0;j<M;j++){
   
        float sum=0;
        for(int i=0;i<N;i++){
   
            sum += score[i][j];
        }
        sum /= N;
        printf("第%d门课的平均分: %f\n",j+1,sum);
    }
}

float higst(){
   
    float high=0;
    for(int j=0;j<M;j++){
   
        for(int i=0;i<N;i++){
   
            if(score[i][j]>high){
   
                high=score[i][j];
                r=i;
                c=j;
            }
        }    
    }
    return high;
}

float s_dor(){
   
    float sumx=0,sumxn=0;
    for(int i=0;i<N;i++){
   
        sumx += a_stv[i]*a_stv[i];
        sumxn += a_stv[i];
    }
    return sumx/N-(sumxn/N)*(sumxn/N);
}

int func(char s[]){
   
    int n=0;
    for(int i=0;s[i]!='\0';i++){
   
        if(s[i]>='0' && s[i]<='9'){
   
            s[i]=s[i]-'0';
            n=n*16+s[i];
        }
        if(s[i]>='A' && s[i]<='F'){
   
            s[i]=s[i]-'A'+10;
            n=n*16+s[i];
        }
        if(s[i]>='a' && s[i]<='f'){
   
            s[i]=s[i]-'f'+10;
            n=n*16+s[i];
        }

    }
    return n;
}

void zhuanhuan(int n){
   
    int i;
    if((i=n/10) !=0){
   
        zhuanhuan(i);
    }
    putchar(n%10+'0');
}

int main()
{
   
//    36.写一个函数,输入一行字符,将此字符串中最长的单词输出。
    char line[100]={
   0},word[100]={
   0};
    printf("请输入一行字符:");
    gets(line);
    loogestword(line,word);
    printf("输出最长的单词:%s",word);

//37.用递归方法求n阶勒让德多项式的值,递归公式为
    double x,n;
    printf("输入x和n的值(格式n x):");
    scanf("%lf %lf",&n,&x);
    printf("勒让德多项式的值:%f",pnx(n,x));

//    38.输人 10 个学生5 门课的成绩,分别用函数实现下列功能
//    1.计算每个学生的平均分;
//    2.计算每门课的平均分;
//    3.找出所有 50 个分数中最高的分数所对应的学生和课程;
//    4.计算平均分方差;
    input_stu();
    aver_stu();
    aver_cver();
    float highest = higst();
    printf("最高分: %f, 学生: %d, 课程: %d\n",highest,r+1,c+1);
    aver_stu();
    for(int i=0;i<N;i++){
   
        float sum=0;
        for(int j=0;j<M;j++){
   
            sum += score[i][j];
        }
        a_stv[i]=sum/M;
    }
    printf("平均分方差: %f\n",s_dor());

//    39.一个函数,输人一个十六进制数,输出相应的十进制数
    char s[9]={
   0};
    int result;
    printf("输入一个十六进制数:");
    gets(s);
    result=func(s);
    printf("十六进制数:%s,相应的十进制数:%d",s,result);

//    40.用递归法将一个整数n转换成字符串。例如,输人 483,应输出字符串”483”。n 的位数不确定,可以是任意位数的整数。
    int n;
    printf("输入一个整数n:");
    scanf("%d",&n);
    if(n<0){
   
        putchar('-');
        n=-n; 
    }
    zhuanhuan(n);

    return 0;
}

总结

本文介绍了五个编程问题及其C语言实现,这些问题涵盖了字符串处理、递归算法、数组操作和数据转换等多个领域。这些算法问题不仅锻炼了我们的编程能力,也加深了对数据结构和算法的理解。

最长单词输出问题要求我们从一行字符中找出最长的单词。这个问题的解决关键在于使用字符串操作函数,通过遍历输入的字符串并使用空格作为单词的分隔符,找出最长的单词。

递归求勒让德多项式的值问题展示了递归算法在数学问题中的应用。通过递归公式,我们可以计算出任意阶数的勒让德多项式的值。

学生成绩处理问题要求我们处理10个学生5门课的成绩,并实现计算平均分、找出最高分等功能。这个问题涉及到数组和函数的使用,通过二维数组存储成绩数据,并使用函数实现不同的计算功能。

十六进制转十进制问题要求我们将输入的十六进制数转换为十进制数。这个问题的解决需要我们了解不同进制数的转换方法,并通过遍历输入的十六进制数字符串,将其转换为对应的十进制数。

整数转字符串问题展示了递归算法在数据转换中的应用。通过递归函数,我们可以将任意位数的整数转换为字符串形式。

这些算法的实现不仅展示了C语言在处理字符串、数组和递归时的能力,也体现了算法设计的基本思想,如条件判断、循环控制和递归。通过这些算法的学习,我们可以更好地理解数据结构和算法的基本概念,提高解决实际问题的能力。

总的来说,这些算法问题不仅锻炼了编程能力,也加深了对数据结构和算法的理解。通过这些问题的解决,我们可以逐步提高自己的编程技能,为将来的学习和工作做好准备。这些算法的掌握对于计算机专业的学生和软件开发人员来说都是非常重要的。通过这些练习,我们可以逐步提高自己的编程技能,为将来的学习和工作做好准备。同时,这些问题的解决也体现了算法在处理数据时的灵活性和效率,为我们在实际开发中遇到类似问题提供了解决思路。

相关文章
|
10天前
|
存储 人工智能 弹性计算
阿里云弹性计算_加速计算专场精华概览 | 2024云栖大会回顾
2024年9月19-21日,2024云栖大会在杭州云栖小镇举行,阿里云智能集团资深技术专家、异构计算产品技术负责人王超等多位产品、技术专家,共同带来了题为《AI Infra的前沿技术与应用实践》的专场session。本次专场重点介绍了阿里云AI Infra 产品架构与技术能力,及用户如何使用阿里云灵骏产品进行AI大模型开发、训练和应用。围绕当下大模型训练和推理的技术难点,专家们分享了如何在阿里云上实现稳定、高效、经济的大模型训练,并通过多个客户案例展示了云上大模型训练的显著优势。
|
14天前
|
存储 人工智能 调度
阿里云吴结生:高性能计算持续创新,响应数据+AI时代的多元化负载需求
在数字化转型的大潮中,每家公司都在积极探索如何利用数据驱动业务增长,而AI技术的快速发展更是加速了这一进程。
|
5天前
|
并行计算 前端开发 物联网
全网首发!真·从0到1!万字长文带你入门Qwen2.5-Coder——介绍、体验、本地部署及简单微调
2024年11月12日,阿里云通义大模型团队正式开源通义千问代码模型全系列,包括6款Qwen2.5-Coder模型,每个规模包含Base和Instruct两个版本。其中32B尺寸的旗舰代码模型在多项基准评测中取得开源最佳成绩,成为全球最强开源代码模型,多项关键能力超越GPT-4o。Qwen2.5-Coder具备强大、多样和实用等优点,通过持续训练,结合源代码、文本代码混合数据及合成数据,显著提升了代码生成、推理和修复等核心任务的性能。此外,该模型还支持多种编程语言,并在人类偏好对齐方面表现出色。本文为周周的奇妙编程原创,阿里云社区首发,未经同意不得转载。
|
11天前
|
人工智能 运维 双11
2024阿里云双十一云资源购买指南(纯客观,无广)
2024年双十一,阿里云推出多项重磅优惠,特别针对新迁入云的企业和初创公司提供丰厚补贴。其中,36元一年的轻量应用服务器、1.95元/小时的16核60GB A10卡以及1元购域名等产品尤为值得关注。这些产品不仅价格亲民,还提供了丰富的功能和服务,非常适合个人开发者、学生及中小企业快速上手和部署应用。
|
6天前
|
人工智能 自然语言处理 前端开发
用通义灵码,从 0 开始打造一个完整APP,无需编程经验就可以完成
通义灵码携手科技博主@玺哥超carry 打造全网第一个完整的、面向普通人的自然语言编程教程。完全使用 AI,再配合简单易懂的方法,只要你会打字,就能真正做出一个完整的应用。本教程完全免费,而且为大家准备了 100 个降噪蓝牙耳机,送给前 100 个完成的粉丝。获奖的方式非常简单,只要你跟着教程完成第一课的内容就能获得。
|
21天前
|
自然语言处理 数据可视化 前端开发
从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
合合信息的智能文档处理“百宝箱”涵盖文档解析、向量化模型、测评工具等,解决了复杂文档解析、大模型问答幻觉、文档解析效果评估、知识库搭建、多语言文档翻译等问题。通过可视化解析工具 TextIn ParseX、向量化模型 acge-embedding 和文档解析测评工具 markdown_tester,百宝箱提升了文档处理的效率和精确度,适用于多种文档格式和语言环境,助力企业实现高效的信息管理和业务支持。
3960 5
从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
|
10天前
|
算法 安全 网络安全
阿里云SSL证书双11精选,WoSign SSL国产证书优惠
2024阿里云11.11金秋云创季活动火热进行中,活动月期间(2024年11月01日至11月30日)通过折扣、叠加优惠券等多种方式,阿里云WoSign SSL证书实现优惠价格新低,DV SSL证书220元/年起,助力中小企业轻松实现HTTPS加密,保障数据传输安全。
533 3
阿里云SSL证书双11精选,WoSign SSL国产证书优惠
|
9天前
|
数据采集 人工智能 API
Qwen2.5-Coder深夜开源炸场,Prompt编程的时代来了!
通义千问团队开源「强大」、「多样」、「实用」的 Qwen2.5-Coder 全系列,致力于持续推动 Open Code LLMs 的发展。
|
17天前
|
安全 数据建模 网络安全
2024阿里云双11,WoSign SSL证书优惠券使用攻略
2024阿里云“11.11金秋云创季”活动主会场,阿里云用户通过完成个人或企业实名认证,可以领取不同额度的满减优惠券,叠加折扣优惠。用户购买WoSign SSL证书,如何叠加才能更加优惠呢?
998 3
|
14天前
|
机器学习/深度学习 存储 人工智能
白话文讲解大模型| Attention is all you need
本文档旨在详细阐述当前主流的大模型技术架构如Transformer架构。我们将从技术概述、架构介绍到具体模型实现等多个角度进行讲解。通过本文档,我们期望为读者提供一个全面的理解,帮助大家掌握大模型的工作原理,增强与客户沟通的技术基础。本文档适合对大模型感兴趣的人员阅读。
453 18
白话文讲解大模型| Attention is all you need