C#第七课

119 阅读1分钟

1.函数

基本结构:

访问修饰符 返回值类型 函数名(形参){
    函数体
}
eg:
static int Max(int num)  
{
  return 2;//表示函数结束,return后面的代码不能执行
}
//static:静态

练习一:

image.png

//判断是否为素数
static bool isSushu(int num)
{
    //i从2开始,因为1不是素数
    for (int i = 2; i < num; i++)
    {
        //能被整除的数不是素数
        if (num % i == 0)
        {
            return false;
        }
    }
    return true;//上面循环没一次执行,就是素数
}

//翻转数字
static int getReverse(int num)
{
    string strnum = Convert.ToString(num);//将数字变量转为字符串变量
    string strnum2 = "";
    for (int i = strnum.Length - 1; i >= 0; i--)
    {
        strnum2 += strnum[i];
    }
    return Convert.ToInt32(strnum2);
}

//传2个参数
 string str = Console.ReadLine();
 string[] strArry = str.Split(" ");
 int M = Convert.ToInt32(strArry[0]);
 int N = Convert.ToInt32(strArry[1]);
 string strOut = "";
 //循环遍历N至M之间的数(输入的时候第一个小于第二个)
 for (int i = M; i <= N; i++)
 {
     if (isSushu(i) && isSushu(getReverse(i)))
     {
         if (strOut == "")//当输出字符串为空时,不加逗号
         {
             strOut += i;
         }
         else
         {
             strOut += "," + i;
         }
     }
 }
 //当输出字符串为空时,输出no
 if (strOut == "")
 {
     Console.WriteLine("no");
 }
  Console.WriteLine(strOut);

方法中的参数数组

//当一次需要输入多个数时,可用params,会将输入的参数变为一个数组
static void getNum(params int[] numArray)
{
    Console.WriteLine(string.Join(" ", numArray));//将数组中的元素按照指定符号连接成一个字符串,数组转字符串
}
getNum(1, 3, 5, 7, 9, 32);

练习

image.png

static void getDivisor(int num)
{               
    for (int i = 1; i <= num; i++)
    {
        if (num%i==0)
        {
            Console.WriteLine(i);
        }
    }
}
int num =Convert.ToInt32(Console.ReadLine()) ;
getDivisor(num);

2.函数重载(Overload)

有时候我们可能需要使用同一个函数,但是传入的参数类型不一样,或者函数体中只有细微变动,这样我们可以使用函数重载的方式,根据传入参数的类型执行对应的函数

static int getNum(int num)
{
    Console.WriteLine(num);
    return num;
}
static double getNum(double num)
{
    Console.WriteLine(num);
    return num;
}
getNum(1.4);

练习 求斐波那契数列

  • 提示:已知 1 1 2 3 5 8 13 21 34... 我们发现后面数是前两个数的和,我们称这种数列为斐波那契数列
  • 题目要求:输入n,求出n项的斐波那契数列
  • 例:输入4 输出 1 1 2 3
static int fib(int n)
{
    if (n==1||n==2)
    {
        return 1;
    }
    return fib(n - 1) + fib(n - 2);
  
}
int num = Convert.ToInt32(Console.ReadLine());
for (int i = 1; i <= num; i++)
{
    Console.Write(fib(i)+" "); 
}

练习

有关系式1 * 1+2 * 2+3 * 3+...k * k<2000,编一个程序,求出满足此关系的k的最大值,利用递归和循环解决这个问题

//找关系式:f(k)=1^2+2^2+...+k^2,f(k-1)=1^2+2^2+...+(k-1)^2,f(k)=f(k-1)+k^2,f(1)=1
static int getFk(int k)
{
    if (k == 1) return 1;
    return getFk(k - 1)+k*k;
}
int i = 1;
while (true)
{
    if (getFk(i)>=2000)
    {
        break;
    }
    i++;
}
Console.WriteLine(i-1);//取比i小1的数,为最大值

练习: 猴子摘桃问题

image.png

static int getP(int day)
{
    if (day == 10) return 1;
    return (getP(day + 1)+1)*2;
}
for (int i = 1; i < 11; i++)
{
    Console.WriteLine("第{0}天剩余桃子数:{1}", i,getP(i));
}