请教一道C语言程序设计


/*----------------------------------------------------------------------
【程序设计】
------------------------------------------------------------------------
题目:程序将由数字字符组成的字符串转换为10进制实数,
      例如将"123.4567"转换为123.45670。

      程序运行如样张所示。
-----------------------------------------------------------------------
注意:请勿改动程序中的其他部分。
---------------------------------------------------------------------*/
#include<stdio.h>
#include<ctype.h>
double conver(char s[]){
    int I,i,poi;
    double F,p;
    F=I=i=poi=0;
    p=0.1; 
    /**********Program**********/
    while(s[i])
    {
        if(s[i]=='.')
            poi=1;
        else if(isdigit(s[i])){
            if(poi==0)
                I=I*10+s[i]-'0';
            else{
                F+=p*(s[i]-'0');
                p=p*0.1;
            }
        }
        i++;
    }


    /**********  End  **********/
    return I+F;
}
int main()
{
    char d[3][15]={"123.4567","0.12345","4567.0"};
    int i;
    for(i=0;i<3;i++)
        printf("%12.5f\n",conver(d[i]));
    return 0;
}

解释如下:

 
/*----------------------------------------------------------------------
【程序设计】
------------------------------------------------------------------------
题目:程序将由数字字符组成的字符串转换为10进制实数,
      例如将"123.4567"转换为123.45670。
      程序运行如样张所示。
-----------------------------------------------------------------------
注意:请勿改动程序中的其他部分。
---------------------------------------------------------------------*/
#include<stdio.h>
#include<ctype.h>
double conver(char s[]){
    int I,i,poi;
    double F,p;
    F=I=i=poi=0;
    p=0.1; 
    /**********Program**********/
    while(s[i]) // 取 s数组中 第i个元素
    {
        if(s[i]=='.') // 如果是 小数点,则poi 标记为1
            poi=1;
        else if(isdigit(s[i])){ // 如果是数字
            if(poi==0) // 还没取到小数点,这里读取到的数字都是整数部分
                I=I*10+s[i]-'0'; // 计算整数部分值,并累加
            else{ // 取到小数点了,这里读取的数字是小数部分
                F+=p*(s[i]-'0'); // 按小数部分累加,【s[i] - '0'  得到 数字字符 对应的 整数】
                p=p*0.1; 
            }
        }
        i++; // 继续下一个字符判断
    }
 
 
    /**********  End  **********/
    return I+F;
}
int main()
{
    char d[3][15]={"123.4567","0.12345","4567.0"};
    int i;
    for(i=0;i<3;i++)
        printf("%12.5f\n",conver(d[i]));
    return 0;
}


  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7446411
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:一道C语言字符串拷贝找错题
  • 同时,你还可以查看手册:c语言-成员访问与间接 中的内容
  • 除此之外, 这篇博客: 移棋问题 C语言版中的 结果图 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 编辑环境:sources insight
    运行环境:gcc
    在这里插入图片描述
    如果需要坐标的方式也可以,注释掉的代码就是坐标移动,将其取消注释,然后稍微改一下就可以了,实现图
    在这里插入图片描述

  • 您还可以看一下 徐家乾老师的极简C语言入门课程课程中的 解决实际问题的程序设计方法小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    针对学习C语言的问题,推荐以下练习题目和相关资料:

    1. 《C Primer Plus》这本书有很多练习题和代码实例,适合初学者和进阶者。

    2. 《算法竞赛入门经典:训练指南》这本书虽然是算法题精选,但是C语言是其最主要的编程语言,适合想要进阶的学习者。

    3. LeetCode是一个国际化的在线算法编程平台,不仅提供了许多高质量的算法题目,而且免费,适合有一定编程基础的学习者。

    针对每一个题目的具体解决方案,需要根据实际情况进行分析和实现。在编写代码时,需要注意以下几点:

    1. 指针问题。C语言中指针操作非常灵活,但是也容易出现内存泄漏等问题,需要特别注意。

    2. 数组问题。C语言中数组名和数组首元素的地址一样,但是需要注意数组下标越界的问题,否则会出现严重的内存错误。

    3. 函数问题。C语言中函数和模块之间可以乱调用,容易出现维护难度大的问题,需要遵循开发框架和编码规范。

    具体的解决方案需要根据具体的问题进行分析和实现,需要具备坚持的力度和实践的耐心。