码迷,mamicode.com
首页 > Windows程序 > 详细

C#基础(下)

时间:2017-08-20 18:37:10      阅读:243      评论:0      收藏:0      [点我收藏+]

标签:rem   动作   作用域   删除元素   中标   相互   程序   height   tac   

第四章  流程控制

4-01  流程图

使用标准化的图形方案,分析某个功能的实现步骤
流程图的形状

技术分享

 

4-02  if 判断


流程控制语句
if 判断
switch 选择
循环
while
do while
for
foreach
代码格式:

if (条件1)
{
代码1
}
else if (条件2)
{
代码2
}
else
{
代码n
}


示例

技术分享

 

 

4-03  变量作用域


可以简单理解为,耨个变量在定义时所在的大括号。在大括号内,该变量有效,大括号外无效
在某个位置定义变量的时候,变量名不得与作用域覆盖该位置的变量名相同

 

4-04  收益计算器

实现代码:

class Program
{
static void Main(string[] args)
{
Console.WriteLine("欢迎来到XX银行,您可以在这里进行定期存款,获得的收益将按照以下规则进行计算:\n1.存款期1年以内,按照4%的年利率计算利息\n2.存款期2-5年,按照4.8%的年利率计算利息\n3.存款期5年以上(不含5年),按照5.2%的年利率计算利息\n4.若存款金额超过50万(含50万),存款到期后,还会获得10%的收益\n");
Console.Write("请输入的存款金额(万元):");
decimal amount = decimal.Parse(Console.ReadLine());
Console.Write("请输入您的存款期限(年):");
int year = int.Parse(Console.ReadLine());
//总收益=利息收益+额外收益
//利息收益=本金*利率*年限
decimal rate; //定义利率为rate
if (year == 1)
{
rate = 0.04m;
}
else if (year >= 2 && year <= 5)
{
rate = 0.048m;
}
else
{
rate = 0.052m;
}
decimal ratemoney=amount*rate*year*10000; //定义利息收益为ratemoney
decimal extramoney = 0; //定义额外收益为extamoney
if (amount >= 50)
{
extramoney = ratemoney * 0.1m;
}
decimal all = ratemoney + extramoney; //定义总收益为all
Console.WriteLine("恭喜您,存款成功。"+year+"年到期后,您将获得"+ all +"元的收益。");

Console.ReadLine();
}
}

 

 

4-05   switch选择


每一个switch选择都可以转换成if结构,但if结构不一定能转换为switch
代码格式:

switch(变量或表达式)
{
case 值1;
代码1
break;
case 值2;
代码2
break;
default:
代码n
break;
}


switch仅支持以下类型的比较:
string、char、bool、枚举、整数
(byte、sbyte、short、vshort、
int、vint、long、vlong)
举例

技术分享

 

 

 

4-06  while 循环


代码格式:

while(循环条件)
{
循环体

}
循环条件:可以是:值,变量,表达式;必须是bool类型
循环体:可以是任意功能,任意数量的代码


举例

 技术分享

 

4-07  do while 循环


代码格式:

do
{
循环体
}
while(循环条件);


举例

 技术分享

 

 

4-08  for 循环


代码格式

for(表达式1;循环条件;表达式2)
{
循环体
}

表达式1:可以是任何代码,一定会执行,且只会执行一次
循环条件:可以是值。变量、表达式,必须是bool类型
表达式2:可以是任何代码,在循环体执行后执行


举例

技术分享

 



拓展
region指令 

书写方式

#region 描述内容
//代码
#endregion

当代码数量非常多的时候,可以将代码折叠起来
region和endregion必须成对书写,

和注释内容一样,region指令和endregion指令都不会参与编译。

也就是说,在编译生成的exe文件中,是不存在这样的指令的,它只存在于源代码中,方便阅读。



控制台清屏


书写方式

Console.Clear(); //当程序运行到这条语句时,控制台当前的内容会被清空


举例

 技术分享

 

 

4-09  应用 打印九九乘法表

 

 实现代码

class Program
{
static void Main(string[] args)
{
Console.WriteLine("九九乘法表:");
for (int i = 1; i <= 9; i++)
{
for (int j = 1; j <= i; j++)
{
Console.Write(i+"*"+j+"="+i*j+"\t");

}
Console.WriteLine();
}

Console.WriteLine();
}
}

4-10  break和 continue


break;
switch 立即结束switch选择
循环 立即结束循环
continue;
循环 立即结束当次循环,进入下一次循环

 

4-11  查找问题


根据需求,在一组数据中,找到需要的数据
查找问题的解决方案:简单查找
举例
技术分享

技术分享

 

 

第五章   数组与集合

 

5-01  数组

示例①:
int[ ] numbers=new int[5];
numbers[0]=3;
numbers[1]=-2;
numbers[3]=numbers[0]*+numbers[1];
Console,WriteLine(numbers[3]);
Console,WriteLine(numbers.Length);

示例②:
string[ ] strs=new string[3];
strs[0]="a";
strs[1]="b";
strs[2]="c";
Console.Write(strs,Length);

简化→ →

string[ ]strs={"a","b","c"};
Console.Write(strs.Length);


C#的数组类型
数组
能存放任意多个同类型的数据
数组的索引(下标)是一个int类型的数字,索引(下标)从0开始,依次为数组中每一个数组项编号
字符串类型
字符类型
布尔类型
数字类型
只能存放一个数据


数组的代码书写

eg:
int [ ] number=new int[s];


数组的声明与赋值
声明:数据类型[ ]变量名;(数据类型是数据数据项的类型)
赋值:变量名=new 数据类型[长度];(

数据类型必须和声明的数据类型完全一致
[长度]表示数组的长度


合并书写:数据类型[ ]变量名=new 数据类型[长度];

 

数据项的读取与修改
读取: 变量名[索引]  (

从指定数组中,通过编号取出某一个数组项的值。返回类型与数组项相同


修改 变量名[索引]=值;

 

读取数组长度: 变量名.Length
返回类型:int
使用数组的初始化器,可以在数组创建时,对其每一项赋值

 

数组项的默认值

一个数组创建后,它每一个数组项的值,为数组项类型的默认值
数字类型,默认值为0
bool类型,默认值为false
char类型,默认值为\0
string类型。默认值为null

 

 

5-02  数组的定长性


一个数组在创建后,它的长度固定不变
代码示例:
int[ ]numbers=new int[3];
numbers[0]=3;
numbers=new int[2];
Console.WriteLine(numbers[0]);


适合使用数组的场景
保存100以内所有的质数
保存太阳系中所有已知行星的质量
保存标准扑克牌中的所有牌面数据
保存一个星期的所有期
其他定长的数据场景
不适合使用数组的场景
保存一个班的学生信息
保存一年中所有日期
保存斗地主游戏中某玩家的手牌数据
保存游戏中某玩家的游戏信息
其他不定长的数据场景

 

5-03  数据的遍历


是指从数组的第一项开始,依次取完数组的所有项。要实现数组的遍历,可以使用循环
循环变量从0开始,依次取到数组的最大下标(数组长度-1)
举例
技术分享

 

技术分享

 


 5-04  交换排序

实现代码

class Program
{
static void Main(string[] args)
{
Console.Write("请输入数组的长度:");
int n = int.Parse(Console.ReadLine());
int[] nums = new int[n];
//数组的长度为n
for (int i = 0; i < n; i++)
{
Console.Write("请输入数组第" + (i + 1) + "项的值:");
nums[i] = int.Parse(Console.ReadLine());
}
Console.Clear();
//执行到此步骤时清屏
Console.WriteLine("您输入的数字排序后如下:");
for (int i = 0; i < nums.Length - 1; i++)
{
for (int j = i + 1; j < nums.Length; j++)
{
if (nums[i] > nums[j])
{
//交换
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}

}

}
for (int i = 0; i < nums.Length; i++)
{
Console.Write(nums[i]);

if (i < nums.Length - 1)
{
Console.Write(" ");
}
if (i == nums.Length - 1)
{
Console.WriteLine(" ");
}
}
//按从小到大的顺序排列
Console.WriteLine("其中,以下数字为奇数:");
for (int i = 0; i < nums.Length; i++)
{
if (nums[i] % 2 != 0)
{
Console.Write(nums[i]);
}
if (i < n)
{
Console.Write(" ");
}
if (i == nums.Length - 1)
{
Console.WriteLine(" ");
}
}
//算出奇数
Console.Write("以下数字是质数:");
for (int i = 0; i < nums.Length; i++)
{

for (int j = 2; j < nums[i]; j++)
{
bool isFind = false;
if (nums[i] % j == 0)
{
isFind = true;

}
if (!isFind)
{
Console.Write(nums[i]);
}
if (i < n)
{
Console.Write(" ");
}
break;


}
//算出质数
}

Console.ReadLine();
}
}

 

5-05  应用:数据分析器

实现代码

Console.Write("请输入数组的长度:");
int n = int.Parse(Console.ReadLine());
int[] nums = new int[n];
//数组的长度为n
for (int i = 0; i < n; i++)
{
Console.Write("请输入数组第" + (i + 1) + "项的值:");
nums[i] = int.Parse(Console.ReadLine());
}
Console.Clear();
//执行到此步骤时清屏
Console.WriteLine("您输入的数字排序后如下:");
for (int i = 0; i < nums.Length - 1; i++)
{
for (int j = i + 1; j < nums.Length; j++)
{
if (nums[i] > nums[j])
{
//交换
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}

}

}
for (int i = 0; i < nums.Length; i++)
{
Console.Write(nums[i]);

if (i < nums.Length - 1)
{
Console.Write(" ");
}
if (i == nums.Length - 1)
{
Console.WriteLine(" ");
}
}
//按从小到大的顺序排列
Console.WriteLine("其中,以下数字为奇数:");
for (int i = 0; i < nums.Length; i++)
{
if (nums[i] % 2 != 0)
{
Console.Write(nums[i]);
}
if (i < n)
{
Console.Write(" ");
}
if (i == nums.Length - 1)
{
Console.WriteLine(" ");
}
}
//算出奇数
Console.Write("以下数字是质数:");
for (int i = 0; i < nums.Length; i++)
{

for (int j = 2; j < nums[i]; j++)
{
bool isFind = false;
if (nums[i] % j == 0)
{
isFind = true;

}
if (!isFind)
{
Console.Write(nums[i]);
}
if (i < n)
{
Console.Write(" ");
}
break;


}
//算出质数
}

Console.ReadLine();

 

5-06  集合


数组
定长(用于保存固定数量的数据)
占用内存少
遍历速度快
集合
不定长(保存的数据数量,可以在程序的执行过程中,不断的发生变化)
占用内存多
遍历速度慢
C#语言支持的集合类型:LIst、Queue、Stack、LinkedList、HashSet、其他..

以上,用于储存多个同类型的数据
在功能上,数组能实现的所有功能,集合都能实现
反之,集合能实现的所有功能,数组难以实现

 

List集合
创建
定义:List<数据类型>变量名;
赋值:变量名=new List<数据类型>();
初始化器:变量名=new List<数据类型>{元素1;元素2,...,元素n};
操作
添加元素:变量名.Add(要添加的数据);
插入元素:变量名.Insert(索引,要插入的数据);
删除元素:变量名.RemoveAt(索引);变量名.Remove(数据);
修改元素:变量名[索引]=值;
获取元素数量:变量名.Count

 

5-07  foreach 循环


只能用于遍历数组或集合
代码格式:
foreach(数据类型 变量 in 数组或集合 )
{
循环体
}

※数据类型是变量的类型
数组或集合与其每一项的类型相同


从数组或集合中,依次取出每一项的数据,每取出一项数据,就把数据赋值给循环变量。每一次赋值后,运行依次循环体。


代码示例

技术分享

 



※注意:foreach循环也叫只读循环,在循环体中,不能更改集合或数组

 

 5-08  集合管理器

 实现代码

List<int> nums = new List<int>();
while(true)
{
#region 输出集合内容
Console.WriteLine("集合中现有的内容如下:");
Console.WriteLine("================================================");
if (nums.Count == 0)
{
Console.WriteLine("集合中没有元素");
}
else //遍历输出集合内容
{
foreach (int item in nums)
{

Console.Write(item+"\t");
}
}
Console.WriteLine();
Console.WriteLine("================================================");
#endregion
#region 提示菜单,并获取用户输入的菜单选项
Console.WriteLine("1.添加数据");
Console.WriteLine("2.删除数据");
Console.WriteLine("3.修改数据");
Console.WriteLine("4.升序排序");
Console.WriteLine("0.退出程序");
Console.Write("请选择(0-4):");
int a=int .Parse (Console .ReadLine ());

#endregion
#region 根据用户输入的不同,做不同的处理
if (a == 0)
{
break;
}
else if (a == 1)
{
Console.Write("请输入要添加的数据:");
int data = int.Parse(Console .ReadLine ());
nums.Add(data);
}
else if (a == 2) //删除数据
{
Console.Write("请输入要删除的下标(0-"+(nums.Count-1)+"):");
int b = int.Parse(Console .ReadLine ());
if (b < 0 && b > (nums.Count - 1))
{
Console.WriteLine("输入错误,请重新输入。按回车键继续..");
Console.ReadLine();
}

else
{
nums.RemoveAt(b);
}
}
else if (a == 3) //修改数据
{
Console.WriteLine("请输入要删除的下标(0-"+(nums.Count-1)+"):");
int xia = int.Parse(Console .ReadLine ());

Console.Write("请输入新的数据:");
int newdata = int.Parse(Console .ReadLine ());

if (xia < 0 && xia > (nums.Count - 1)) //下标不在范围之内
{
Console.WriteLine("输入错误,请重新输入。按回车键继续..");
Console.ReadLine();
}

else
{
nums[xia] = newdata;
}

}


else if (a == 4) //升序排序
{
for (int j = 0; j < (nums.Count - 1); j++)
{
for (int k = j + 1; k < nums.Count; k++)
{
if (nums[j] > nums[k])
{
int temp = nums[j];
nums[j] = nums[k];
nums[k] = temp;
}
}
}
}


#endregion

Console.Clear();

 

第六章   函数

6-01  认识函数


函数:具有独立功能,并能通过名称重复使用的代码。使用函数可以减少重复代码,并使代码简洁易读。
函数调用:调用函数,就是使用函数,通过函数名去执行函数体
当程序运行到调用函数的语句中,会执行该函数的函数体。
※函数在调用前必须先声明
函数调用的语法: 函数名();
函数的声明:函数的声明必须在类中,指给一段代码取名称
函数调用的语法:static void 函数名( )
{
//函数体
}
示例

技术分享

 

 

 

6-02  作用域和标识符


作用域
作用域:一个变量,仅在它所定义的大括号中有效。不同作用域中的变量,拥有独立的内存空间。当作用域结束时,该变量的数据会从内存中移除
函数中的作用域
· 不同的函数之间,变量相互独立,互不干扰
· 每一次对函数的调用,都是独立运行
标识符
在代码中,需要自行命名的位置。包括:变量名、函数名、类名、接口名、委托名、其他 ,并且必须符合标识符命名的规范
C#语言中标识符的命名规范
标识符:必须由数字、字母、下划线组成,并且不能以数字开头。若不满足该要求,则出现编译错误
具体标识符的其他要求
变量名 首字母小写
函数名 首字母大写
※驼峰命名法
望文知义

 

6-03  声明带参数的函数


参数:要完成一个动作,需要知道的额外条件
声明带参数的函数:
static void 函数名(参数列表)
{
//注释内容
}
参数列表书写语法:数据类型 参数名,数据类型,参数名,...
声明带参数函数的示例

 

6-04  调用带参数的函数


函数声明时使用的参数,叫做形参;函数调用时使用的参数,叫做形参
调用语法:
函数名{实参列表}
实参列表中每个实参的书写语法:
值 或变量 或表达式
多个实参之间使用逗号分隔,实参的数量和类型必须和形参完全对应
总结
函数去完成一件事时,如果需要额外的条件,就必须声明参数
声明参数时,必须指定每个形参的类型和名称
调用函数时,实参的数量和类型和名称
实参和形参相互独立

 

6-05  声明带返回值的函数


返回值:事情做完的返回结果
函数声明的语法:
static 返回类型 函数名(形参列表)
{
//函数体
}
返回类型:函数完成后,产生的结果的类型
(void 是一种特殊的返回类型,表示:无返回类型)
return 关键字
用于在函数体中返回结果
使用语法: return 值 或变量 或表达式;
return; //仅能写在返回类型为void的函数中
当代吗运行到return语句时:
立即结束函数
返回return关键字后面的值、变量或表达式的结果
示例: static bool IsOdd(int n)
{
if (n%2!=0 )
{
return true;
}
{
return false;
}
}
总结
如果一个函数完成后需要产生一个结果,该函数就有返回值
在声明一个带返回值的函数时,必须指明返回值的类型
函数仅能有一个返回类型
如果一个函数不需要返回,那么它的返回类型是void
使用return关键字来返回结果
返回的结果必须和声明的返回类型匹配
代码运行到return语句,会立即结束函数,然后返回return后面的结果

 

 

 

6-06  调用带返回值的函数


函数调用语法: 函数名(实参列表)
函数调用是一个表达式
(返回类型与函数声明的返回类型一致)

函数声明:

//将两个数相加的结果返回
static int Add(int a ,int b,)
{
return a+b;
}

函数调用:
Add(3,5) //该表达式返回int类型
//将3和5相加的结果,保存到变量a中
int a=Add(3,5);
Console.WriteLine(3,5);

技术分享

 



总结
函数是指一个独立的功能
完成功能需要的额外条件,就是函数的参数
完成功能后产生的结果,就是函数的返回值
函数分为声明和调用
声明的完整语法: static 返回类型 函数名 ()形参列表 {函数体}
调用的完整语法:函数名(实参列表) //该表达式的类型为函数的返回类型

 

 

 

7-07  函数签名


函数签名,是一个函数的函数名、参数列表、返回类型的统称
根据它实现函数调用,根据它实现函数体
函数名 →代表函数的功能
参数列表 →函数为完成它的功能,需要的额外信息
返回类型 →函数完成功能后,产生的结果的类型
如果不需要产生结果,则返回类型为void
函数签名示例
//从指定的链接地址下载文件,保存到指定的路径
static void DownLoadFile(string fileURL,string savePath)
//根据提供的年和月,得到这个月的天数
static int GetDaysOfMonth(int year,int month)
//将提供的字符串,颠倒顺序后得到颠倒后的字符串
static string ReverseString(string str)
函数调用者的视角:对于函数调用者,仅需要知道函数签名即可
函数实现者的视角:对于函数调用者,仅需要知道函数签名即可
编写正确的函数签名
仔细阅读需求,理解需求的含义
为函数取一个贴合需求含义的函数名
仔细考虑,该函数是否需要参数,需要哪些参数
仔细考虑,该函数是否需要返回类型
总结
函数签名,是函数、参数列表、返回类型的统称
函数签名能够完整的阐述函数功能
无论是调用函数还是实现函数,仅需要知道函数签名即可
在编写函数时,必须保证函数签名与需求相符

 

 

7-08  函数注释


单行注释
多行注释

(以上,通常写到函数体外,用于描述函数体外的代码)


文档注释
(通常写在函数体内,用于描述函数体内的代码)
如:
技术分享

 

 

7-09  函数的重载


函数重载(overload):是指多个函数可以使用同一个函数名,只要它们的参数列表不同(参数的数量不同或参数的类型不同)
函数重载示例
static void Test(int a,int b)
static void Test(int a,int b,int c)
(参数数量不同,可以完成重载)


重载的作用:函数重载,可以将意义相近的函数,命名为相同的名称,从而降低了调用的难度
调用重载函数:和普通调用函数完全一样,计算机会根据传递的实参类型,匹配最合适的重载
总结
函数重载是指多个函数使用同一个名称
重载的条件是参数的数量或类型不同
重载的作用是降低调用难度
当调用重载的函数时,计算机会根据实参自动匹配

 

7-10  技巧 :函数的相互调用


调用函数:在一个函数体中,都可以调用函数
只要代码运行到调用函数的语句,就会去执行调用的函数体
应用案例
技术分享

 


总结
在任何一个函数体中,都可以调用函数
在编写函数体时,可以充分利用已有的函数完成功能从而降低开发难度

 

 

7-11 技巧:递归


递归,是指一个函数,直接或间接的调用自身
应用案例
技术分享

 


总结
递归,是指一个函数,直接或间接的调用自身
递归必须有终止条件,否则,将会出现无限递归
无限递归会耗尽内存,导致程序崩溃,必须避免

C#基础(下)

标签:rem   动作   作用域   删除元素   中标   相互   程序   height   tac   

原文地址:http://www.cnblogs.com/touchone/p/7400442.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!