• 【原创】C#初级教程学习笔记006-函数--End


     其他路径:

    CSDN: https://blog.csdn.net/wodehao0808

    微信公众号:程序喵星人

    更多资源和视频教程,QQ:1902686547

    6 函数

    6.1 函数的定义和使用

    函数也叫方法。

      函数的定义:

        <Access Specifier> <Return Type> <Method Name>(Parameter List)

        {

          Method Body

          return <returnValue>

        }

      以下是方法中的各种元素:

        访问说明符:它用于从一个类中确定一个变量或方法的可见性。

        返回类型:方法可能会返回一个值。返回类型是方法返回值的数据类型。如果该方法不返回任何值,那么返回类型是 void。

        方法名称:方法名称是唯一的标识符,并区分大小写。它不能与在类中声明的任何其他标识符相同。

        参数列表:括号括起来,使用参数从方法中传递和接收数据。参数列表是指类型、顺序和方法的参数数目。参数是可选的;方法可能包含任何参数。

        方法主体:它包含的一组指令完成所需要的活动所需。

        <returnValue>:如果返回类型<Return Type>为void,则可以不使用return;否则,需要时用return返回,并且<returnValue>的类型必须跟返回类型一致。

      

      在参数数目不确定时,使用关键字params声明一个数组来传递参数,叫做参数数组。

        例如:

          // 数组参数

          void Add(int[] array)

          {

            ...

          }

          Add(new int[] {1, 2, 3, 4}); // 调用函数时,实参是一个数组

          

          // 参数数组 // params关键字

          void Add2(params int[] array)

          {

            ...

          }

          Add2(1, 2, 3, 4, 5, 9, 6); // 调用函数时,实参是不确定数目的离散的值,params声明后,编译器会自动将这些参数合并成一个数组传递给函数。

          Add2(new int[] {1, 2, 3, 4}); // 当然也可以直接使用数组做实参调用。

    6.1.1 Example:函数的定义和使用

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;

    // 函数的定义和使用

    namespace Lesson_5_1

    {

        class Program

        {

            // 返回类型为void的函数

            static void Write()

            {

                Console.WriteLine("这是一个自定义的Write函数");

                // return; 这里return可以不加上

            }

            // 两个数相加

            static int Add(int p_iNum1, int p_iNum2)  // 定义方法时的参数,我们称之为形式参数(即形参)

            {

                return p_iNum1 + p_iNum2;  // 返回类型是int,这里必须使用return,且返回值是int类型的值

            }

            // 取得数字的所有因子,并返回所有因子

            static int[] getFactor(int p_iNum)

            {

                int iCount = 0;

                for (int i = 1; i <= p_iNum; ++i)

                {

                    if (p_iNum % i == 0)

                    {

                        ++iCount;

                    }

                }

                int[] arr = new int[iCount];

                int index = 0;

                for (int i = 1; i <= p_iNum; ++i)

                {

                    if (p_iNum % i == 0)

                    {

                        arr[index] = i;

                        ++index;

                    }

                }

                return arr;

            }

            // 获得数组中的最大的数,数组参数

            static int getMax(int[] p_iArray)

            {

                int iMax = p_iArray[0];

                foreach (int v in p_iArray)

                {

                    if (iMax < v)

                    {

                        iMax = v;

                    }

                }

                return iMax;

            }

            // 参数数组,params关键字

            static int getMax2(params int[] p_iArray)

            {

                int iMax = p_iArray[0];

                foreach (int v in p_iArray)

                {

                    if (iMax < v)

                    {

                        iMax = v;

                    }

                }

                return iMax;

            }

            static void Main(string[] args)

            {

                Write();

                int sum = Add(10, 20);  // 调用方法时的参数,我们称之为实际参数(即,实参)

                Console.WriteLine("调用Add方法的结果是:" + sum);

                int[] arr = getFactor(10);

                foreach (int v in arr)

                {

                    Console.WriteLine("调用getFactor方法的结果是:" + v);

                }

                int iMax = getMax(new int[] { 16, 2, 8, 9, 32, 26 });

                Console.WriteLine("调用getMax方法的结果是:" + iMax);

                // 参数数组

                int iMax2 = getMax2(16, 2, 8, 9, 32, 26);  // params声明, 使用离散实参,编译器会自动将离散的值转换成一个数组传递给函数

                Console.WriteLine("离散实参 调用 getMax2 方法的结果是:" + iMax2);

                int iMax3 = getMax2(new int[] { 16, 2, 8, 9, 32, 26 });  // params声明,也可以直接使用数组实参传递给函数

                Console.WriteLine("数组实参 调用 getMax2 方法的结果是:" + iMax3);

                Console.ReadKey();

            }

        }

    }

    6.2 结构体的函数

    在结构体中定义函数。

      当我们在结构体中定义一个函数的时候,这个函数就可以通过结构体声明的变量来调用。这个函数可以带有参数,那么调用的时候必须传递参数。这个函数,可以使用结构体中的属性。

    6.2.1 Example:结构函数

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;

    // 结构函数

    namespace Lesson_5_2

    {

        struct CustomerName

        {

            public string firstName;

            public string secondName;

            public string getName()

            {

                return firstName + "-" + secondName;

            }

        }

        class Program

        {

            static void Main(string[] args)

            {

                CustomerName name1, name2;

                name1.firstName = "name";

                name1.secondName = "1";

                name2.firstName = "name";

                name2.secondName = "2";

                Console.WriteLine("name1的姓名是:" + name1.firstName + " " + name1.secondName);

                Console.WriteLine("name2的姓名是:" + name2.firstName + " " + name2.secondName);

                // 可以发现,上面的输出,有一部分是重复的,如果名字很多,重复的次数就超级多;

                // 而如果有一天需求改了,让firstName 和 secondName 使用 '-'(不再使用 ' ')连接起来,那么所有使用的地方,都要修改一遍,维护起来麻烦和繁琐;

                // 针对这种情况,我们使用函数封装,这样需求改变是,只需要修改函数里面的内容,使用的地方不需要改动;即只需要改一个地方(函数定义的地方)

                // 需求修改为:使用'-'连接名。这里使用结构函数。

                Console.WriteLine("使用结构函数name1的姓名是:" + name1.getName());

                Console.WriteLine("使用结构函数name2的姓名是:" + name2.getName());

            }

        }

    }

    6.3 函数的重载

    重载(overload):同一个函数名,多个实现。

      函数重载必须满足以下条件:

    1.函数名相同;

    2.参数类型 或者 参数个数不同;

         编译器会根据传递的实参的类型和个数,来确定调用的是哪个函数。

       例如:

        int d(int a, int b);

        string d(double a, double b);

        d(1, 2); // 根据实参类型,调用的是d(int, int) 方法

        d(22.5, 556.554); // 根据实参类型,调用的是 d(double, double) 方法

    6.3.1 Example:函数的重载

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;

    // 函数的重载

    namespace Lesson_5_3

    {

        class Program

        {

            static int getMax(int[] array)

            {

                int iMax = array[0];

                for (int i = 1; i < array.Length; ++i)

                {

                    if (iMax < array[i])

                    {

                        iMax = array[i];

                    }

                }

                return iMax;

            }

            // 重载

            static double getMax(double[] array)

            {

                double iMax = array[0];

                for (int i = 1; i < array.Length; ++i)

                {

                    if (iMax < array[i])

                    {

                        iMax = array[i];

                    }

                }

                return iMax;

            }

            static void Main(string[] args)

            {

                int iMax = getMax(new int[] { 2, 98, 65, 12});  // 会根据实参类型,自动判断调用的函数 getMax(int[]);

                Console.WriteLine("int的最大值是 = " + iMax);

                double dMax = getMax(new double[] { 2.23, 98.63, 65, 12.52 });  // 会根据实参类型,自动判断调用的函数 getMax(double[]);

                Console.WriteLine("double的最大值是 = " + dMax);

            }

        }

    }

    6.4 委托

    委托(delegate)是一种存储函数引用的类型。

      委托的定义指定了一个返回类型和一个参数列表。

    定义了委托之后,就可以声明该委托类型的变量,接着就可以把一个 返回类型跟参数列表跟委托一样的函数 赋值给这个变量。

    6.4.1 Example:委托

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;

    // 委托

    namespace Lesson_5_4

    {

        // 委托定义:使用 delegate 关键字

        // 委托没有函数体

        public delegate double MyDelegate(double param1, double param2);

        class Program

        {

            static double Multipy(double a, double b)

            {

                return a * b;

            }

            static double Divide(double a, double b)

            {

                return a / b;

            }

            static void Main(string[] args)

            {

                MyDelegate dl;  // 声明一个委托变量

                dl = Multipy;  // 给委托变量赋值,必须返回类型和函数参数一致

                Console.WriteLine("dl = Multipy 调用结果是 = " + dl(10, 3));  // dl(10, 3)使用委托调用方法 Multipy

                dl = Divide;

                Console.WriteLine("dl = Divide 调用结果是 = " + dl(10, 3));  // dl(10, 3)使用委托调用方法 Divide

                Console.ReadKey();

            }

        }

    }

    6.5 练习

    练习1.

      下列常量中,不是字符常量的是()。

        A.' ' B."y" C.'x'

    练习2.

      f(n)=f(n-1)+f(n-2) f(0)=2 f(1)=3 ,用程序求得f(40)

    练习5.

      一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

    练习6.

      求1+2!+3!+...+20!的和?

    练习7.

      利用递归方法求5!。 f(n)=n*f(n-1)

    练习8.

      编一个程序,定义结构类型(有学号、姓名、性别和程序设计成绩四个字段),声明该结构类型变量,用赋值语句对该变量赋值以后再输出。

    练习9.

      编一个程序,输入一个正数,对该数进行四舍五入到个位数的运算。例如,实数12.56经过四舍五入运算,得到结果13;而12.46经过四舍五入运算,得到结果12

    练习10.

      有关系式1*1+2*2+3*3+...+k*k<2000,编一个程序,求出满足此关系式的k的最大值

    练习11.

      编一个程序,解决百钱买百鸡问题。某人有100元钱,要买100只鸡。公鸡5元钱一只,母鸡3元钱一只,小鸡一元钱3只。问可买到公鸡,母鸡,小鸡各为多少只。把所有的可能性打印出来。

    6.5.1 Example:练习1、2

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;

    // 练习1、2

    namespace Lesson_5_5

    {

        class Program

        {

            static int F(int n)

            {

                // 终止函数递归调用

                if (0 == n) return 2;

                if (1 == n) return 3;

                return F(n - 1) + F(n - 2);  // 函数调用自身,即称为递归调用

            }

            static void Main(string[] args)

            {

                // example_1:

                // 答案是B

                // example_2: f(n)=f(n-1)+f(n-2) f(0)=2 f(1)=3 ,用程序求得f(40)

                int iResult = F(40);

                Console.WriteLine("F(40)的结果是 = " + iResult);

                int iResult2 = F(3);

                Console.WriteLine("F(3)的结果是 = " + iResult2);

                Console.ReadKey();

            }

        }

    }

    6.5.2 Example:练习5、6

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;

    // 练习5、6

    namespace Lesson_5_6

    {

        class Program

        {

            static int F(int n)

            {

                int iResult = 1;

                for (int i = 1; i <= n; ++i)

                {

                    iResult *= i;

                }

                return iResult;

            }

            static void Main(string[] args)

            {

                // example_5: 一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

                float iHeight = 100;

                float iDistance = 0;

                for (int i = 1; i <= 10; ++i)

                {

                    iDistance += iHeight;

                    iHeight /= 2;

                }

                Console.WriteLine("第10次落地时,经过 {0} 米,反弹高度是 {1} 米。", iDistance, (iHeight / 2));

                Console.WriteLine("example_5 finish ------------------------------");

                // example_6: 求1+2!+3!+...+20!的和

                long lngSum = 0;

                for (int i = 1; i <= 20; ++i)

                {

                    lngSum += F(i);

                }

                Console.WriteLine("和为:" + lngSum);

                Console.WriteLine("example_6 finish -----------------------------");

                Console.ReadKey();

            }

        }

    }

    6.5.3 Example:练习7、8、9

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;

    //  练习7、8、9

    namespace Lesson_5_7

    {

        class Program

        {

            static int F(int n)

            {

                if (1 == n) return 1;

                return n * F(n - 1);

            }

            struct Student

            {

                public int number;

                public string name;

                public string sex;

                public float score;

                public void Show()

                {

                    Console.WriteLine("学号:{0}, 姓名:{1},性别:{2}, 成绩:{3}", number, name, sex, score);

                }

            }

            static void Main(string[] args)

            {

                // example_7: 利用递归方法求5!。 f(n)=n*f(n-1)

                Console.WriteLine("5! = " + F(5));

                Console.WriteLine("example_7 finish ---------------------------");

                // example_8: 编一个程序,定义结构类型(有学号、姓名、性别和程序设计成绩四个字段),声明该结构类型变量,用赋值语句对该变量赋值以后再输出。

                Student stu;

                stu.number = 100001;

                stu.name = "张三";

                stu.sex = "男";

                stu.score = 565.5f;

                stu.Show();

                Console.WriteLine("example_8 finish ---------------------------");

                // example_9:

                // 编一个程序,输入一个正数,对该数进行四舍五入到个位数的运算。例如,实数12.56经过四舍五入运算,得到结果13;而12.46经过四舍五入运算,得到结果12

                Console.WriteLine("请输入一个数字:");

                double dNum = Convert.ToDouble(Console.ReadLine());

                int iNum = (int)(dNum + 0.5);

                Console.WriteLine("四舍五入后的值是 = " + iNum);

                Console.WriteLine("example_9 finish ---------------------------");

                Console.ReadKey();

            }

        }

    }

    6.5.4 Example:练习10、11

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;

    // 练习10、11

    namespace Lesson_5_8

    {

        class Program

        {

            static void Main(string[] args)

            {

                // example_10: 有关系式1*1+2*2+3*3+...+k*k<2000,编一个程序,求出满足此关系式的k的最大值

                int k = 1;

                int sum = 0;

                while (true)

                {

                    sum += k * k;

                    if (sum >= 2000)

                    {

                        break;

                    }

                    ++k;

                }

                Console.WriteLine("满足条件的 k = " + (k - 1));

                Console.WriteLine("example_10 finish --------------------------------");

                // example_11:

                // 某人有100元钱,要买100只鸡。公鸡5元钱一只,母鸡3元钱一只,小鸡一元钱3只。问可买到公鸡,母鸡,小鸡各为多少只。把所有的可能性打印出来。

                for (int i = 0; i <= (100 / 5); ++i)

                {

                    for (int j = 0; j <= (100 - i * 5) / 3; ++j)

                    {

                        int iLast = (100 - 5 * i - 3 * j) * 3;

                        if (100 == (i + j + iLast))

                        {

                            Console.WriteLine("买了公鸡{0}只,买了母鸡{1}只,买了小鸡{2}只。", i, j, iLast);

                        }

                    }

                }

                Console.WriteLine("example_11 finish ----------------------------------");

                Console.ReadKey();

            }

        }

    }

    C#初级教程学习笔记到此结束。

    资源:https://download.csdn.net/download/wodehao0808/16230641

  • 相关阅读:
    阿里SRE体系如何支撑24小时峰值压力、220+个国家“剁手党”?
    《算法技术手册》一2.4.4 线性算法的性能
    8月7日云栖精选夜读:五分钟读懂SIGIR 2017前沿技术研究成果
    作业9 DFA最小化,语法分析初步
    作业8 非确定的自动机NFA确定化为DFA
    作业7 正规式、正规文法与自动机
    作业6 正规文法与正规式
    作业5 词法分析程序的设计与实现
    作业4 文法和语言总结与梳理
    作业3 语法树,短语,直接短语,句柄
  • 原文地址:https://www.cnblogs.com/wodehao0808/p/14639676.html
Copyright © 2020-2023  润新知