主要按照Siki学院基础教程学习,下面对学习内容进行记录,以备后续查询。 课程总共117讲,在本博客中只记录重点知识和学习经验。
1 基础知识
1.1 快捷键
添加注释:Ctrl+k\Ctrl+c 取消注释:Ctrl+k\Ctrl+u
1.2 Hello World
using System;
namespace _001_开始
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
Console.WriteLine("Hello World!");
Console.WriteLine("王强");
Console.Write("\n");
Console.Write("你好\t李慧颖\n");
Console.Write("1\n\t2\n3");
}
}
}
1.3 变量:整型(int)、浮点型(double)、字符型(char)、字符串类型(string)
浮点数比整型存储数据大、但是精度低,只能存储6位小数,后面的采用科学计数法表示
包括变量申明和变量调用。
命名规则:
- 变量包括字母、数字、下划线,数字不能作为开头
- 变量不能和关键字重名
命名规范:
- 驼峰命名法(Camel):第一个单词首字母小写,剩下单词首字母大写,e.g.,enemyHp
- Pascal命名规范:所有单词首字母大写,如果使用缩写,全部大写,e.g.,EnemyHp
1.4 字符类型:字符<—>ASCII码、字符串、转义字符
A——Z(26):65-90,a——z:97-122 常见转义字符:"\n" 换行、"\t" 制表符、"\v" 垂直制表符、"\"->\、" " “->”
Console.WriteLine(@"C:\\a\\b\\c");
1.5 字符串拼接和数字加和
Console.WriteLine("123" + "456");
Console.WriteLine(123 + 456);
1.6 获得用户输入
string str = Console.ReadLine();
string str = Console.ReadLine();
int str2int = Convert.ToInt32(str);
Console.WriteLine(str2int + 1);
int str2int_1 = Convert.ToInt32(Console.ReadLine());
1.7 两个变量数据交换
using System;
namespace _007_交换变量
{
class Program
{
static void Main(string[] args)
{
Console.Write("输入一个整数a:");
int a = Convert.ToInt32(Console.ReadLine());
Console.Write("输入另一个整数b:");
int b = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("a=" + a + " and " + "b=" + b);
int c = a;
a = b;
b = c;
Console.WriteLine("a=" + a + " and " + "b=" + b);
}
}
}
1.8 字符串的格式化输出
Console.WriteLine("{0}+{1}={2}", a, b, a + b);
1.9 数学运算符
(1)算数运算符
将一个两位数的个位和十位分离出来
using System;
namespace _009_算数运算符
{
class Program
{
static void Main(string[] args)
{
int a, b;
Console.Write("输入一个两位数:");
int num = Convert.ToInt32(Console.ReadLine());
a = num / 10;
b = num % 10;
Console.WriteLine("{0}的十位是:{1},{0}的个位是:{2}", num, a, b);
}
}
}
(2)自增自减运算符
using System;
namespace _009_算数运算符
{
class Program
{
static void Main(string[] args)
{
int c = 5;
int d, e;
d=c++;
e=++c;
Console.WriteLine("d的值是:{0},e的值是:{1}", d, e);
}
}
}
(3)逻辑运算符和关系运算符
using System;
namespace _010_关系运算符和布尔类型
{
class Program
{
static void Main(string[] args)
{
bool a = true;
bool b = false;
bool c = 45 < 50;
Console.WriteLine(c);
Console.WriteLine(60==61);
bool d = (3 < 4) && (5 >= 6);
bool e = (5 >= 5) || (6 > 6);
bool f = !(7 > 8);
Console.WriteLine(d);
Console.WriteLine(e);
Console.WriteLine(f);
}
}
}
练习 1:写一个程序判断,一个人是否是青年人?
using System;
namespace _010_关系运算符和布尔类型
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请输入一个人的年龄:");
int age = Convert.ToInt32(Console.ReadLine());
if (age >= 18 && age <= 60)
{
Console.WriteLine("这个人是青年人");
}
else
{
Console.WriteLine("这个人不是青年人");
}
}
}
}
(4)运算符的优先级 ()>乘除>加减>移位>条件> 逻辑 (5)练习 1:键盘输入一个三位数,并按数字的相反方向输出
using System;
namespace _011_Practice2
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请输入一个三位数正整数:");
int a = Convert.ToInt32(Console.ReadLine());
int ge,shi,bai;
ge = a % 10;
shi = (a/10) % 10;
bai = a / 100;
Console.WriteLine("反方向输出后的结果是:" + ge+shi+bai);
}
}
}
(6)练习 2:输入一个五位数,输出十位和千位组成的两位数所对应的字母
using System;
namespace _012_Practice3
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请输入一个五位数:");
int num = Convert.ToInt32(Console.ReadLine());
int ge, shi, bai, qian, wan,result;
ge = num % 10;
shi = (num / 10) % 10;
bai = (num / 100) % 10;
qian = (num / 1000) % 10;
wan = num / 10000;
result = qian * 10 + shi;
char c = (char)result;
Console.WriteLine("得到的两位数所对应的ASCII码为:" + c);
}
}
}
2 流程控制
2.1 分支语句
2.1.1 IF条件语句
if (bool条件判断语句)
{
条件满足时执行的程序;
}
else
{
条件不满足时执行的程序;
}
如果程序语句只有一条,可以省略括号
练习 1:商场举办了送礼活动,年龄在18岁到30岁都可以参与活动,年龄是奇数的可以得奖(IF语句嵌套)
using System;
namespace _013_IF语句
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请输入顾客的年龄");
int age = Convert.ToInt32(Console.ReadLine());
if (age >= 18 && age <= 30)
{
if (age % 2 != 0)
{
Console.WriteLine("该顾客可以参加活动,并获得礼品奖励");
}
else
{
Console.WriteLine("该顾客能参加活动,但无礼品奖励");
}
}
else
{
Console.WriteLine("该顾客不能参加活动");
}
}
}
练习 2:获取一个坐标,判断是在哪一个象限、原点或坐标轴上
using System;
namespace _012_Practice3
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("输入x坐标");
int x = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("输入y坐标");
int y = Convert.ToInt32(Console.ReadLine());
if (x == 0 && y == 0)
{
Console.WriteLine("坐标位于原点");
}
else if (x > 0)
{
if (y > 0)
{
Console.WriteLine("坐标位于第一象限");
}
else if (y<0)
{
Console.WriteLine("坐标位于第四象限");
}
else
{
Console.WriteLine("坐标位于x正半轴");
}
}
else if (x<0)
{
if (y > 0)
{
Console.WriteLine("坐标位于第三象限");
}
else if (y < 0)
{
Console.WriteLine("坐标位于第二象限");
}
else
{
Console.WriteLine("坐标位于x负半轴");
}
}
else
{
if(y>0)
{
Console.WriteLine("坐标位于y正半轴");
}
else
{
Console.WriteLine("坐标位于y负半轴");
}
}
}
}
}
练习 3:输入三个整数,并按照从小到大的顺序排列并输出(冒泡排序法)
using System;
namespace _012_Practice3
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请依次输入三个整数:");
int num_1 = Convert.ToInt32(Console.ReadLine());
int num_2 = Convert.ToInt32(Console.ReadLine());
int num_3 = Convert.ToInt32(Console.ReadLine());
int a;
if (num_1>num_2)
{
a = num_1;
num_1 = num_2;
num_2 = a;
}
if(num_2>num_3)
{
a = num_2;
num_2 = num_3;
num_3 = a;
}
if (num_1 > num_2)
{
a = num_1;
num_1 = num_2;
num_2 = a;
}
Console.WriteLine(num_1);
Console.WriteLine(num_2);
Console.WriteLine(num_3);
}
}
}
练习 4:输入一个浮点数m和一个整数k,如果k=0,浮点数只保留整数部分 如果k=1,浮点数四舍五入保留一位小数。
using System;
namespace _012_Practice3
{
class Program
{
static void Main(string[] args)
{
Console.Write("请输入一个浮点数m:");
double m = Convert.ToDouble(Console.ReadLine());
Console.Write("请输入一个整数(0 or 1):");
int k = Convert.ToInt32(Console.ReadLine());
double temp;
if (k==0)
{
temp = Math.Floor(m);
}
else
{
temp = ((int)((m + 0.05) * 10))/10.0;
}
Console.WriteLine("更新后的m为:" + temp);
}
}
}
2.1.2 Switch分支语句
switch (num)
{
case 1:
Console.WriteLine("苹果");
break;
case 2:
Console.WriteLine("梨");
break;
case 3:
Console.WriteLine("柚子");
break;
case 4:
Console.WriteLine("梨");
break;
default:
Console.WriteLine("没有您想要的商品");
break;
}
- default可以没有
- 每一个case后面一般都有 break
Switch还可以变形,如果不同的选择对应同一种结果,可以合并程序。
using System;
namespace _014_Switch语句
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请输入今天是星期几:");
int weekNum = Convert.ToInt32(Console.ReadLine());
switch (weekNum)
{
case 1:
case 2:
Console.WriteLine("Arduino");
break;
case 3:
case 4:
case 5:
Console.WriteLine("C++");
break;
case 6:
case 7:
Console.WriteLine("Scratch");
break;
}
}
}
}
练习:
using System;
namespace _014_Switch语句
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请依次输入两个整数:");
int a = Convert.ToInt32(Console.ReadLine());
int b = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("请输入一个判断数:");
int select = Convert.ToInt32(Console.ReadLine());
int result;
switch (select)
{
case 0:
result = a + b;
Console.WriteLine("计算结果为:" + result);
break;
case 1:
result = a - b;
Console.WriteLine("计算结果为:" + result);
break;
case 2:
result = a * b;
Console.WriteLine("计算结果为:" + result);
break;
case 3:
result = a / b;
Console.WriteLine("计算结果为:" + result);
break;
}
}
}
}
2.2 循环语句
2.2.1 While循环语句
while(判断语句)
{
循环体;
}
练习:
using System;
namespace _016_While循环
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请输入n的值:");
int n = Convert.ToInt32(Console.ReadLine());
int i = 1;
int sum = 0;
while(i<=n)
{
sum += i;
i++;
}
Console.WriteLine("求和结果为:" + sum);
}
}
}
3n+1问题:对于任意大于1的自然数,若n为奇数,将n变为3n+1,否则变成n的一半。经过若干次这样的变化,n一定会最终变成1,比如,7 ->22 ->11 ->34 ->17 ->52 ->26 ->13 -> 40 ->20 ->10 ->5 ->16 ->8 ->4 ->2 ->1 要求:(1)输入一个数n (2)输出变化到1所需的次数
using System;
namespace _017_While练习题
{
class Program
{
static void Main(string[] args)
{
Console.Write("输入一个数:");
int num = Convert.ToInt32(Console.ReadLine());
int i = 0;
while(num!=1)
{
if (num%2==1)
{
num = 3 * num + 1;
}
else
{
num = num / 2;
}
i++;
Console.WriteLine("变换后的值为:"+num);
}
Console.WriteLine("输出变换的次数:" + i);
}
}
}
2.2.2 For 循环
for(初始化;条件表达式;增量表达式)
{
循环体;
}
- for循环三个部分都可以省略,使用break跳出循环
- 作用域的概念,一个作用域中定义的变量会在此作用域中的程序执行完销毁。
练习:将 n 和 m 之间的奇数和偶数分别输出
using System;
namespace _018_for循环
{
class Program
{
static void Main(string[] args)
{
int n = Convert.ToInt32(Console.ReadLine());
int m = Convert.ToInt32(Console.ReadLine());
string a="", b="";
for (int i = n; i <= m; i++)
{
if (i % 2 == 1)
{
a += i + " ";
}
else
{
b += i + " ";
}
}
Console.WriteLine(a);
Console.WriteLine(b);
}
}
}
2.2.3 Do_While循环
do
{
循环体;
} while (判断条件);
区别:do_while至少执行一次循环体,while可能一次循环体也不执行
2.2.4 循环标志位
标志位的作用类似触发器,一旦遇到不再进行判断 练习:输入一个未知位数的整数,反向输出一个新的整数,不保留原数字末尾的零。
using System;
namespace _020_编程题
{
class Program
{
static void Main(string[] args)
{
int n = Convert.ToInt32(Console.ReadLine());
string b = "";
bool meet = false;
while (n % 10 != 0 || n / 10 != 0)
{
int i = n % 10;
if(meet==false)
{
if(i!=0)
{
b += i;
meet = true;
}
}
else
{
b += i;
}
n /= 10;
}
Console.WriteLine(Convert.ToInt32(b));
}
}
}
2.2.5 Console.Read与Readline
- 相同点:
都可以接受控制台输入 - 不同点
(1)Read只能读取一个字符,ReadLine可以读取一个字符串 (2)Read返回字符对应的ASCII码,Readline返回字符串型(string)数据 (3)Readline直接读取字符串,Read从缓冲区读取数据(缓冲区数据通过控制台,按回车键输入)
练习1:读取一串字符,字符串以 @ 结尾,区分数字和字母,并计算数字加和
using System;
namespace _022_编程练习_区分字母和数字
{
class Program
{
static void Main(string[] args)
{
char a = (char)Console.Read();
int sum = 0;
while (a != '@')
{
if (a >= '0' && a <= '9')
{
Console.WriteLine(a);
sum += (a - '0');
}
a = (char)Console.Read();
}
Console.WriteLine(sum);
string b = Console.ReadLine();
int sum_1 = 0;
for(int i=0;b[i]!='@';i++)
{
if(b[i]>='0' && b[i]<='9')
{
sum_1 += (b[i]-'0');
}
}
Console.WriteLine(sum_1);
}
}
}
练习2:输入一个整数,输出这个整数因数的个数和所有因数
using System;
namespace _023_编程练习_因数和质数
{
class Program
{
static void Main(string[] args)
{
int a = Convert.ToInt32(Console.ReadLine());
int sum = 0;
string c = "";
for(int i=1;i<=a;i++)
{
if(a%i==0)
{
sum++;
c += i + " ";
}
}
Console.WriteLine(sum);
Console.WriteLine(c);
}
}
}
2.2.6 Continue 和 Break
Continue 结束本次循环,Break 跳出当前循环(Break常与Switch语句合用)
2.27 循环嵌套
int n = Convert.ToInt32(Console.ReadLine());
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n - i; j++)
{
Console.Write(" ");
}
for (int j = 1; j <= 2 * i - 1; j++)
{
Console.Write('*');
}
for (int j = 1; j <= n - i; j++)
{
Console.Write(" ");
}
Console.WriteLine();
}
2.2.8 随机数生成
Random rd = new Random(UnCheck((Int)DateTime.Now.Ticks));
int num = rd.Next(1, 101);
Random rd=new Random()用系统时间做随机种子并不保险,如果应用程序在一个较快的计算机上运行,则该计算机的系统时钟可能没有时间在此构造函数的调用之间进行更改,Random 的不同实例的种子值可能相同。
这种情况下,我们就需要另外的算法来保证产生的数字的随机性。我们可以自行设定触发的种子,一般都是用UnCheck((Int)DateTime.Now.Ticks)(以100毫秒做基础单位的时间数量单位)做为参数种子,避免产生重复随机数。在这里,我们首先使用系统时间作为随机种子,然后将上一次产生的随机数跟循环变量和一个与系统时间有关的整型参数相乘,以之作为随机种子,从而得到了每次都不同的随机种子,保证了产生足够"随机"的随机数。
2.2.9 数据的显式转换和隐式转换(自动转换)
- 隐式变换
自动转换,不需要多余代码 - 显式变换
int a=5; char c=‘a’; c=(char)a;
3 数组
3.1 数组定义和声明
C#中数组定义:
数据类型[] 数组名={数组元素0,数组元素1,数组元素2,···} 数据类型包括:int, double, char, string
int[] ages={12,45,60};
按照默认值进行赋值:
int[] ages;
ages=new int[10];
char和string类型的数组默认值为null
数组元素调用:
int a=ages[1];
3.2 数组遍历
3.2.1 获取数组长度
int[] ages = { 34, 12, 56, 78, 98, 52, 12, 24 };
int L=ages.Length;
3.2.2 采用For循环遍历
int[] ages = { 34, 12, 56, 78, 98, 52, 12, 24 };
for(int i = 0; i < 8; i++)
{
Console.WriteLine(ages[i]);
}
3.2.3 采用While循环遍历
int[] ages = { 34, 12, 56, 78, 98, 52, 12, 24 };
int i=0;
while (i < 8)
{
Console.WriteLine(ages[i]);
i++;
}
3.2.4 采用foreach遍历(特定方法+只能正序遍历)
int[] ages = { 34, 12, 56, 78, 98, 52, 12, 24 };
foreach(int temp in ages)
{
Console.WriteLine(temp);
}
3.3 字符串操作
字符串可以看作一个字符数组
3.3.1 字符串遍历
string name = " abcD,Efg";;
for(int i = 0; i < name.Length; i++)
{
Console.WriteLine(name[i]);
}
3.3.2 字符串常用方法
string str1 = name.ToLower();
string str2 = name.ToUpper();
string str3 = name.Trim();
string str4 = name.TrimEnd();
string str5 = name.TrimStart();
3.3.3 字符串分割
string[] str6Array = name.Split(',');
3.3.4 字符串转换
字符串可以获取其中某个元素的值,但是不能修改。如果需要修改,需要将其转换为字符数组。
char[] str7Array = name.ToCharArray();
3.3.5 系统方法排序
C#中提供了对数组(整数、字符串、字符)数组排序的方法
Array.Sort(intArray);
举例:
Console.WriteLine("输入一组字符串:");
string str = Console.ReadLine();
string[] strArray = str.Split(' ');
int[] intArray = new int[strArray.Length];
for (int i = 0; i < strArray.Length; i++)
{
intArray[i] = Convert.ToInt32(strArray[i]);
}
Array.Sort(intArray);
foreach (int temp in intArray)
{
Console.Write(temp + " ");
}
char[] charArray = { 'a', 'b', 'd', 'c' };
Array.Sort(charArray);
foreach(char temp in charArray)
{
Console.Write(temp + " ");
}
3.3.6 练习1-插入字符
using System;
namespace _027_数组
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("输入一个从小到大排列好的整数数组");
string str_1 = Console.ReadLine();
Console.WriteLine("输入要插入的数字");
int num = Convert.ToInt32(Console.ReadLine());
int Index=0;
string result = "";
string[] strArray = str_1.Split(' ');
int[] intArray = new int[strArray.Length+1];
for(int i = 0; i < strArray.Length; i++)
{
intArray[i] = Convert.ToInt32(strArray[i]);
}
if (num < intArray[0])
{
Index = 0;
}
else if (num >= intArray[strArray.Length - 1])
{
intArray[strArray.Length] = num;
Index = strArray.Length;
}
else
{
for (int i = 0; i < strArray.Length; i++)
{
if((intArray[i]<num)&&(intArray[i+1] >= num))
{
Index = i + 1;
break;
}
}
}
if (Index != strArray.Length)
{
for (int i= strArray.Length; i > Index; i--)
{
int temp = intArray[i];
intArray[i] = intArray[i-1];
intArray[i-1] = temp;
}
intArray[Index] = num;
}
for(int i = 0; i < intArray.Length; i++)
{
result += intArray[i] + " ";
}
Console.WriteLine(result);
}
}
}
3.3.7 练习2-排序
string str = Console.ReadLine();
string[] strArray = str.Split(' ');
for (int i = 0; i < strArray.Length; i++)
{
for (int j = i + 1; j < strArray.Length; j++)
{
if (Convert.ToInt32(strArray[i]) > Convert.ToInt32(strArray[j]))
{
string a = strArray[i];
strArray[i] = strArray[j];
strArray[j] = a;
}
}
}
string result = "";
for (int i = 0; i < strArray.Length; i++)
{
result += strArray[i] + " ";
}
Console.WriteLine(result);
Console.WriteLine("请输入一串整数字符串:");
string str = Console.ReadLine();
string[] strArray = str.Split(' ');
int[] intArray = new int[strArray.Length];
for(int i = 0; i < strArray.Length; i++)
{
intArray[i] = Convert.ToInt32(strArray[i]);
}
for(int i = 0; i < intArray.Length - 1; i++)
{
bool isChange = false;
for(int j=0;j< intArray.Length - 1 - i; j++)
{
if (intArray[j] > intArray[j+1])
{
int temp = intArray[j];
intArray[j] = intArray[j + 1];
intArray[j + 1] = temp;
isChange = true;
}
}
if (isChange == false)
{
break;
}
}
foreach(int temp in intArray)
{
Console.Write(temp + " ");
}
3.3.8 练习3-回文
Console.WriteLine("请输入一个字符串:");
string str = Console.ReadLine();
bool isHuiwen = true;
char[] charArray = str.ToCharArray();
char[] backArray = new char[charArray.Length];
for (int i = 0; i < charArray.Length; i++)
{
backArray[i] = charArray[str.Length - 1 - i];
}
for (int i = 0; i < charArray.Length; i++)
{
if (backArray[i] != charArray[i])
{
isHuiwen = false;
break;
}
}
if (isHuiwen == true)
{
Console.WriteLine("这个字符串是回文");
}
else
{
Console.WriteLine("这个字符串不是回文");
}
for (int i = 0; i < str.Length / 2; i++)
{
if (str[i] != str[str.Length - 1 - i])
{
isHuiwen = false;
break;
}
}
if (isHuiwen == true)
{
Console.WriteLine("这个字符串是回文");
}
else
{
Console.WriteLine("这个字符串不是回文");
}
string back = "";
for(int i = 0; i < str.Length; i++)
{
back += str[str.Length-1-i] + "";
}
if (str != back)
isHuiwen = false;
if (isHuiwen == true)
{
Console.WriteLine("这个字符串是回文");
}
else
{
Console.WriteLine("这个字符串不是回文");
}
4 模拟法
通过程序模拟事件的发生来预测结果。 练习: 张三每个月从妈妈那里获取300元,计算当月花销,将剩余的整百金额存储到妈妈手中,自己留下零钱。如此经过12个月,妈妈会将存储的钱以120%的比例还给张三,问张三最终有多少钱?
using System;
namespace _029_模拟法
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请输入12个月的预算:");
string budget = Console.ReadLine();
string[] budgetArray = budget.Split(' ');
int[] budgetInt = new int[budgetArray.Length];
for(int i = 0; i < budgetInt.Length; i++)
{
budgetInt[i] = Convert.ToInt32(budgetArray[i]);
}
int residue=0;
bool isExceed = false;
int Index=0;
int storage = 0;
for(int i=0;i< budgetInt.Length; i++)
{
if (residue + 300 - budgetInt[i] < 0)
{
Index = i+1;
isExceed = true;
break;
}
else if ((residue + 300 - budgetInt[i]) / 100 > 0)
{
storage += (residue + 300 - budgetInt[i]) / 100 * 100;
residue = (residue + 300 - budgetInt[i]) % 100;
}
else
{
residue= (residue + 300 - budgetInt[i]) % 100;
}
}
if (isExceed == false)
{
Console.WriteLine("张三最终会有:" + (residue + storage * 1.2));
}
else
{
Console.WriteLine(-Index);
}
}
}
}
5 函数(Function)
5.1 函数定义与调用
目的:避免重复执行一段代码 函数定义:
static void(bool,int,string) 函数名(参数类型 参数名1,参数类型 参数名2) { 函数体; return 返回值; }
static是修饰符,表示静态方法 void代表返回值为空,函数类型应该和返回值类型保持一致
static bool VerifyUsername(string username,string username2="a")
{
Console.WriteLine("校验用户名"+username);
return true;
}
函数中的return可以起到break的作用,return之后的代码不再执行
函数调用:
VerifyUsername(参数1,参数2);
如果有返回值的话:
bool a=VerifyUsername("张三","李四");
练习:判断真素数
using System;
namespace _030_函数
{
class Program
{
static int[] GetInput()
{
Console.WriteLine("请输入一个整数数组:");
string str = Console.ReadLine();
string[] strArray = str.Split(' ');
int[] intArray = new int[strArray.Length];
for (int i = 0; i < strArray.Length; i++)
{
intArray[i] = Convert.ToInt32(strArray[i]);
}
return intArray;
}
static bool IsSu(int number)
{
bool isSu = true;
for (int j = 2; j < number; j++)
{
if (number % j == 0)
{
isSu = false;
break;
}
}
return isSu;
}
static void Main(string[] args)
{
int[] intArray=GetInput();
int M = intArray[0];
int N = intArray[1];
for(int i = M; i <= N; i++)
{
bool isSu = IsSu(i);
if (isSu)
{
int temp = i;
int number = 0;
while (temp / 10 != 0|| temp%10!=0)
{
number = number * 10 + temp % 10;
temp = temp / 10;
}
bool isSuFan = IsSu(number);
if (isSuFan)
{
Console.Write(i + " ");
}
}
}
}
}
}
5.2 函数中的参数数组
参数数组与数组参数的区别:
- 形式不同
参数数组:static int Add1(params int[] array) 可以输入任意个参数,系统自动转换为数组的形式 … 数组参数:static int Add1(int[] array) 输入的参数必须是一个数组的形式 - 示例:
数组参数:
using System;
namespace _031_参数数组
{
class Program
{
static int Add1(int[] array)
{
int sum=0;
foreach(int temp in array)
{
sum += temp;
}
return sum;
}
static void Main(string[] args)
{
int[] a = { 1, 2, 3, 4, 5 };
int b = Add1(a);
Console.WriteLine(b);
}
}
}
参数数组:
using System;
namespace _031_参数数组
{
class Program
{
static int Add1(params int[] array)
{
int sum=0;
foreach(int temp in array)
{
sum += temp;
}
return sum;
}
static void Main(string[] args)
{
int b = Add1(1,2,3,4,5);
Console.WriteLine(b);
}
}
}
5.3 函数的重载(Overload)
为什么要使用函数重载? 假设我们有一个函数用来实现求得一个数组的最大值
static int MaxValue(int[] intArray) { … return; }
这个函数只能用来处理int数组,如果想处理double类型的话需要再定义一个函数
static double MaxValue(double[] doubleArray) { … return; }
函数名相同,参数不同,这个叫做函数的重载(编译器根据你传递过来的实参的类型去识别应该调用哪一个函数)
示例:分别求得整数数组和浮点数数组中的最大值
using System;
namespace _033_函数的重载
{
class Program
{
static int MaxValue(int[] array)
{
int max=array[0];
for(int i = 1; i < array.Length; i++)
{
if (max < array[i])
{
max = array[i];
}
}
return max;
}
static double MaxValue(double[] array)
{
double max = array[0];
for (int i = 1; i < array.Length; i++)
{
if (max < array[i])
{
max = array[i];
}
}
return max;
}
static void Main(string[] args)
{
int[] intArray = { 1, 2, 3, 4, 5, 6, 8, 9 };
double[] doubleArray = { 1.0, 3.0, 5.0, 8.0, 15.3 };
Console.WriteLine(MaxValue(intArray));
Console.WriteLine(MaxValue(doubleArray));
}
}
}
5.4 递归函数
示例:
f
(
n
)
=
f
(
n
?
1
)
+
f
(
n
?
2
)
,
f
(
0
)
=
2
,
f
(
1
)
=
3
,
求
f
(
40
)
?
f(n)=f(n-1)+f(n-2),f(0)=2,f(1)=3,求f(40)?
f(n)=f(n?1)+f(n?2),f(0)=2,f(1)=3,求f(40)?
int a0 = 2, a1 = 3;
int a2 = 0;
for (int i = 2; i <= 40; i++)
{
a2 = a0 + a1;
a0 = a1;
a1 = a2;
}
Console.WriteLine(a2);
static int F(int n)
{
if (n == 0)
{
return 2;
}
if (n == 1)
{
return 3;
}
int res= F(n - 1) + F(n - 2);
return res;
}
static void Main(string[] args)
{
int fn = F(40);
Console.WriteLine(fn);
}
练习1:求阶乘(10)
static int JieCheng(int n)
{
if (n == 1)
return 1;
int res = n * JieCheng(n - 1);
return res;
}
static void Main(string[] args)
{
int result = JieCheng(10);
Console.WriteLine(result);
}
练习2:
1
!
+
2
!
+
?
+
10
!
=
?
1!+2!+\dots+10!=?
1!+2!+?+10!=?
Console.WriteLine("请输入一个数字:");
int n = Convert.ToInt32(Console.ReadLine());
int result = 0;
for (int i = 1; i <= n; i++)
{
int jiecheng = 1;
for (int j = 1; j <= i; j++)
{
jiecheng = jiecheng * j;
}
result += jiecheng;
}
Console.WriteLine(result);
static int JieCheng(int n)
{
if (n == 1)
return 1;
int res = n * JieCheng(n - 1);
return res;
}
static int SumJC(int n)
{
if (n == 1)
return 1;
return SumJC(n - 1) + JieCheng(n);
}
static void Main(string[] args)
{
Console.WriteLine("请输入一个数字:");
int n = Convert.ToInt32(Console.ReadLine());
int result = SumJC(n);
Console.WriteLine(result);
}
6 常量
const int PI=3.1415926;
(常量的所有字母一般都使用大写)
7 枚举类型
7.1 定义和调用
声明枚举类型:
enum <enum_name>
{
value1,value2,value3,···,valuen
}
定义或调用枚举类型
<enum_name> 变量名=<enum_name>.<value1>;
7.1 枚举类型特点
枚举列表中每一个符号代表一个整数值,一个比它前面符号大的整数值。默认情况下,第一个枚举符号的值是0,可以修改默认的值
举例:
enum Week
{
Mon,Tue,Wed,Thu,Fri,Sat,Sun
}
默认 Mon=0,Tue=1,Wed=2,··· ,Sun=6 想要输出数值,采用如下程序:
Week day = Week.Fri;
int a = (int)day;
Console.WriteLine(a);
枚举列表中的元素对应的数值也能改变
enum Week
{
Mon=5,Tue,Wed,Thu,Fri,Sat,Sun
}
此时, Mon=5,Tue=6,Wed=7,··· ,Sun=12
8 结构体
8.1 结构体定义和调用
定义(声明):
struct <name>
{
访问权限 type typename;
访问权限 type typename;
访问权限 type typename;
}
示例:
struct StudentInfo
{
public int age;
public string name;
public int grade;
public int id;
}
调用:
static void Main(string[] args)
{
StudentInfo student1;
student1.age = 10;
student1.name = "XiaoQiang";
student1.grade = 2;
student1.id = 12345;
Console.WriteLine(student1.id);
}
定义一个结构体数组(用来存储多个结构体变量):
StudentInfo[] student = new StudentInfo[10];
student[0].age = 10;
8.2 练习:定义并打印三维物体坐标
struct Position
{
public double x;
public double y;
public double z;
}
static void PrintPosition(Position p)
{
Console.WriteLine(p.x + "," + p.y + "," + p.z);
}
static void Main(string[] args)
{
Position p1;
p1.x = 100;
p1.y = 12.2;
p1.z = 16.3;
PrintPosition(p1);
}
struct Position
{
public double x;
public double y;
public double z;
public void PrintPosition()
{
Console.WriteLine(x + "," + y + "," + z);
}
}
static void Main(string[] args)
{
Position p1;
p1.x = 100;
p1.y = 12.2;
p1.z = 16.3;
p1.PrintPosition();
}
8.3 练习:输出人的名字
struct CustomerName
{
public string firstName;
public string lastName;
public string FullName()
{
return firstName + lastName;
}
}
static void Main(string[] args)
{
CustomerName name;
name.firstName = "三";
name.lastName = "张";
Console.WriteLine(name.FullName());
}
8.4 结构体定义一个三维向量,并输出向量的模
using System;
namespace _037_结构体练习
{
class Program
{
struct Vector3
{
public double x;
public double y;
public double z;
public double Distance()
{
double temp = x * x + y * y + z * z;
return Math.Sqrt(temp);
}
}
static void Main(string[] args)
{
Vector3 v1;
v1.x = 5;
v1.y = 15;
v1.z = 20;
v1.Distance();
Console.WriteLine(v1.Distance());
}
}
}
9 委托(delegate)
委托的作用类似于函数调用,委托的定义制定了一个返回类型和一个参数列表。 定义了委托之后,就可以指定该委托类型的变量,接着可以把一个返回类型和参数列表与委托一样的函数赋值给这个变量。
delegate double Mydelegate(double para1, double para2);
包括返回类型、参数列表和委托名
Mydelegate delegate1;
delegate1 = Multiply;
示例:委托一个乘法函数
using System;
namespace _038_委托
{
class Program
{
static double Multiply(double para1,double para2)
{
return para1 * para2;
}
static double Divide(double para1,double para2)
{
return para1 / para2;
}
delegate double Mydelegate(double para1, double para2);
static void Main(string[] args)
{
Mydelegate delegate1;
delegate1 = Multiply;
Console.WriteLine(delegate1(2, 4));
}
}
}
- 练习1:
将某一个函数作为另一个函数的内置变量(通过委托实现)
using System;
namespace _039_委托练习
{
delegate void OndieDelegate();
class Program
{
static void Play(OndieDelegate onDie)
{
Console.WriteLine("做任务");
Console.WriteLine("战斗");
Console.WriteLine("死亡");
onDie();
}
static void ShowDieUI()
{
Console.WriteLine("死亡后的UI界面显示");
Console.WriteLine("返回首页 或 重新游戏 UI显示");
}
static void Main(string[] args)
{
Play(ShowDieUI);
}
}
}
10 类(class)
10.1 类的定义和使用
class Enemy
{
public string name;
int hp;
}
类的声明(对象的定义)
Enemy enemy1 = new Enemy();
enemy1.name = "Wq";
类的继承
public class Csharp_study : MonoBehaviour{}
暂时结束,日后再进行补充
|