欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【C#初学】2/Π近似值/进制转换/数组最大值/字符串取数

程序员文章站 2022-04-04 20:03:55
...

【C#初学】2/Π近似值/进制转换/数组最大值/字符串取数

记录一下初学C#写作业时遇见的一些点和思路过程。
IDE为Visual Studio 2019。

1.求Π/2的近似值公式为:

Π/2=2/1*2/3*4/3*4/5**2n/(2n-1)*2n/(2n+1)*…其中,n=1,2,3,…。

设计一个程序,求出当n=1000时Π的近似值。

纯数学题就以纯数学思路,已知Π/2=…2n/(2n-1)*2n/(2n+1);
那么就设a=2n,b=2n-1,c=2n+1,P=Π/2;
就有P=…a/b * a/c;
代码如下:

using System;

namespace work1
{
    class Program
    {
        static void Main(string[] args)
        {
                int n = 1000;
                double p;
                double P = 1d;
                double a, b, c;
                for (int i = 1; i <= n; i++)
                {
                    a = 2 * i;//2n
                    b = a - 1;//2n-1
                    c = a + 1;//2n+1
                    P *= a / b * a / c;//Π/2=2/1*...*2n/(2n-1)*2n/(2n+1)
                }
                p = P * 2;//Π=Π/2*2
                Console.WriteLine("Π近似{0}",p);
        }
    }
}

结果为:
【C#初学】2/Π近似值/进制转换/数组最大值/字符串取数

2.设计一个程序,输入一个十进制数,输出相应的十六进制数。

先来看看十进制数如何转为十六进制数:
【C#初学】2/Π近似值/进制转换/数组最大值/字符串取数

所以十进制数154的十六进制为9A
可见要转十六进制要不断的用商除十六后取余直到商为0为止
代码如下:

using System;
using System.Collections;

namespace WORK
{
    class Program
    {
        static void Main(string[] args)
        {
            string str = Console.ReadLine();//以字符串输入10进制数
            int d = Convert.ToInt32(str);//将字符串转换int类型赋给d
            ArrayList n = new ArrayList();//定义一个动态数组
            while (d != 0)
            {
                int x = d % 16;//转16进制
                if (x - 10 >= 0)//大于10转字母
                {
                    char c = (char)('A' + x - 10);
                    n.Insert(0, c);//将字符c插入数组第0位
                }
                else//小于10是本身
                {
                    n.Insert(0, x);
                }
                d = d / 16;            
            }
            for (int i = 0; i < n.Count; i++)//n. Count是n数组中项的个数
            {
                Console.Write(n[i]);
            }
        }
    }
}

下面记一下代码中用到的一些方法/类:
第一点:

ArrayList

ArrayList是一个在System.Collections 命名空间的类,其作用是可以定义一个大小可按需动态增加的数组。
其优点是可以动态的增加和减少元素并且灵活的设置数组的大小。
其简单的使用方法:

ArrayList List = new ArrayList();//定义一个动态数组List
for( int i=0;i<10;i++ ) 
List.Add(i);//给数组依次增加一个元素,每次放到数组末尾
List.RemoveAt(5);//移除数组第六个元素
List.Insert(0,i);//添加一个新元素到指定位置,此处添加i到数组第0位,之前的数依次后移
List.Count;//数组包含的元素的数量,这个属性是只读的。

第二点:

Convert.ToInt32()

Convert.ToInt可以将某些数据类型转换成int类型
有三种方法:

Convert.ToInt16()
Convert.ToInt32()
Convert.ToInt64()
其区别在于范围不同,按需使用就行。

其简单的使用方法:

string str = "154";
int numInt32= Convert.ToInt32(str);//将字符串str转换成int32类型

重点来了:

在.NET Framework中,System.Convert 类中提供了较为全面的各种类型、数值之间的转换功能。其中的两个方法可以轻松的实现各种进制的数值间的转换

方法一:
Convert.ToInt32(string value, int fromBase);
可以把不同进制数值的字符串转换为数字(十进制);

其中:

value 参数->要进行转换的数值字符串
fromBase 参数->要转换成的进制格式,只能是2、8、10及16

具体实现:

Console.WriteLine(Convert.ToInt32("10011010", 2));//二进制数 10011010 转成十进制
Console.WriteLine(Convert.ToInt32("232", 8));//八进数 232 制转成十进制
Console.WriteLine(Convert.ToInt32("9A", 16));// 16进数 9A 制转换成十进制

结果为:
【C#初学】2/Π近似值/进制转换/数组最大值/字符串取数

方法二:
Convert.ToString(int value, int toBase);
可以把一个数字(十进制)转换为不同进制数值的字符串格式;

其中:

value 参数->要进行转换的数字(十进制数)
toBase参数->要转换成的进制格式,只能是2、8、10及16。

具体实现:

Convert.ToString(69, 2); //十进制数 69 转二进制

Convert.ToString(69, 8); //十进制数 69 转八进制

Convert.ToString(69, 16);//十进制数 69 转十六进制

结果为:
【C#初学】2/Π近似值/进制转换/数组最大值/字符串取数
那么这道题就可以用另一种方法来做:

using System;

namespace HelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {
            int d = int.Parse(Console.ReadLine());
            //输入十进制数d,利用Parse方法将字符串类型强制转换成int类型来输入
            Console.WriteLine(Convert.ToString(d, 16));
            //将输入的十进制数d转为16进制字符串;
        }
    }
}

结果为:
【C#初学】2/Π近似值/进制转换/数组最大值/字符串取数
顺带一记这里用到的Parse方法:

Parse 方法用于将字符串类型转换成任意类型

其简单的使用方式:

数据类型 变量 = 数据类型.Parse(字符串类型的值);
int d = int.Parse(Console.ReadLine());
ps:等号左、右两边的数据类型要兼容

因为C#中的输入方法:

Console.Read();//读取一个字符,不换行。
Console.ReadLine();//读取一个字符串,后换行。

都只能输入字符/字符串,所以要转换输入类型时,用Parse就会非常方便。
还有一种转换输入类型的方式,在最后一个题会讲。

3.找出数组a中最大值的下标,输出下标及其最大值。

这个题在C语言中有做过,具体思路不变:
先遍历数组把目前遇到的较大值赋给max,拿数组中每一个元素与max比较,比max大就把这个数再赋给max,直到max=最大值。然后找到max在数组中的下标,将其输出。
代码如下:

using System;

namespace work3
{
    class Program
    {
        static void Main(string[] args)
        {
			int[] a = new int[]{1,2,3,6,4,6,7,8,9};//定义一个数组a
			int max = 0;
			for (int i = 0;i < 9;i++)//遍历数组每一个数找出其最大值
			{
				if (a[i] > max)
				{
					max = a[i];//将最大值赋给max
				}
			}
			Console.WriteLine("最大值为{0}",max);
			for (int i = 0;i < 9; i++)//遍历数组找出最大值的下标
            {
				if(a[i] == max)
                {
					Console.WriteLine("其下标为{0}", i);
				}
            }
		}
    }
}

结果为:
【C#初学】2/Π近似值/进制转换/数组最大值/字符串取数

4.输入一个字符串,串内有数字和非数字字符,例如,abc2345 345fdf678 jdhfg945。将其中连续的数字作为一个整数,依次存放到另一个整型数组b中。如将2345存放到b[0],345放入b[1],678放入b[2],…统计出字符串中的整数个数,并输出这些整数。

这个题前半部分比较好实现,遍历字符串挑出其中的连续数字即可。
可如何将此时类型为string型的数字依次变成int型的整数?
又如何将其依次存放到另一个整型数组中?

这个问题我们全宿舍都想了好久,请教大佬,不断找有什么方法可以实现。
下面提供几种思路。
方法一:

using System;
using System.Collections.Generic;

namespace work4
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("请输入一个字符串:");
            string str = Console.ReadLine(); 
            List<int> number = new List<int>();//创建类型为int的数字集合
            int temp = 0;
            for(int i = 0; i < str.Length; i++)//遍历整个字符串
            {
                if(str[i] >= '0' && str[i] <= '9')//挑出数字
                {
                    temp += str[i] - '0';//将连续的数字作为一个整数
                    if(i == str.Length  - 1)
                    {
                        number.Add(temp);//将符合条件的对象添加到已有List集合中的末尾
                    }
                    else if(str[i+1] < '0' || str[i+1] > '9')//挑出字符
                    {
                        number.Add(temp);
                        temp = 0;//遇见字符,连续的数字中断,整数清0
                    }
                    else
                    {
                        temp *= 10; //进位
                    }
                }
            }
            int[] b = number.ToArray();//将集合转为数组
            int count = 0;//记录数组中元素个数,即字符串中的整数个数
            foreach (var n in b)
            {
                Console.WriteLine(n);//输出这些整数
                count++;  
            }
            Console.WriteLine(count);
        }
    }
}

结果为:
【C#初学】2/Π近似值/进制转换/数组最大值/字符串取数
这个方法中用到了System.Collections.Generic命名空间下面的List泛型集合

什么是集合?
集合是OOP中的一个重要概念,C#中对集合的全面支持更是该语言的精华之一。
上文中提到的ArrayList也可实现相似的功能
直接将对象放入ArrayList,操作直观,但由于其中的项是Object类型,因此每次使用都必须进行繁琐的类型转换。

那么什么是泛型?
泛型是C# 2.0中的新增元素(C++中称为模板),主要用于解决一系列类似的问题。这种机制允许将类名作为参数传递给泛型类型,并生成相应的对象。将泛型(包括类、接口、方法、委托等)看作模板可能更好理解,模板中的变体部分将被作为参数传进来的类名称所代替,从而得到一个新的类型定义。

其具体用法:

List<T> ListOFT = new List<T>();

其中的"T"就是所要使用的类型,既可以是简单类型,如string、int,也可以是用户自定义类型。ListOFT是集合名。

在本题中,用List定义了类型为int的数字集合number;
用在List中添加一个对象的公有方法Add( ) 把连续数字转成的整数压入集合;
再用ToArray( ) 把List内的元素拷贝到一个新的int型数组内;
用foreach()方法遍历新的数组中的每一个元素,记录元素的个数,并将其输出。
方法二:

using System;

namespace HelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("请输入一个字符串:");
            char[] c = Console.ReadLine().ToCharArray();//将输入的字符串转换为字符型赋到c数组中
            int[] b = new int[100];//定义一个整型数组
            int i = 0, count = 0;
            while (i < c.Length)
            {
                if (c[i] >= '0' && c[i] <= '9' && c[i + 1] >= '0' && c[i + 1] <= '9')//判断数字是否连续
                {
                    while (c[i] >= '0' && c[i] <= '9')//挑出数字
                    {
                        b[i] = b[i] * 10 + c[i] - '0';//将c里的字符型数字转为整型数字赋到整型数组b中
                        Console.Write(b[i]);
                        i++;
                        if (i == c.Length)//遍历完全部字符后终止
                        {
                            break;
                        }
                    }
                    Console.Write(" ");//连续数字之间用空格隔开
                    count++;//记录连续数字的个数
                }
                if (i < c.Length)//遍历整个字符串
                    i++;
            }
            Console.WriteLine();
            Console.WriteLine(count);
        }
    }
}

结果为:【C#初学】2/Π近似值/进制转换/数组最大值/字符串取数

这个方法中用到了ToCharArray( ),用来将字符串对象中的字符转换为一个字符数组。

字符串转换成字符数组后,每个字符的ASCII码与字符T的ASCII码进行二进制异或运算。最后把结果转换回字符。

这个方法中最重要的一点就是下面这行

 b[i] = b[i] * 10 + c[i] - '0';//将c里的字符型数字转为整型数字赋到整型数组b中

其中b[i]*10是进位的意思,方便把连续的数字变为一个(二位/三位/四位…)的一个整数;
c[i]- '0’则实现了将字符型数字转换为整型数字
原理如下:
【C#初学】2/Π近似值/进制转换/数组最大值/字符串取数
这个题还有用正则表达式剥离出所有的数字和用逗号替换所有非数字字符两种方式。有点难以理解,等我写全了贴上来。

END

相关标签: C# c#