| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1306 人关注过本帖
标题:无聊发个求一元二次方程的代码
取消只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
结帖率:100%
收藏
 问题点数:0 回复次数:6 
无聊发个求一元二次方程的代码
这是vc++/CLR代码,用vs的同学该知道怎么创建项目和编译,编译不了也没关系,代码干什么和怎么干的,一目了然,用自己的方法,也能照着做出同样的事。要移植为非托管代码的,自己写出类似的替代函数就可以了,因为需要划分的功能是一样的。

程序代码:
#include "stdafx.h"

using namespace System;

Double GetCoefficient(String^ tips);        // 交互获取方程系数

Int32 main(array<String^>^ args)
{
    Console::Title = L"一元二次方程的解";

    Console::Clear();
    Double coefficient_A, coefficient_B, coefficient_C;
    while ((coefficient_A = GetCoefficient(L"\n请输入二次项系数(输入零结束程序) A: ")) != 0)
    {
        coefficient_B = GetCoefficient(L"请输入一次项系数 B: ");
        coefficient_C = GetCoefficient(L"请输入常数项系数 C: ");
        Console::Clear();
        Console::WriteLine(L"您需要求解的方程是:{0} * x^2 + {1} * x + {2} = 0", coefficient_A, coefficient_B, coefficient_C);
        Double delta = coefficient_B * coefficient_B - 4 * coefficient_A * coefficient_C;
        if (delta == 0)
        {
            Double theUnknown = - coefficient_B / (2 * coefficient_A);
            Console::WriteLine(L"方程的根为: {0:F4}", theUnknown);
        }
        if (delta > 0)
        {
            Double theUnknown1, theUnknown2;
            theUnknown1 = (- coefficient_B + Math::Sqrt(delta)) / (2 * coefficient_A);
            theUnknown2 = (- coefficient_B - Math::Sqrt(delta)) / (2 * coefficient_A);
            Console::WriteLine(L"方程的根为: {0:F4}, {1:F4}", theUnknown1, theUnknown2);
        }
        if (delta < 0)
        {
            Console::WriteLine(L"方程没有实数根");
        }
    }

    return 0;
}

// 交互获取方程系数
Double GetCoefficient(String^ tips)
{
    Double returnValue;

    do
    {
        Console::Write(tips);
    } while (!Double::TryParse(Console::ReadLine(), returnValue));

    return returnValue;
}




[ 本帖最后由 TonyDeng 于 2014-12-12 23:51 编辑 ]
搜索更多相关主题的帖子: 干什么 color 项目 
2014-12-12 23:44
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用梦里云归在2014-12-14 12:36:38的发言:

才学C++,表示大多看不懂,还有编一个程序,函数名,变量什么的都要写的这么详细么?

是的,需要详细。

授人以渔,不授人以鱼。
2014-12-14 21:00
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用流浪诗人在2014-12-14 15:03:56的发言:

我也看不懂,括号里面的也都会翻译出来吗

什么括号、翻译?

授人以渔,不授人以鱼。
2014-12-14 21:00
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用梦里云归在2014-12-15 14:54:18的发言:

那不是很麻烦了?不是很多代码的程序,我都是力求简洁的,字母太多实在是难得打

不能说明自己是干什么和是什么的标识符,不叫简洁。

授人以渔,不授人以鱼。
2014-12-15 20:52
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
下面的对应的C#代码:

程序代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace test8
{
    class Program
    {
        static void Main(String[] args)
        {
            Console.Title = "一元二次方程的解";

            Console.Clear();
            Double coefficient_A, coefficient_B, coefficient_C;
            while ((coefficient_A = GetCoefficient("\n请输入二次项系数(输入零结束程序) A: ")) != 0)
            {
                coefficient_B = GetCoefficient("请输入一次项系数 B: ");
                coefficient_C = GetCoefficient("请输入常数项系数 C: ");
                Console.Clear();
                Console.WriteLine("您需要求解的方程是:{0} * x^2 + {1} * x + {2} = 0", coefficient_A, coefficient_B, coefficient_C);
                Double delta = coefficient_B * coefficient_B - 4 * coefficient_A * coefficient_C;
                if (delta == 0)
                {
                    Double theUnknown = - coefficient_B / (2 * coefficient_A);
                    Console.WriteLine("方程的根为: {0:F4}", theUnknown);
                }
                if (delta > 0)
                {
                    Double theUnknown1, theUnknown2;
                    theUnknown1 = (- coefficient_B + Math.Sqrt(delta)) / (2 * coefficient_A);
                    theUnknown2 = (- coefficient_B - Math.Sqrt(delta)) / (2 * coefficient_A);
                    Console.WriteLine("方程的根为: {0:F4}, {1:F4}", theUnknown1, theUnknown2);
                }
                if (delta < 0)
                {
                    Console.WriteLine("方程没有实数根");
                }
            }
        }

        // 交互获取方程系数
        static Double GetCoefficient(String tips)
        {
            Double returnValue;

            do
            {
                Console.Write(tips);
            } while (!Double.TryParse(Console.ReadLine(),out returnValue));

            return returnValue;
        }
    }
}



授人以渔,不授人以鱼。
2014-12-15 21:11
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
下面的对应的C代码:

程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>

double GetCoefficient(const char* tips);        // 交互获取方程系数

int main(int argc, char* argv[])
{
    double coefficient_A, coefficient_B, coefficient_C;
    while ((coefficient_A = GetCoefficient("\n请输入二次项系数(输入零结束程序) A: ")) != 0)
    {
        coefficient_B = GetCoefficient("请输入一次项系数 B: ");
        coefficient_C = GetCoefficient("请输入常数项系数 C: ");
        printf_s("您需要求解的方程是:%.4f * x^2 + %.4f * x + %.4f = 0\n", coefficient_A, coefficient_B, coefficient_C);
        double delta = coefficient_B * coefficient_B - 4 * coefficient_A * coefficient_C;
        if (delta == 0)
        {
            double theUnknown = - coefficient_B / (2 * coefficient_A);
            printf_s("方程的根为: %.4f\n", theUnknown);
        }
        if (delta > 0)
        {
            double theUnknown1, theUnknown2;
            theUnknown1 = (- coefficient_B + sqrt(delta)) / (2 * coefficient_A);
            theUnknown2 = (- coefficient_B - sqrt(delta)) / (2 * coefficient_A);
            printf_s("方程的根为: %.4f, %.4f", theUnknown1, theUnknown2);
        }
        if (delta < 0)
        {
            printf_s("方程没有实数根");
        }
    }

    return EXIT_SUCCESS;
}

// 交互获取方程系数
double GetCoefficient(const char* tips)
{
    double returnValue;

    do
    {
        printf_s(tips);
        fflush(stdin);
    } while (scanf_s("%lf", &returnValue) != 1);

    return returnValue;
}


补充:这个代码,变量的声明和定义位置在内部花括号内,原本是C++的语法,但C99吸纳了C++的若干语法,要求C编译器也支持这种语法,故这种代码只能在支持C99标准的C编译器上编译通过。微软的vc++是C++编译器,虽然可以被强制为C编译器使用(把源代码文件扩展名定为.c即可),不过这时它不支持C99,所以要让这类代码正常运行,请使用C++编译器,即把源代码文件扩展名定为.cpp。


[ 本帖最后由 TonyDeng 于 2014-12-15 22:40 编辑 ]

授人以渔,不授人以鱼。
2014-12-15 21:58
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
比较一下三个代码,实际上除了个别语法和某些函数的细微表现(scanf()和ReadLine()在运行时的表现有少许差别)不同,程序的思想和结构是完全一样的。懂任何一个,都能轻松转换到另一个;搞不通一个,全部都搞不通。

btw: 实际上test7和test8是同一个程序,当用软件反编译test7的可执行文件后,将得到和test8完全一样的结果,这两个程序在编译后是无差别的。


[ 本帖最后由 TonyDeng 于 2014-12-15 22:43 编辑 ]

授人以渔,不授人以鱼。
2014-12-15 22:09
快速回复:无聊发个求一元二次方程的代码
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015122 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved