文章目录
- 1.方法的定义与调用
- 2.方法的参数
- 3.方法参数的赋值
- 4.引用传参
- 5.方法的返回值
- 6.out输出参数
- 7.参数列表
- 8.作用域
- 上期练习题答案
- 本期练习题
1.方法的定义与调用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _02_方法的定义与调用
{internal class Program{static void Main(string[] args){//方法 也叫做函数//就是把一系列相关的代码组织(封装)到一起,用于执行一系列的任务的代码块//一个方法分为两部分,方法的定义(声明)和方法的调用(执行)//Math.Max();//2.方法的调用,在方法的名字后面() ()称之为执行运算符//Program.Test();//方法中的代码会在被调用的时候执行,执行完毕之后,继续回到方法调用的位置,继续执行外部的代码Console.WriteLine(1);Test();Console.WriteLine(2);//练习:封装一个方法,在控制台输出10次吴亦凡MyWrite();Console.WriteLine("------------");MyWrite();}//1.方法的定义 一个方法一般情况下,写在一个类中/** 格式:* * 访问修饰符 返回值类型 方法的名字 (参数列表){* * 这个方法的代码块* }* * 访问修饰符: public """"暂且""" 先记住一个* 返回值类型 void* 方法的名字:自定义,一般以大驼峰命名(见名知意)* *///方法在声明之后,会发现在Main中无法使用,以为Main是静态方法,Test不是静态方法,所有两个方法之间是不互通的,只能把Test修饰成静态方法//注意!!!! 并不是所有的方法都需要static关键字修饰成静态方法//'''''''暂且"'''''' 在所有的方法上添加static关键字(后续详解)public static void Test(){Console.WriteLine("C#中学到的第一个方法");}public static void MyWrite(){for (int i = 0; i < 10; i++){Console.WriteLine("吴亦凡");}}}
}
2.方法的参数
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _02_方法的参数
{internal class Program{static void Main(string[] args){/**上个课件中的练习:方法功能十分的单一**如果我需要输出20次吴亦凡,就需要再封装一个方法**这两个需求的功能是相似的,我们就可以通过传递参数,来控制一个方法做出不同的功能***参数: 形参和实参**形参: 形式参数,方法定义的时候,声明在()里面的变量,这个形参的值由实参决定*实参: 实际参数,方法调用的时候,写在()中的数据,这个数据将会赋值给对应的形参**/Test(1,"3");MyWrite(15,"罗志祥");MyWrite(10, "凡凡");MyWrite(5);int c = 5;string str = "6666";//传递参数的时候,不仅可以直接写数据,也可以写一个变量,会自动将变量的值传递给形参MyWrite(c,str);}public static void Test(int x,string s){Console.WriteLine(x);}//原始方法1.0 //功能:打印10次吴亦凡//2.0 打印任意次数的吴亦凡//3.0 打印任意次数的任意内容//4.0 如果传递打印内容,则打印传入的内容,如果不传入内容,则打印默认值"劣迹明星"//方法在定义的时候,可以给形参设置一个默认值,当方法调用的时候,没有传递参数,则使用这个默认值(这个参数是可选参数)//注意:可选参数必须写在必选参数的后面//比如://f(int a,int b) √ 两个参数必选参数//f(int a,int int b=666) √ 可选参数在必选后面//f(int a=888,int b=666) √ 两个参数都是可选参数//f(int a=888, int b) X 可选参数 不能设置在必选参数的前面public static void MyWrite(int count,string str="劣迹明星"){for (int i = 0; i < count; i++){Console.WriteLine(str);}}}
}
3.方法参数的赋值
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _04_方法参数的赋值
{internal class Program{static void Main(string[] args){//方法调用的时候,如果传入的时候变量,或者表达式,都会先进行计算,然后再传递//也就是说,方法调用传递变量,传递过去的是这个变量的值,而不是变量本身Test1(1 + 1);int z = 2;Test1(z);Console.WriteLine($"z=={z}");//原理:int c = 2;int b = c;b = 20;Console.WriteLine($"c=={c}");//--------------------------------------//当给方法传递一个引用类型的时候,传递的也是这个变量的值//只不过引用类型的变量存储的是数据的内存地址,所以传递进去的也是内存地址,相当于两个地方操作的时候一块内存地址,一个改变,另一个也会发生改变People p1=new People() { Name="老王"};Test2(p1);Console.WriteLine(p1.Name);//原理:People p2 = new People() { Name = "老王" };People p3 = p2;p3.Name = "吴亦凡";Console.WriteLine(p2.Name);}public static void Test1(int x){Console.WriteLine($"传入的参数x为{x}");x = 20;}public static void Test2(People people){Console.WriteLine($"传入的参数x为{people.Name}");people.Name = "吴亦凡";}}class People{public string Name;}
}
4.引用传参
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _05_引用传参
{internal class Program{static void Main(string[] args){//方法传递参数的两种方案://值传递(值参数):方法默认的传递方式,这种方式调用方法,会在方法执行的时候声明一个新的变量接收一个参数,实参的值会赋值给这个新的变量,当我们传递的数据类型不同的时候,也会出现不同的效果//当传递一个基本数据类型的时候,方法内部修改形参,不会影响外部,当传递一个引用类型的时候,会影响外部//引用传递(引用参数):当传递一个基本数据类型的时候,方法内部修改形参,会影响外部//当方法内部需要修改传递进来的变量的时候,就需要使用引用传递int x = 2;//使用引用传递的时候,传递变量就是传递的这个变量本身,而不是变量的值Test(ref x);//传递参数的时候,必须加上ref关键字Console.WriteLine("x:"+x);//需求:定义一个函数 交换a和b的值int a = 666, b = 888;//int temp = a;//a = b;//b=temp;//(a, b) = (b, a);Huan(ref a,ref b);Console.WriteLine(a);Console.WriteLine(b);/** 方法内部修改形参的时候,外部是否会受到影响* * 1.看方法内部是怎么样改的 如果是 形参=xxx 外部不会受到影响* 如果是 形参.xxx=xxx 外部受影响* 2.如果使用的是引用传递(ref) 内部使用 形参=xxx 外部也会受到影响*/}//给方法的某个形参的前面加上ref关键字,这个参数将进行引用传递(直接传递变量)public static void Test( ref int a){Console.WriteLine("参数:"+a);a = 20;}public static void Huan(ref int x,ref int y){(x, y) = (y, x);}}
}
5.方法的返回值
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _06_引用传参
{internal class Program{static void Main(string[] args){//Math.Max(10,11);//有些方法的功能仅仅用于输入工作, 调试工作//有些方法的功能以计算为主要目标,一般在方法执行结束后,获取计算结果string s = Test();Console.WriteLine(s);//定义一个函数 传入两个参数,返回两个数的和Console.WriteLine(Sum(10, 10));}//方法通过返回值将方法内部计算的结果返回给调用的地方//需要在定义方法的位置,指定方法的返回值的类型,没有返回值写voidpublic static string Test(){//注意:方法标注了返回值的类型,那么这个方法内部就必须要返回对应的类型的数据return "罗志祥";}public static int Sum(int a,int b){//return 关键字不仅可以用于返回数据,还可以用于终止方法的执行//return 关键字下面的代码不会执行return a + b;//Console.WriteLine(a+b);}}}
6.out输出参数
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _07_out输出参数
{internal class Program{static void Main(string[] args){//ref 输入关键字//out 输出关键字//return关键字用于返回方法执行的结果,但是只能返回一个数据,如果需要同时返回多个数据到方法调用的位置,就可以使用输出参数int a = 1;int b = 2;Test1(ref a,ref b);Console.WriteLine($"a=={a},b=={b}");int c;int d;Test2(out c, out d);Console.WriteLine($"c=={c},d=={d}");/** out和ref的区别?* * 1.out传递参数,可以不用赋值* 2.out传递的参数,在方法中必须赋值* 3.ref传递的参数可以在方法中获取值,out传递的参数,只能在赋值之后取值(out不能传递进去数据)* * ref的主要作用是为了传入数据,因此传入的时候必须进行赋值* * out的主要作用是为了传出数据,因此传入的时候可以不进行初始化,并且在方法中必须进行赋值* ** */}public static void Test1(ref int x,ref int y){Console.WriteLine($"Test1方法中x:{x},y{y}");x = 20;y = 30;}public static void Test2(out int x, out int y){x = 20;y = 30;Console.WriteLine($"Test2方法中x:{x},y{y}");}}
}
7.参数列表
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _08_参数列表
{internal class Program{static void Main(string[] args){//一个方法除了可以接收固定个数的参数外,还可以接受未知数量的参数Console.WriteLine(Sum(1,2,3,4));Console.WriteLine(Sum(3, 1));Test(1,"s",true,"a","v","e");// Test2(new int[] {1,2});}//参数列表的格式 : params 数据类型[] 参数的名字public static int Sum(params int []nums){int sum = 0;//获取参数的参数的个数//Console.WriteLine(nums.Length);//Console.WriteLine(nums[0]);//Console.WriteLine(nums[1]);for(int i = 0; i < nums.Length; i++){//使用参数名[0] 拿到第一个参数 使用参数名[1] 拿到第二个参数....Console.WriteLine(nums[i]);sum += nums[i];}return sum;}//方法的参数可以同时使用普通的参数和参数列表public static void Test(int a, string b, bool c,params string[] strs){}//演示//参数是一个int类型的数组//public static void Test2(int[] arr)//{//}}
}
8.作用域
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _09_作用域
{internal class Program{static void Main(string[] args){int a = 1;//从这里开始能访问a------//作用域://作用域就是一个变量可以使用的范围//局部作用域:声明的变量仅仅能在某个代码块中生效Console.WriteLine(a);//从这里结束不能访问a------}public static void Test1(){//Console.WriteLine(a);int b = 2;Console.WriteLine(b);{Console.WriteLine(b);int c = 3;}for (int i = 0; i < 5; i++){Console.WriteLine(i);}//Console.WriteLine(i);//Console.WriteLine(c);}}
}
上期练习题答案
-
从键盘上输入用户名admin和密码123,当二者都正确时,输出:用户名和密码输入正确,登陆成功
当用户名或密码输入错误时,输出:用户名或密码错误,请重新输入,实现循环输入bool isSuccess = false;do{// 获取用户的输入Console.Write("请输入用户名:");string userName = Console.ReadLine();Console.Write("请输入密码:");string password = Console.ReadLine();// 判断是否匹配if (userName == "admin"){if (password == "123"){Console.WriteLine("登陆成功");isSuccess = true;}else{Console.WriteLine("密码错误");isSuccess = false;}}else{Console.WriteLine("用户名错误");isSuccess = false;}} while (!isSuccess)
- 用户登录系统时需要输入用户名和密码,系统对用户输入的用户名和密码进行验证。验证次数最多3次,超过三次则程序结束。
int count = 3;do{Console.Write("请输入用户名:");string username = Console.ReadLine();Console.Write("请输入密码:");string password = Console.ReadLine();if (username == "admin" && password == "123456"){Console.WriteLine("登陆成功");break;}else{count--;if (count == 0){Console.WriteLine("登陆失败,你的机会已用尽");}else{Console.WriteLine("登陆失败,你还有 " + count + " 次机会");}}} while (count > 0);
- 打印101-200之间的素数(素数,也叫质数,除了1和其本身外,没有其他的除数整除,如2, 7, 17, 23…)
for (int i = 101; i < 201; i++){bool Prime = true;for (int j = 2; j < i; j++){if (i % j == 0){Prime = false;break;}}if (Prime == true) Console.WriteLine(i + "为质数");else Console.WriteLine(i + "为合数");
- 循环输入商品编号和购买数量,系统自动计算每种商品的价钱(单价X数量),并累加总金额。
//当输入n时结账(假设享受8折优惠)// 结账时,根据折扣计算应付金额,输入实付金额,并找零Console.WriteLine("*********************************");Console.WriteLine("请选择购买商品编号:");Console.WriteLine("1.T 恤 2.网球鞋 3.网球拍");Console.WriteLine("*********************************");Console.WriteLine();// 最后总的价格float sum = 0;// 保存是否继续y/nstring info = "";do{// 选择商品和编号Console.Write("请输入商品编号:");int id = int.Parse(Console.ReadLine());Console.Write("请输入商品数量:");int num = int.Parse(Console.ReadLine());// 计算// temp 此次购买的小合计float temp = 0;switch (id){case 1:// T恤temp = 245.0f * num;Console.WriteLine("T 恤¥245.0\t数量 " + num + "\t合计¥" + temp.ToString("F1"));break;case 2:// 网球鞋temp = 570.0f * num;Console.WriteLine("网球鞋¥570.0\t数量 " + num + "\t合计¥" + temp.ToString("F1"));break;case 3:// 网球拍temp = 399.0f * num;Console.WriteLine("网球拍¥399.0\t数量 " + num + "\t合计¥" + temp.ToString("F1"));break;default:break;}sum += temp;// 是否继续Console.Write("是否继续(y/n):");info = Console.ReadLine();Console.WriteLine();} while (info == "y");// 结账Console.WriteLine("折扣:0.8");float yingfu = (float)Math.Round((sum * 0.8f), 1);Console.WriteLine("应付金额:" + yingfu);Console.Write("实付金额:");float shifu = float.Parse(Console.ReadLine());Console.WriteLine("找钱:" + (shifu - yingfu));
5. 控制台接收行数 ,打印以下图形.如下图:
// 图形打印Console.WriteLine("请输入行数:");int count = int.Parse(Console.ReadLine());//外层循环控制行数for (int i = 0; i < count; i++){// 内层循环控制星星的个数for (int j = 0; j < count - i; j++){Console.Write("★");}// 一行输出完成后换行Console.WriteLine();}Console.WriteLine("=========================");for (int i = 0; i < count; i++){// 循环显示空格for (int j = 0; j < count - (i + 1); j++){Console.Write(" ");}// 循环显示星星for (int j = 0; j < i + 1; j++){Console.Write("★");}// 换行Console.WriteLine();}Console.WriteLine("=========================");for (int i = 0; i < count; i++){// 循环显示空格for (int j = 0; j < i; j++){Console.Write(" ");}// 循环显示星星for (int j = 0; j < count - i; j++){Console.Write("★");}// 换行Console.WriteLine();}Console.WriteLine("=========================");for (int i = 0; i < count; i++){// 循环显示空格for (int j = 0; j < count - 1 - i; j++){Console.Write(" ");}// 循环显示星星for (int j = 0; j < i * 2 + 1; j++){Console.Write("★");}// 换行Console.WriteLine();}Console.WriteLine("=========================");for (int i = 0; i < count; i++){// 循环显示空格for (int j = 0; j < i; j++){Console.Write(" ");}// 循环显示星星for (int j = 0; j < (2 * count - 1) - 2 * i; j++){Console.Write("★");}// 换行Console.WriteLine();}Console.WriteLine("=========================");// 先定义两个变量,控制空和星星的个数int nullCount = count % 2 != 0 ? count / 2 : count / 2 - 1;int starCount = 1;// 循环输出9层for (int i = 0; i < count; i++){// 输出空for (int j = 0; j < nullCount; j++){Console.Write(" ");}// 输出星for (int j = 0; j < starCount; j++){Console.Write("★");}// 换行Console.WriteLine();// 如果总数是偶数,并且当前索引为中位数-1,则不修改星星和空的个数if (count % 2 == 0 && i == count / 2 - 1){continue;}if (i < count / 2){// 五个之前,每次输出后,星星+2,空格-1starCount += 2;nullCount--;}else{// 五个之后,每次输出后,星星+2,空格-1starCount -= 2;nullCount++;}}
本期练习题
- 定义一个函数,找出三个数中的最小值
- 定义一个函数,找出三个数中的最大值
- 定义一个函数,计算一个数的 N 次方 Pow(2, 3)返回8
- 定义一个函数,传递一个数组参数(参数列表),找出参数当中的最大值 >FindMax(1,2,3,6,10)返回10
- 定义一个方法,传入一个字符串类型的数组参数,输出倒叙的字符串
ReverseString(“a”, “c”, “e”)返回 “eca”- 定义一个方法,传入一个字符串类型的数组参数,输出这些字符是否为回文串
一个字符串,正着和倒着是一样的
abcba、12321、121、11、1221
Test(“a”, “b”, “c”) 返回 false
Test(“a”, “b”, “a”) 返回 true