C# 阶段总结

数据类型--变量与常量--运算符与表达式--语句(if,for)--数组--函数--结构体

一、数据类型:
(一)内建类型
整型(int short long byte uint ushort ulong sbyte),浮点(double float decimal),布尔(bool),字符(char)。

对于整型和浮点型都有个ToString("格式化字符串"):
 #——任意一个数字。有的话就显示,没有就不显示。
 0——必须有一个数字,没有的话就补零。
 .——小数点
 ,——千位分隔。

 

(二)常用的类
Math DateTime string
Math:
 Math.Ceiling(double ):大于当前小数的最小整数。
 Math.Floor(double):小于当前小数的最大整数。
 Math.Round(double):四舍五入

DateTime:
 Year,Month,Day,Hour,Minute,Second,MilliSecond,DayOfWeek,DayOfYear
 AddYears(n),AddMonths(),AddDays().........
 ToString("格式化字符串"):格式显示。
 yyyy,yy——年份。MM,M——月份。dd,d——天。hh,h——时。mm,m——分。ss,s——秒。ms——毫秒


(三)自定义类型
struct

二、变量与常量
(一)变量就是装数据容器。——U盘
定义:
 数据类型 变量名[ = 值],变量名[ = 值],....;
  int a,b; int a = 5,b;
 变量的命名规则:
  1.变量名只能由字母、数字、下划线组成
  2.只能字母,下划线开头
  3.不能与关键词重复。

赋值:
 变量名=值;——注意:变量类型与等号右边的值类型相一致。不一致就需要进行类型转换。
 类型转换:
  1.自动转换:一般来说自动转换,只要不存在丢数据的可能性,计算就会自动转化。例如:double a = 3+5.0;
  2.强制转换:只要存在丢数据的可能性,计算机就不给自动转化,需要手动强制转化。
   Convert.Toxxx(); Convert.ToInt32();
   double a = 3.14;
   int b = (int)a;

取值:直接写变量名。

(二)常量:常量也是装数据的容器,但在运算过程中常量不能放在单等的左边。——一次性光盘
分类:字面常量,符号常量。 
定义:const int PI = 3.14;
注意:常量在定义的时候必须要赋值。
取值:直接使用常量取值。

三、运算符:
算术,关系,逻辑,其它
(一)算术——7
+ - * / % ++ --
整数除整数还是整数。
(二)关系——6
== != > >= < <=
(三)逻辑——3
&&  ||  !
(四)其它
1.复合运算符:+= -= *= /= %=
2.赋值: =   
3.条件运算符:表达式1?表达式2:表达式3

四、语句:顺序、分支、循环:

(一)分支——if
if(表达式)
{
}

if(表达式)
{
}
else
{
}

if(表达式)
{
}
else if(表达式)
{
}
...

else
{
}

if(表达式)
{
       if(表达式)
       {
       }
       else
       {
       }
}

else
{
     ...
}

例子:
1.判断闰年,平年

            int year;
            //输入
            Console.Write("请输入一个年份:");
            year = Convert.ToInt32(Console.ReadLine());

            //运算
            //能被400整除;或能被4整除,但不能被100整除。
            if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0))
            {
                Console.WriteLine("是闰年");
            }
            else
            {
                Console.WriteLine("是平年");
            }

2.一元二次方程根的情况

            int a, b, c;
           //输入;
            Console.Write("请输入系数a:");
            a = Convert.ToInt32(Console.ReadLine());
            Console.Write("请输入系数b:");
            b = Convert.ToInt32(Console.ReadLine());
            Console.Write("请输入系数c:");
            c = Convert.ToInt32(Console.ReadLine());

            //运算输出
            if (a == 0)
            {
                Console.WriteLine("不是一元二次方程");
            }
            else
            {
                int d = b * b - 4 * a * c;
                if (d > 0)
                {
                    Console.WriteLine("两个不等实根");
                }
                else if (d == 0)
                {
                    Console.WriteLine("两个相等实根");
                }
                else
                {
                    Console.WriteLine("无实根");
                }
            }

3.男女体重与身高

            string sex;
            int weight, height;
            //输入
            Console.Write("性别(男,女):");
            sex = Console.ReadLine();
            Console.Write("身高(CM):");
            height = Convert.ToInt32(Console.ReadLine());
            Console.Write("体重(KG):");
            weight = Convert.ToInt32(Console.ReadLine());

            int biaoZhunTiZhong=0;
            //运算输出
            if(sex == "")
            {
                //求标准体重
                biaoZhunTiZhong = height - 100;
            }
            else if(sex == "")
            {
                //求标准体重
                biaoZhunTiZhong = height - 110;
            }
            else
            {
                Console.WriteLine("性别不正确");
            }

            //求体重差
            int tiZhongCha = weight - biaoZhunTiZhong;
            if (tiZhongCha >= -3 && tiZhongCha <= 3)
            {
                Console.WriteLine("体重正常,继续保持!");
            }
            else if (tiZhongCha < -3)
            {
                Console.WriteLine("偏瘦,注意增加营养");
            }
            else
            {
                Console.WriteLine("偏胖,注意运动减肥");
            }

4.判断日期是否正确。

            int year = 0, month = 0, day = 0;
            //输入
            Console.Write("请输入年:");
            year = Convert.ToInt32(Console.ReadLine());
            Console.Write("请输入月:");
            month = Convert.ToInt32(Console.ReadLine());
            Console.Write("请输入日:");
            day = Convert.ToInt32(Console.ReadLine());

            //判断运算输出
            //判断年份是否正确
            if(year < 0 || year>9999)
            {
                Console.WriteLine("年输入不正确");
            }
            else
            {
                Console.WriteLine("年正确");
            }

            //判断月份是否正确
            if (month < 1 || month > 12)
            {
                Console.WriteLine("月输入不正确");
            }
            else
            {
                Console.WriteLine("月正确");
            }

            //判断天是否正确
            if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
            {
                if(day < 1 || day>31)
                {
                    Console.WriteLine("天输入错误,大月份最多是31天");
                }
                else
                {
                    Console.WriteLine("天正确");
                }
            }
            else if (month == 4 || month == 6 || month == 9 || month == 11)
            {
                if (day < 1 || day > 30)
                {
                    Console.WriteLine("天输入错误,小月份最多是30天");
                }
                else
                {
                    Console.WriteLine("天正确");
                }
            }
            else if(month == 2)
            {
                //闰年与平年的判断
                if(year%400==0 || year%4==0&&year%100!=0)
                {
                    //闰年
                    if (day < 1 || day > 29)
                    {
                        Console.WriteLine("天输入错误,闰年2月份最多是29天");
                    }
                    else
                    {
                        Console.WriteLine("天正确");
                    }
                }
                else
                {
                    //平年
                    if (day < 1 || day > 28)
                    {
                        Console.WriteLine("天输入错误,平年2月份最多是28天");
                    }
                    else
                    {
                        Console.WriteLine("天正确");
                    }
                }
            }

(二)循环
for(初始条件;循环条件;变量改变)
{
      循环体
}

循环的四要素:

循环的嵌套:打印星号。

            //一、
            for (int i = 1; i <= 5; i++)
            {
                for (int m = 1; m <= 5 - i; m++)
                {
                    Console.Write(" ");
                }
                for (int n = 1; n <= 2 * i - 1; n++)
                {
                    Console.Write("*");
                }
                Console.WriteLine();
            }

            //二、
            for (int i = 1; i <= 5; i++)
            {
                for (int m = 1; m <= 5 - i; m++)
                {
                    Console.Write(" ");
                }
                for (int n = 1; n <= i; n++)
                {
                    Console.Write("*");
                }
                Console.WriteLine();
            }

            //三、
            for (int i = 1; i <= 5; i++)
            {
                for (int j = 1; j <= 6 - i; j++)
                {
                    Console.Write("*");
                }
                Console.WriteLine();
            }

两类问题:迭代法,穷举法。

迭代法: 按照某种规律通过循环迭代求解。
求100以内数的和,求阶乘。

        //求前100个数的和
            int sum = 0;
            for (int i = 1; i <= 1000; i++)
            {
                sum = sum + i;
            }
            Console.WriteLine(sum);

        //求阶乘   5! = 5*4*3*2*1 = 5*4!;
            int jc = 1;
            for(int i=1;i<=5;i++)
            {
                jc = jc * i;
            }
            Console.WriteLine(jc);

1.求年龄:有5个小孩子排在一起,第一个比第二个小2岁,第二个比第三个小2岁,第三个比第四个小2岁,第5个16岁。求第一个多少岁?

            int age = 16; //初始情况下,存的是第5个小孩子年龄,每次循环都会减2,分别代表第5,4,3,2,1个小孩子的年龄。
            for (int i = 5; i >= 1; i--)
            {
                age = age - 2;
            }
            Console.WriteLine(age);

2.棋盘上放粮食

            decimal a = 1, b = 0;
            for (int i=1;i<=64 ;i++ )
            {
                a = a * 2;
                b = a + i;
            }
            Console.WriteLine("第64格应该放:"+b+"粒粮食");
            decimal weight单=(decimal)0.00002;
            decimal weight总 = weight单 * b;
            Console.WriteLine("棋盘粮食一共重"+weight总+"kg");

3.折纸与珠峰的高度。

            double h = 0.00015;
            for (int i = 1; i <= 26; i++)
            {
                h = h * 2;
            }
            Console.WriteLine(h);

4.落球问题。
5.猴子吃桃子

            int count = 1;
            for(int i=6;i>=1;i--)
            {
                count = (count + 1) * 2;
            }
            Console.WriteLine(count);

6.兔子小兔子的问题。一对新生兔,到三个月开始生一对小兔,以后每个月都会生一对小兔,小兔不断长大也会生小兔。假设兔子不死,每次只能生一对(公母),问第24个月末有多少只兔子?

            int tu1 = 1, tu2 = 1; //tu1是倒数第一个月的兔子数,tu2是倒数第二个月的兔子数
            int tu=0;//要求的这个月的兔子数。

            for (int i = 3; i <= 24; i++)
            {
                tu = tu1 + tu2;
                tu2 = tu1;
                tu1 = tu;
                
            }
            Console.WriteLine(tu);

穷举法:把所有的情况都走一遍,根据条件筛选。
求100以内与7相关的数。

for (int a=1;a<=100 ;a++ )
{
if(a%7==0||1%7==0||a/10==7)
{
        Console.WriteLine("100以内与7有关的数是"+a);
}
1.买东西。小张过元旦发了100元的购物券,他要买香皂(5元),牙刷(2元),洗发水(20元)。要想把100元正好花完,如何买这三样东西?

for (int a = 0; a <= 20;a++ )
            {
                for (int b = 0; b <= 50; b++) 
                {
                    for (int c = 0; c <= 5; c++) 
                    {
                        if (a * 5 + b * 2 + c * 20 == 100) 
                        {
                            Console.WriteLine(""+a+"块肥皂,买"+b+"个牙刷,买"+c+"支牙膏,共花费100元");
                        }
                    }
                }
            }

2.百鸡百钱。有100文钱,要买100只鸡回家。公鸡2文钱一只,母鸡1文钱一只,小鸡半文钱一只。如何买?
百马百石。有100石粮食,母匹大马驮2石,每匹中马驮1石,每两匹小马驹一起驮1石。要用100匹马驮完100石粮食,如何按排?

for (int gj = 0; gj <= 50; gj++) 
            {
                for (int mj = 0; mj <= 100; mj++) 
                {
                    for (int xj = 0; xj <= 200; xj++) 
                    {
                        if (gj * 2 + mj * 1 + xj * 0.5 == 100&&gj+mj+xj==100) 
                        {
                            Console.WriteLine("买公鸡"+gj+"只,买母鸡"+mj+"只,买小鸡"+xj+"");
                        }
                    }
                }
            }

3.某侦察队接到一项紧急任务,要求在A、B、C、D、E、F六个队员中尽可能多地挑若干人,但有以下限制条件:
A和B两人中至少去一人;      a+b>=1
A和D不能一起去;              a+d<=1
A、E和F三人中要派两人去; a+e+f==2
B和C都去或都不去;           b+c!=1
C和D两人中去一个;           c+d==1
若D不去,则E也不去。        d+e==0||d==1
问应当让哪几个人去?

            for(int a=0;a<=1;a++) //0不去,1去。
            {
                for(int b=0;b<=1;b++)
                {
                    for(int c=0;c<=1;c++)
                    {
                        for(int d=0;d<=1;d++)
                        {
                            for(int e=0;e<=1;e++)
                            {
                                for(int f=0;f<=1;f++)
                                {
                                    if (a + b >= 1 && a + d <= 1 && a + e + f == 2 && b + c != 1 && c + d == 1 && (d + e == 0 || d == 1))
                                    {
                                        Console.WriteLine("A="+a+";B="+b+";C="+c+";D="+d+";E="+e+";F="+f);
                                    }
                                }
                            }
                        }
                    }
                }
            }

4.求等式。

五、数组:
思想:解决大量同类数据存储和操作的问题。
特点:连续,同一类数据。
分类:一维数组,二维数组,多维数组。

一维数组:
定义:
 数据类型[] 数组名 = new 数据类型[数组的长度] [{初始化}];
赋值:
 数组名[下标] = 值;
 可以与循环结合起来。
取值:
 数组名[下标];
 可以与循环结合起来。

例子:
1.球员打分

            int[] a = new int[6];

            Console.WriteLine("********球员训练记录********");

            //输入
            for (int i = 0; i < a.Length; i++)
            {
                Console.Write("请输入第"+(i+1)+"个球员的成绩:");
                a[i] = Convert.ToInt32(Console.ReadLine());
            }
            
            //输出每个球员的分
            for(int j=0;j<a.Length;j++)
            {
                Console.WriteLine(""+(j+1)+"位球员的分数是"+a[j]+"分。");
            }
            //计算并显示总分和平均分。
            int sum = 0;
            for(int i=0;i<a.Length;i++)
            {
                sum = sum + a[i];
            }
            double avg = 0;

            avg = 1.0 * sum / a.Length;
            Console.WriteLine("总分是:" + sum + "。平均分是:" + avg + "");

2.选班长

            //30人投票,从5个候选人选一个出来。
            int[] vote = new int[5];
            for(int i=0;i<30;i++)
            {
                Console.Write("请第"+(i+1)+"位同学投票(0-4):");
                int temp = Convert.ToInt32(Console.ReadLine());
                if(temp <0 || temp >4)
                {
                    Console.WriteLine("废票");
                    continue;
                }
                else
                {
                    vote[temp]++;
                }
            }

            //计算最终得票。
            int max = 0, maxSub = 0;
            for(int i=0;i<vote.Length;i++)
            {
                //把每位候选人的票数显示出来。
                Console.WriteLine("" + (i + 1) + "号候选人的票数是:" + vote[i]); 
                //计算最大值。
                if(vote[i] > max)
                {
                    max = vote[i];
                    maxSub = i;
                }
            }

            //显示最终结果。
            Console.WriteLine("最终投票结果为:"+(maxSub+1)+"号候选人当选,当选票数是"+max+"票。");

3.36选7

            int[] a = new int[7];

            Random rand = new Random();
            for (int i = 0; i < 7; i++)    //7--代表要生成7个不同的数
            {
                //生成一个随机数。
                int n = rand.Next(36);
                n++;
                
                //查重
                bool chong = false;
                for(int j=0;j<a.Length;j++)
                {
                    if(n == a[j])
                    {
                        chong = true;
                        break;
                    }
                }
                //才能确定n合不合理
                if(chong == false)
                {
                    a[i] = n;
                }
                else
                {
                    i--;
                }//if
            }//for

            //显示彩票号码
            for(int k = 0;k<a.Length;k++)
            {
                Console.Write(a[k] + "\t");
            }

3.青歌赛。

        static void Main(string[] args)
        {
            int[] a = new int[10];
            //亮分
            ShuRu(a);

            //排序
            PaiXu(a);

            //运算求平均
            double avg = YunSuan(a);

            //输出显示
            ShuChu(a, avg);
        }

        private static void ShuChu(int[] a, double avg)
        {
            Console.WriteLine("去掉两个最高分:" + a[0] + "" + a[1]);
            Console.WriteLine("去掉两个最低分:" + a[a.Length - 1] + "" + a[a.Length - 2]);
            Console.WriteLine("该选手最终得分为:" + avg);
        }

        private static double YunSuan(int[] a)
        {
            //求总分
            int sum = 0;
            for (int i = 2; i <= a.Length - 3; i++)
            {
                sum += a[i];
            }
            //求平均
            double avg = (1.0 * sum) / (a.Length - 4);
            return avg;
        }

        private static void PaiXu(int[] a)
        {
            for (int i = 1; i <= a.Length - 1; i++)
            {
                for (int j = 1; j <= a.Length - i; j++)
                {
                    if (a[j] > a[j - 1])
                    {
                        int temp = a[j];
                        a[j] = a[j - 1];
                        a[j - 1] = temp;
                    }
                }
            }
        }

        private static void ShuRu(int[] a)
        {
            for (int i = 0; i < a.Length; i++)
            {
                Console.Write("请第" + (i + 1) + "号评委亮分:");
                a[i] = Convert.ToInt32(Console.ReadLine());
            }
        }

二维数组:
定义:
 数据类型[,] 数组名 = new 数组类型[行数,列数] [{初始化}];
赋值:
 数组名[行下标,列下标] = 值;
取值:
 数组名[行下标,列下标];

例子:
1.学生成绩。

            int[,] a = new int[3, 4];
            //输入
            for(int i=0;i<3;i++)
            {
                //自动生成学号
                a[i, 0] = i+1;
                //语文成绩
                Console.Write("语文:");
                a[i, 1] = Convert.ToInt32(Console.ReadLine());
                //数学成绩
                Console.Write("数学:");
                a[i, 2] = Convert.ToInt32(Console.ReadLine());
                //计算总分
                a[i, 3] = a[i, 1] + a[i, 2];
            }
            
            //显示
            Console.WriteLine("学号\t语文\t数学\t总分");
            for(int i=0;i<3;i++)
            {
               for(int j=0;j<4;j++)
               {
                   Console.Write(a[i, j] + "\t");
               }
               Console.WriteLine();
            }

2.推箱子。

            int[,] map = new int[10, 10]
            {
                {1,1,1,1,1,1,1,1,1,1},
                {1,0,0,0,0,1,0,0,0,1},
                {1,8,0,0,0,1,0,0,0,1},
                {1,0,0,0,0,1,1,1,0,1},
                {1,0,0,0,0,0,0,1,0,1},
                {1,0,0,0,1,0,0,1,0,1},
                {1,0,0,0,1,0,0,0,0,1},
                {1,1,1,1,1,0,0,0,0,1},
                {1,0,0,0,0,0,0,0,9,1},
                {1,1,1,1,1,1,1,1,1,1}
            };

                for (int i = 0; i < 10; i++)
                {
                    for (int j = 0; j < 10; j++)
                    {
                        if (map[i, j] == 1)
                        {
                            Console.Write("");
                        }
                        else if (map[i, j] == 0)
                        {
                            Console.Write("  ");
                        }
                        else if (map[i, j] == 2)
                        {
                            Console.Write("");
                        }
                        else if (map[i, j] == 9)
                        {
                            Console.Write("");
                        }
                        else if (map[i, j] == 8)
                        {
                            Console.Write("");
                        }
                    }
                    Console.WriteLine();
                }

两个应用:二分法查找,冒泡排序。
二分法查找思想:前提是数组有序,每次找中间的值对比,否满足条件就扔一半。
使用最大下标max、最小下标min,中间值下标mid,控制查找的范围。 mid = (max+min)/2;   max = mid+1; min = mid-1;
如果一直查到min>max就结束了,说明没有找到。

冒泡排序的思想:相邻两个数进行依次对比,互换。
两层循环,外层循环趟数,内层循环每趟的次数。
趟数:n-1
次数:n-i

for(int i=1;i<=n-1;i++)
{
        for(int j=1;j<=n-i;j++)
        {
              if(a[j] > a[j-1])
              {
                  互换。
              }
        }
}

六、函数:
什么是函数:能够完成某个独立功能模块就可称之为函数。
为什么要用函数:结构清晰,分工开发,代码重用。
四要素:函数名,形参,返回类型,函数体。
定义语法:
返回类型 函数名(形参列表)
{
    函数体
}

调用:
函数名(实参列表);
数据类型 变量名 = 函数名(实参列表);

函数的传值与传址的问题。
1.内建类型,日期时间都是默认传值。    ——ref
2.数组,字符串默认都是传址。

函数的返回值。——return 值或变量;要保持return后面的类型与函数的返回类型要一致。

递归。自己调自己。
语法思想:
返回类型 函数名(参数)
{
       1.结束递归的判断。
       2.递归运算:函数名(参数);
}

七、结构体:
为什么要用结构体?自己定义的复合类型,更好地模拟生活中的各种对象。

定义
struct 结构体名
{
      public 类型 子变量名;
      public 类型 子变量名;
      ....
}

使用:
结构体名 结构体变量 = new 结构体名();
结构体变量.子变量 = 值;
结构体变量.子变量;

结构体数组:
结构体类型[] 数组名 = new 结构体类型[长度];
数组名[下标].子变量

如何使用循环来操作结构体数组。

例子:学生成绩统计。对战的小游戏。

 

posted @ 2015-01-07 16:11  五月阳光  阅读(192)  评论(0编辑  收藏  举报