你好,看完你的博客文章,感觉很不错!希望与你网站首页友情链接 流量卡知识网 http://53go.cn/ 专注于移动/联通/电信推出的大流量多语音活动长短期套餐手机卡的相关知识的介绍普及听说互换友情链接可以增加网站的收录量,特此来换,如果同意的话就给internetyewu@163.com[微信ganenboy]发信息或者就在此回复下吧!【建站问题也可以一起讨论!】
你好,看完你的博客文章,感觉很不错!希望与你网站首页友情链接 流量卡知识网 http://53go.cn/ 专注于移动/联通/电信推出的大流量多语音活动长短期套餐手机卡的相关知识的介绍普及听说互换友情链接可以增加网站的收录量,特此来换,如果同意的话就给internetyewu@163.com[微信ganenboy]发信息或者就在此回复下吧!【建站问题也可以一起讨论!】
你好
http://bigota.d.miui.com/V14.0.9.0.TLJCNXM/ingres_images_V14.0.9.0.TLJCNXM_20230323.0000.00_13.0_cn_chinatelecom_aff802bb3e.tgz
已添加贵站友链 Southerly 个人博客 || http://www.southerly.top || https://www.southerly.top/imgs/favicon.ico || 一个正在努力搬砖的兼职程序员,记录生活,分享生活,欢迎大家来访。
目前这种不行了
老哥呀,现在这种方法还能爬到数据嘛?可以聊聊不
https://www.aliyundrive.com/s/5N2bKDVZfxC
https://wwi.lanzoup.com/iU6FZ0o4as1i
04824ADB9F824ADB9F0400824ADB9F000F
https://lihh.lanzouf.com/ij6c80nhq7rg
https://cloud.189.cn/web/share?code=FvuIbuJBnEVr
https://lihh.lanzouf.com/ij6c80nhq7rg
https://developer.aliyun.com/plan/student?taskCode=vmfeitian2023&recordId=5246709&undefined&share_source=copy_link
已加,三天之后检查没加本站链接 就下了
首页
大佬聚集地
欢迎大家
教程分享
每日一看
Search
1
欢迎来到河马博客
41,755 阅读
2
守护者群管小栗子框架下载教程
40,885 阅读
3
烟花模拟器(php)
35,661 阅读
4
外链搜索引擎优化如何发布
13,617 阅读
5
一键搭建表白墙源码+教程
13,255 阅读
软件分享
教程分享
源码分享
游戏攻略
百科知识
SEO课程
登录
Search
标签搜索
推特
升学考试
账号
数学
饺子
笔记本电脑
笔记本
研究生考试
字符
英语
函数
马斯克
笔记本电脑排名前十
操作
初一
联想
考研
广告
注册
账户
河马
累计撰写
7,218
篇文章
累计收到
81
条评论
今日撰写
50
篇文章
首页
栏目
软件分享
教程分享
源码分享
游戏攻略
百科知识
SEO课程
页面
大佬聚集地
欢迎大家
教程分享
每日一看
用户登录
登录
搜索到
1387
篇与
的结果
2023-12-03
「JAVA8」- 神奇的双":"号
看如下一行代码public class Car {public static Car create(Supplier<Car> supplier){return supplier.get();}public static void main(String[] args) {Car car = Car.create(Car::new);List<Integer> integers = newArrayList<>();integers.stream().mapToInt(Integer::intValue).sum();integers.stream().mapToLong(Long::valueOf).sum();}}生成Car对象用Car::new获取Integer的int值采用Integer::intValue将Integer转化成Long采用Long::valueOf即可。你是否会疑惑这个神奇的"::"是什么?这就是我们Java8中的新特性方法引用。我们可以用一对冒号"::",通过方法的名字来指向一个方法,可以使语言的构造更紧凑简洁,减少冗余代码。疑惑,那Car::new返回的是什么呢?是Car对象吗?Car car = Car::new; 报错Supplier<Car> carSupplier = Car::new; 正确Car::new 返回的是 Supplier<Car> 对象,生成Car 是carSupplier.get时候初始化。那Integer::intValue呢?这里是调用了Integer的iniValue方法。为什么可以这样使用呢?//错误示例int result = Integer::intValue;//正确ToIntFunction<Integer> intFunction = Integer::intValue;再来看一个例子ToIntFunction<Integer> intFunction = Integer::valueOf;ToIntFunction<Integer> intFunction2 = Integer::intValue;这两个都是返回的都是ToIntFunction<Integer>JAVA8中"::"把函数变成了参数,传递到函数里面但是"::"为什么把Car::new转化成了Supplier<Car>,Integer::valueOf转化成了ToIntFunction<Integer>呢?来看Supplier@FunctionalInterfacepublic interface Supplier<T> {/*** Gets a result.** @returna result*/T get();}Supplier有一个get()方法,不需要传入参数返回T对象。Car的new方法,默认构造方法,不需要传入参数,返回Car对象。说到这里还不明白的话,看下面这个例子。public class Car {public static Car generate(){return new Car();}public static void main(String[] args) {Supplier<Car> car= Car::generate;}}Car::generate同样是返回的是Supplier<Car>,generate没有参数,返回的是Car对象,刚好跟Supplier符合。说到这里相信大概大家明白了,"::"将我们的方法转化成了对应的函数式接口举个例子ToIntFunction类@FunctionalInterfacepublic interface ToIntFunction<T> {/*** Applies this function to the given argument.**@param value the function argument* @return the function result*/int applyAsInt(T value);}参数是T,返回int对象。如果我们要使用"::"该如何做呢?public class Car {public static int test(int tst){return 1;}public static void main(String[] args) {ToIntFunction<Integer> integerToIntFunction = Car::test;}}我们只要定义一个方法,有一个输入参数,返回参数是int即可。讲到这里,我们用Java8将List<Integer>转化成List<Long>怎么处理呢?我们看到stream里面有一个方法 /*** Returns a stream consisting of the results of applying the given* function to the elements of this stream.** <p>This is an <a href="package-summary.html#StreamOps">intermediate* operation</a>.**@param<R> The element type of the new stream*@parammapper a <a href="package-summary.html#NonInterference">non-interfering</a>,* <a href="package-summary.html#Statelessness">stateless</a>* function to apply to each element*@return the new stream*/<R> Stream<R> map(Function<? super T, ?extends R> mapper);来看Function@FunctionalInterfacepublic interface Function<T, R> {/*** Applies this function to the given argument.**@param t the function argument* @return the function result*/R apply(T t);返回R,输入一个参数。里面搜索Integer里面的方法。ToLongFunction<Integer>integerToIntFunction = Integer::longValue;立马发现Integer里面有一个longValue符合。最终代码如下List<Integer> test = new ArrayList<>();List<Long> testLong = test.stream().map(Integer::longValue).collect(Collectors.toList());相信大家到了这里,一定明白了,"::"把我们的方法转化成了对应的函数式参数传递进函数里面了。我们再来看看前面学过的Lambda表达式//没有输入参数 返回一个数字,所以对应Supplier<Integer>Supplier<Integer> test =() ->5 ;//输入两个参数,执行对应的方法 所以对应BiConsumer<Integer,Integer>BiConsumer<Integer,Integer> test2 = (x,y) -> {};//输入两个参数,有返回值是否相等, 所以对应BiPredicate<Integer,Integer>BiPredicate<Integer,Integer> test3 =(x,y) -> x.equals(y);以后如果遇到需要使用到的"::"的地方,我们先观察函数参数是什么,需要什么参数,返回什么对象。然后找对应的处理的方法即可。当然,Java 8 函数式接口远不止这些。但是用起来了,让自己的代码帅起来就行。
2023年12月03日
0 阅读
0 评论
0 点赞
2023-12-03
居然可以这样(java中构造器是什么)java中的构造器是什么意思,什么是 Java 构造器?,java构造器是什么,
构造器是编程的强大组件。使用它们来释放 Java 的全部潜力。-- Seth Kenlon(作者)在开源、跨平台编程领域,Java 无疑(?)是无可争议的重量级语言。尽管有许多伟大的跨平台框架,但很少有像 Java 那样统一和直接的。当然,Java 也是一种非常复杂的语言,具有自己的微妙之处和惯例。Java 中与 构造器( constructor)有关的最常见问题之一是:它们是什么,它们的作用是什么?简而言之:构造器是在 Java 中创建新 对象(object)时执行的操作。当 Java 应用程序创建一个你编写的类的实例时,它将检查构造器。如果(该类)存在构造器,则 Java 在创建实例时将运行构造器中的代码。这几句话中包含了大量的技术术语,但是当你看到它的实际应用时就会更加清楚,所以请确保你已经安装了 Java 并准备好进行演示。没有使用构造器的开发日常如果你正在编写 Java 代码,那么你已经在使用构造器了,即使你可能不知道它。Java 中的所有类都有一个构造器,因为即使你没有创建构造器,Java 也会在编译代码时为你生成一个。但是,为了进行演示,请忽略 Java 提供的隐藏构造器(因为默认构造器不添加任何额外的功能),并观察没有显式构造器的情况。假设你正在编写一个简单的 Java 掷骰子应用程序,因为你想为游戏生成一个伪随机数。首先,你可以创建骰子类来表示一个骰子。你玩了很久《龙与地下城》,所以你决定创建一个 20 面的骰子。在这个示例代码中,变量 dice 是整数 20,表示可能的最大掷骰数(一个 20 边骰子的掷骰数不能超过 20)。变量 roll 是最终的随机数的占位符,rand 用作随机数种子。import java.util.Random;public class DiceRoller {private int dice = 20;private int roll;private Random rand = new Random();接下来,在 DiceRoller 类中创建一个函数,以执行计算机模拟模子滚动所必须采取的步骤:从 rand 中获取一个整数并将其分配给 roll变量,考虑到 Java 从 0 开始计数但 20 面的骰子没有 0 值的情况,roll 再加 1 ,然后打印结果。import java.util.Random;public class DiceRoller {private int dice = 20;private int roll;private Random rand = new Random();最后,产生 DiceRoller 类的实例并调用其关键函数 Roller:// main looppublic static void main (String[] args) {System.out.printf("You rolled a ");DiceRoller App = new DiceRoller();App.Roller();}}只要你安装了 Java 开发环境(如 OpenJDK),你就可以在终端上运行你的应用程序:$ java dice.javaYou rolled a 12在本例中,没有显式构造器。这是一个非常有效和合法的 Java 应用程序,但是它有一点局限性。例如,如果你把游戏《龙与地下城》放在一边,晚上去玩一些《快艇骰子》,你将需要六面骰子。在这个简单的例子中,更改代码不会有太多的麻烦,但是在复杂的代码中这不是一个现实的选择。解决这个问题的一种方法是使用构造器。构造函数的作用这个示例项目中的 DiceRoller 类表示一个虚拟骰子工厂:当它被调用时,它创建一个虚拟骰子,然后进行“滚动”。然而,通过编写一个自定义构造器,你可以让掷骰子的应用程序询问你希望模拟哪种类型的骰子。大部分代码都是一样的,除了构造器接受一个表示面数的数字参数。这个数字还不存在,但稍后将创建它。import java.util.Random;public class DiceRoller {private int dice;private int roll;private Random rand = new Random();// constructorpublic DiceRoller(int sides) {dice = sides;}模拟滚动的函数保持不变:public void Roller() {roll = rand.nextInt(dice);roll += 1;System.out.println (roll);}代码的主要部分提供运行应用程序时提供的任何参数。这的确会是一个复杂的应用程序,你需要仔细解析参数并检查意外结果,但对于这个例子,唯一的预防措施是将参数字符串转换成整数类型。public static void main (String[] args) {System.out.printf("You rolled a ");DiceRoller App = new DiceRoller( Integer.parseInt(args[0]) );App.Roller();}启动这个应用程序,并提供你希望骰子具有的面数:$ java dice.java 20You rolled a 10$ java dice.java 6You rolled a 2$ java dice.java 100You rolled a 44构造器已接受你的输入,因此在创建类实例时,会将 sides 变量设置为用户指定的任何数字。构造器是编程的功能强大的组件。练习用它们来解开了 Java 的全部潜力。via: https://opensource.com/article/19/6/what-java-constructor作者:Seth Kenlon 选题:lujun9972 译者:laingke 校对:wxy本文由 LCTT 原创编译,Linux中国 荣誉推出
2023年12月03日
0 阅读
0 评论
0 点赞
2023-12-03
怎么可以错过(c#程序设计实例)c#程序设计实用教程,C#程序设计.VR基础教程,java selectionmode,
C#程序设计第一章:C#基础 视频:https://edu.csdn.net/course/detail/27107一.知识点1.C#的概念和了解2.语法格式3.案例实践二.重点2.1 语法格式三.内容3.1 C#:C sharp(利器).C-->C++-->C++++,Java都来自于C系列,诞生于C++基础之上开发的。MS微软公司开发的,现在C#也实现了跨平台,有点晚了。C#开发最初的时候,只适合于微软的平台(windows系列,xp、2000、7 10等),设计的程序,不仅仅是windows系列,还有Linux、Mac、Unix、安卓等等操作系统。应用场景:最多的是C/S系列程序(软件),C:Client客户端;S:Server;服务器;网吧系统、屏幕广告(红蜘蛛)、卖票、炒股的、黑客破解的等等。Asp.Net:Web端开发程序,网页程序,但是跨平台不好,最主要的是微软不是一个互联网公司,卖操作系统的。现在Unity3D的软件,做VR/AR在线游戏,核心语言就是C#。3.2语法格式:变量名的使用:JS的时候,变量名区分大小写;首字母:能不能是数字???_ +C#:是强类型的语言,就是只要出错,在VS2012就会报错;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;//命名空间:区分类;namespace chapter01{ //class就是类 class Program{如何运行:"调试"里面有一个"启动调试",快捷键:F5;但是会一闪而过;不想一闪而过:Ctrl+F5;"调试"--》"开始执行(不调试)"3.3 占位符;之前都是使用+连接变量和字符串;{0},{1}-->变量1,变量2//static:静态的;void:不返回任何类型;Main:门;string[]args:参数; //程序里面也有一个门;不能动,就是程序的入口;参数就是门卫,你需要登记; static void Main(string[] args) { //基本数据类型; int age = 18; float height = 1.8F; //float类型后需要加F; double weight = 120; //C#默认小数是double类型; char flag = Y; //字符类型,使用单引号把数据引起来; bool biaozhi = true;//bool:真假型 //字符串类型; String name = "zhangsan"; //字符串是双引号; //输出;Write():不换行; WriteLine():换行; Console.Write(name); Console.Write(age); } }}//求圆的面积;S=PI*r*r //1.定义变量,并赋值; Console.Write("请输入圆的半径:"); double r;//3是固定的值;可以自己输入; r = double.Parse(Console.ReadLine()); const double PI=3.1415926; //常量使用 const定义;常量名:大写; double s = PI * r * r; //PI = 2; 常量不能多次赋值; Console.WriteLine(r + "的面积是:" + s); //不使用Ctrl+F5;最后接受一下; Console.ReadLine();3.4 控制结构:3.41顺序结构3.4.2分支结构:if 语句 switch语句 ;循环结构:四.作业4.1课后作业第二章 :循环和字符串//占位符;两个数相加 减 乘 除 int num1, num2; Console.WriteLine("请输入数字1:"); num1 = int.Parse(Console.ReadLine());//将字符串转换成int类型; Console.WriteLine("请输入数字2:"); num2 = int.Parse(Console.ReadLine());//将字符串转换成int类型; //2.输出;规则:{0},对应的是"",后面的第一个变量;{1}:第二个变量; Console.WriteLine("{0}+{1}={2}",num1,num2,(num1+num2)); Console.WriteLine("{0}-{1}={2}", num1, num2, (num1 - num2)); Console.WriteLine("{0}*{1}={2}", num1, num2, (num1 * num2)); Console.WriteLine("{0}/{1}={2}", num1, num2, (num1 / num2)); Console.WriteLine("{0}%{1}={2}", num1, num2, (num1 % num2)); Console.ReadLine();//分支语句,swtich 语句; //根据时间,来输出上午(789)下午(141617)晚上(202122); int num; Console.Write("请输入时间:"); num = int.Parse(Console.ReadLine()); //2.业务判断; switch(num){ case 7: case 8: case 9: Console.WriteLine("{0}点上午",num);break; case 14: case 16: case 17: Console.WriteLine("{0}下午", num); break; case 20: case 21: case 22: Console.WriteLine("{0}晚上", num); break; default: Console.Write("有问题");break; //C#:强类型,必须有break; } Console.ReadLine();一.知识点1.循环(do while/while/for/foreach)2.字符串String和StringBuilder3.类型转换二.重点1.循环掌握最少2个;2.字符串的使用;3.类型转换三.内容1.循环(固定次数的循环,不固定次数的循环)循环的步骤:1.1 初始化变量 i1.2循环的条件(啥时候去循环,意味着有一个结束的条件){1.3循环的代码工作,要干的事情;1.4计数器}do while和while循环的区别?do while:最少执行一次;因为do while循环先执行代码,后判断;static void Main(string[] args) { //少了条件判断,降低了循环次数; for (int i = 1; i <= 100;i+=2 ) { Console.Write(i+" "); } Console.Read();foreach格式:2.水仙花数:100-999之间的三位数;第一步找范围;153=1^3+5^3+3^3第二步确定:个位 十位 百位% /gw = 153 % 10; //个位%10求余数; sw = 153 / 10 % 10;//十位分两步操作; bw = 153 / 100;//百位/10整除Console.Write("{0}",gw); Console.Write("{0}",sw); Console.Write("{0}",bw);for(int i=100;i<=999;i++){int i = 0; do{ if (i % 2 == 0) Console.Write(i + " "); i++; }while(i<0); Console.Read();//少了条件判断,降低了循环次数; for (int i = 1; i <= 100;i+=2 ) { Console.Write(i+" "); } Console.Read();//C#:数组格式[],数组的下标从0开始到数组的长度-1; int[] arr = { 1,3,5,7,9}; //输出数组中的元素;数组名[下标] Console.WriteLine(arr[0]); Console.WriteLine(arr[1]); Console.WriteLine(arr[2]); Console.WriteLine(arr[3]); Console.WriteLine(arr[4]); //报错:数组的索引超出了界限; //Console.WriteLine(arr[5]); //输出数组中的元素;i:0 1 2 3 4 //for (int i = 0; i <= 4;i++ ) //{ // Console.Write(arr[i]+" "); //} foreach(int n in arr){ //n:arr;n表示从数组中逐个取元素出来; Console.Write(n +"\t"); } Console.Read();//第三部确定水仙花的等式条件,然后输出结果;}3.String类;int gw, sw, bw; //分别代表个位 十位 百位 //i:153; for (int i = 100; i <= 999; i++) { gw = i % 10; //个位%10求余数; sw = i / 10 % 10;//十位分两步操作; bw = i / 100;//百位/10整除 if(i==gw*gw*gw+sw*sw*sw+bw*bw*bw){ Console.WriteLine(i); } } Console.Read();//字符串位置也是从0开始; String str = "今天是个好天气,我被今个老师批评了一顿,魏子博,是个好同学"; Console.WriteLine(str.Contains("魏子博"));//是否包含 Console.WriteLine(str.EndsWith("子博"));//以某个子串结尾 Console.WriteLine(str.StartsWith("今天"));//以某个子串开头; Console.WriteLine(str.IndexOf("个"));//3 第一次出现的位置; Console.WriteLine(str.Insert(3,"晴天真是")); Console.WriteLine(str.LastIndexOf("个")); Console.WriteLine(str.Remove(3)); Console.WriteLine(str.Replace("魏子博", "魏大帅哥")); Console.WriteLine("Abcd".ToUpper()); Console.WriteLine("Abcd".ToLower()); Console.WriteLine(str.Substring(3,5));//3: 起始位置;5截取的长度; //格式化字符串:{0},{1},{2} //Format(字符串加占位符,值1,值2,..,值n) String name="赵俊杰"; int age=88; String str2 = String.Format("我们的班长是{0},年龄:{1}",name,age); //整出来这个格式化的字符串,控制台可以用,游戏也能用;winform也能用; //传值更为方便; Console.WriteLine(str2); Console.Read();//1.隐式转化(自动转换) //int age = 20; //double age2 = age; //double:浮点型:小数类型,范围比较大; //Console.WriteLine(age); //Console.WriteLine(age2); //2.显式转化; double height = 2.87; int height2 =(int)height; //因为double类型 范围比较大;//在大的类型前面加一个 (小类型)四.作业课后作业1 2 3第三章 双重循环和数组一.知识点1.双重循环2.数组二.重点1.面试题2.数组三.内容1.双重循环:循环的嵌套循环一般最多3层,要求大家精通双重循环面试题;掌握面试题的解决思路。直角三角形:Console.WriteLine(height); Console.WriteLine(height2); //出现的问题就是数据丢失了; int height3 = Convert.ToInt32(height); //从double类型转整型的时候会四舍五入; Console.WriteLine("-->"+height3); //3.类型转换;字符串 --》整型 string s = "222"; int num2 = int.Parse(s);//parse(字符串参数) Console.WriteLine(num2); int num3 = Convert.ToInt32(s); Console.WriteLine(num3); Console.Read();/// <summary> /// * /// * * * /// * * * * * /// * * * * * * * /// * * * * * * * * */// </summary>奇数三角形:等腰三角形:class Program { static void Main(string[] args) { for (int i = 1; i <= 5;i++ ) { //i:行数;1 2 3 4 5;2i:2 4 6 8 10 for (int j = 1;j<=2*i-1 ;j++ )//j:*的个数;1 3 5 7 9 { Console.Write("* "); } Console.WriteLine(); } Console.Read(); } }/// <summary> /// * /// * * /// * * * /// * * * * /// * * * * * /// /// </summary> class Program { static void Main(string[] args) { //所有的这种面试题:外层循环控制行数;i代表行数 for (int i = 1; i <= 5; i++) { //Console.WriteLine("输出行数"+i); //如何在第1行一个*;第2行**;第3行:***; for (int j = 1; j<=i;j++ ) //j:代表输出的*个数; { Console.Write("* "); } Console.WriteLine();//一行完毕之后:换行 } Console.Read(); } }/// <summary> /// * /// * * * /// * * * * * /// * * * * * * *///* * * * * * * * *字母三角形2.数组数组:概念:一组相同数据类型的集合;为什么要用???要求我们班42人的平均成绩???>42变量语法格式:数据类型 [] 数组名=new 数据类型长度]int[]ages=new int[3]; //数组的长度为3;int[]score=new int[42];String[]names=new String[42];数组的赋值:值一定要和数组数据类型一致;数组名[下标]=值 下标从0开始;到数组的长度-1score[0]=88;score[1]=90;ages={};也可以使用{}赋值;/// /// </summary> class Program { static void Main(string[] args) { for (int i = 1; i <= 5;i++ ) { for (int j = 5 - i; j >= 1;j-- ) { Console.Write(" "); } for (int j = 1; j <= i;j++ ) { Console.Write("* "); } for (int j = 1;j<i ;j++ ) { Console.Write("* "); } Console.WriteLine(); } Console.Read(); } }四.作业1.page 502.page 53上机练习13.有能力的同学自行预习"冒泡排序"4.录屏,自己当老师,有注释,有声音,讲解page77作业3。第四章:复习课1.求含有5个数组元素的平均值//1.定义数组长度; String[] names = new String[5]; int[] salary = new int[5]; //String[]names=new String[5]{"李颖","冰棍","雪糕","鸡腿","汉堡"}; //names[0]="李自然"; //names[2]="马冬梅"; //names[3] = "西门吹牛"; //names[4] = "东坡个"; //names[1] = "曲长老"; //names[5] = "和尚"; //最大长度为5-1=4 //2.输入;Length:数组的长度; //for (int i = 0; i < names.Length; i++) { // Console.Write("请输入第{0}个同学的名字:",i+1); // names[i] = Console.ReadLine(); // Console.Write("请输入第{0}个同学的工资:",i+1); // salary[i] = Convert.ToInt32(Console.ReadLine());//或:int.parse() //} //3.输出 for (int i = 0; i < 5;i++ ) { Console.WriteLine("{0}同学的工资:{1}",names[i],salary[i]); } Console.Read();using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks; namespace ararydemo{ /// <summary> /// 目标:求长度为5的整型数组的平均值;/// </summary>2.求数字为n的阶乘及阶乘和class Program { static void Main(string[] args) { //1.声明数组;使用[]来定义;5 int[] arr = new int[5]; //2.输入;最简单的赋值的方式;使用循环来赋值; //找规律:arr[] 数组名[] 北极星[0]-北极星[9] //皇家一号[0]--皇家一号[4]; 酒店名[门牌号] //数组名[下标]->下标的规律:0 --4;递增; //arr[0] = 1; //arr[1] = 2; //arr[2] = 10; //arr[3] = 20; //arr[4] = 78; for (int i = 0; i <= 4;i++ ) { Console.Write("请输入第{0}个元素",(i+1));//占位符,值匹配 //Console.Write("请输入第" + (i + 1) + "个元素"); //接受; arr[i] = int.Parse(Console.ReadLine()); //类型转换;int.parse();Convert.ToInt32() } //3.输出;最好再写一个循环; //Console.WriteLine(arr[0]); int sum=0; //sum和 //for (int i = 0; i < arr.Length; i++) //{ // Console.WriteLine(arr[i]); // sum = sum + arr[i]; //} //也可以使用如下格式 foreach (int num in arr) { Console.WriteLine(num); sum = sum + num; } //int avg = (arr[0] + arr[1] + arr[2] + arr[3] + arr[4])/5; int avg = sum / 5; Console.WriteLine("平均值:{0}", avg); Console.Read(); } }}using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;3.求母串中子串出现的位置及其个数4.作业:namespace 求阶乘{ /// <summary> /// 阶乘:n!=n*(n-1)!; /// 4!=4*3*2*1; /// </summary> class Program { static void Main(string[] args) { Console.Write("请输入求阶乘一个数字:"); //提示信息 int n = int.Parse(Console.ReadLine());//n:代表求阶乘的数字;假设:4 //求1*2*3*4 //求1!+2!+3!+4! int ji = 1;//设置一个变量初始值就是1; int sum = 0; for (int i = 1; i <= n;i++ ) { ji = ji * i;//ji=1*1;ji=1*2=2;ji=2*3; sum += ji; //sum=sum+ji; } Console.WriteLine("{0}的阶乘是:{1}",n,ji); Console.WriteLine("阶乘的和{0}", sum); Console.ReadLine(); } }}String s1 = "大雪来了,大雪兆丰年,我叫大雪"; String keyword = "大雪"; //这个是考虑两个; //Console.WriteLine(s1.IndexOf(keyword)); 获取keyword关键字的位置; //Console.WriteLine(s1.LastIndexOf(keyword)); int index=0; //母串.IndexOf(子串,查找的起始位置),当起始位置改变的时候,从新的位置继续查找原母串中子串的位置; //Console.WriteLine(s1.IndexOf(keyword,1)); //Console.WriteLine(s1.IndexOf(keyword, 6)); while ((index = s1.IndexOf(keyword,index)) != -1) {//条件不等于-1,则循环; //循环里面就是符合条件的数据字符串 Console.WriteLine("子串位置:{0}", index); //下一步,是不是应该让index往后走; index = index + keyword.Length; //0+2; } Console.Read();4.1 录屏第一题,需要加注释,并自己讲解,头像、声音;4.2预习第五章第五章 窗体控件一.知识点1.窗体2.常用控件3.命令语句二.重点1.掌握窗体和常用控件2.学会常用控件的属性、事件三.内容1.窗体的概念windows:视窗;可视化窗口;新建windows窗体--》起名:frmWin右键-->属性;设置窗体的text:标题;name:默认刚才你写的frmWinBackColor:背景颜色设置一下:programs-->Main()下面:Application.Run(new frmWin());StartPosition:启动位置;CenterScreen;MaximizeBox:最大化按钮是否可以用;true:可以用;false:变灰;这个设置完之后,并不是一定不变大小;FormBorderStyle:None:没有边框;FixedSingle:单边框;Form窗体:网页:表单,可以放表单元素,调查页面等;实际上窗体就是一个容器,可以放其他控件。相当于饭店的餐桌;GroupBox等容器相当于盘子;步骤:1.找控件2.设置属性3.写代码2.登录窗体效果1.Label:标签;作用,只是提示信息;2.textBox文本框:用来输入信息;3.button 按钮;用来单击;交互使用;账号文本框:txtName;密码框:txtPwd登录按钮:btnLogin参考代码:private void btnCancel_Click(object sender, EventArgs e) { this.Close();//关闭 } private void btnLogin_Click(object sender, EventArgs e) { //MessageBox.Show(txtName.Text);//弹框; //MessageBox.Show(txtPwd.Text); String name = txtName.Text; //定义两个变量,接受用户名文本框和密码框的值; String pwd = txtPwd.Text; // if (txtName.Text.Equals("83193980") && txtPwd.Text.Equals("88889999")) if (name.Equals("83193980") && pwd.Equals("88889999")) { MessageBox.Show("登录成功"); } else { MessageBox.Show("登录失败"); } }3.itemsselectedIndex Items Item四.作业4.1 登录窗体完美版第六章 控件一.知识点1.图片框2.多窗体调用3.控件继续4.消息框二.重点1.多窗体之间调用三.内容1.图片框案例:在窗体下声明变量上一张按钮代码:下一张按钮代码://声明了一个数字变量;i默认值是0;我们设置为1 private int i=1;{ //有这样一个属性;图片的路径:ImageLocation //MessageBox.Show(pictureBox1.Image); i--; if (i == 0) i = 5; pictureBox1.ImageLocation = String.Format("img/bg{0}.jpg",i);退出按钮代码(两种测试)3.MessageBox():消息框4.菜单栏加图标:是Form窗体:ICON属性,找老师给的ico图标;RichTextBox直接设置停放;TextBox:需要先设置成多行,然后设置Dock为Fill(可以下拉出来测试)设置右键菜单,需要先找文本框,设置它的属性ContextMenuStrip统一给文本框(或富文本框)改名:txtNotepad文本框:text_changed()富文本框:SelectionChanged//img/bg 数字变量 .jpg;数字变量是i//pictureBox1.ImageLocation = "img/bg"+i+".jpg"; i++; if (i == 6) i = 1; pictureBox1.ImageLocation = String.Format("img/bg{0}.jpg",i);//第二个窗体是不是关闭了。 //this.Close(); Application.Exit(); //应用退出//也可以用于删除的时候; //MessageBox:消息框;+20:多义方法;打 DialogResult result=MessageBox.Show("您是否关闭皇家一号酒店系统?","提示信息",MessageBoxButtons.YesNo,MessageBoxIcon.Question); if (result == DialogResult.Yes) { //要关的事件;取消属性为false;就是关了. e.Cancel = false; } else { e.Cancel = true; }using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms; namespace demo61{ public partial class Form1 : Form { private int i = 9; public Form1() { InitializeComponent(); } /// <summary> /// 当关闭窗体的时候,给提示; /// e:事件参数对象; /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Form1_FormClosing(object sender, FormClosingEventArgs e) { //也可以用于删除的时候; //MessageBox:消息框;+20:多义方法;打 //DialogResult result=MessageBox.Show("您是否关闭皇家一号酒店系统?","提示信息",MessageBoxButtons.YesNo,MessageBoxIcon.Question); //if (result == DialogResult.Yes) //{ // //要关的事件;取消属性为false;就是关了. // e.Cancel = false; //} //else { // e.Cancel = true; //} } private void 文件ToolStripMenuItem_Click(object sender, EventArgs e) { } private void 退出XToolStripMenuItem_Click(object sender, EventArgs e) { this.Close(); } private void 撤销UToolStripMenuItem_Click(object sender, EventArgs e) { this.txtNotepad.Undo(); //撤销;调用的是系统的方法 } private void 剪切ToolStripMenuItem_Click(object sender, EventArgs e) { txtNotepad.Cut(); //剪切方法;}private void 复制ToolStripMenuItem_Click(object sender, EventArgs e) { txtNotepad.Copy(); } private void 粘贴ToolStripMenuItem_Click(object sender, EventArgs e) { txtNotepad.Paste(); //? } private void 变大ToolStripMenuItem_Click(object sender, EventArgs e) { //设置字体,需要给Font一个具体的字体对象; //我已经给你设置变量i++ txtNotepad.Font = new Font("黑体",i++); } private void 变小ToolStripMenuItem_Click(object sender, EventArgs e) { txtNotepad.Font = new Font("黑体", i--); } private void 加粗ToolStripMenuItem_Click(object sender, EventArgs e) { //FontStyle:字体的样式; // txtNotepad.Font = new Font("黑体", txtNotepad.Font.Style | FontStyle.Bold); //FontStyle.Italic 斜体; //FontStyle.Strikeout; 删除线 //FontStyle.Underline;//下滑线 //如果当前是粗体,则不变; // MessageBox.Show(txtNotepad.Font.ToString()); //第一个参数是之前的Font样式;省略page150行代码; txtNotepad.Font = new Font(txtNotepad.Font, FontStyle.Bold); } private void 状态栏ToolStripMenuItem_Click(object sender, EventArgs e) { 状态栏ToolStripMenuItem.Checked = true; //出来对勾; this.statusStrip1.Visible = true; } private voidrichTextBox1_SelectionChanged(object sender, EventArgs e) { if (txtNotepad.SelectedText.Length != 0) { 复制ToolStripMenuItem.Enabled = true; 剪切ToolStripMenuItem.Enabled = true; } } /// <summary> /// 这个一个文本框的改变事件/// </summary>四.作业第七章 控件二一.知识点1.掌握控件的用途2.掌握控件的主要属性3.掌握控件的使用技巧二.重点1.时钟控件2.工具栏、ImageList三.内容1.Tool strip 控件是由system.Windows.forms.Toolstrip类提供的,作用是创建易于自定义的常用工具栏,让这些工具栏支持高级用户界面和布局功能,如停靠、漂浮、带文本和图像的按钮、下拉按钮等。常用属性:/// <param name="sender"></param> /// <param name="e"></param> private void txtNotepad_TextChanged(object sender, EventArgs e) { } //颜色:ForeColor 前景色;BackColor:背景色; private void 红色ToolStripMenuItem_Click(object sender, EventArgs e) { txtNotepad.ForeColor=Color.Pink; } }}显示方式 属性DisplayStyle 图像和文本显示方式,一般ImageAndTextImage 按钮或标签上的图片ImageScaling 图片大小Text 标签上显示的文本TextImageRelation 图像和文字的相对位置,一般ImageAboveText属性 说明Multiline 是否可以显示一行上的选项卡TabPages 设置控件上的选项卡页的集合SelectedIndex 选项卡页的索引SelectedTab 当前选定的选项卡页2.TabControl(选项卡)3.Timer控件它是什么?它是干什么的?控件。它是不可见的。用于背景进程中。通过引发Timer事件,Timer控件可以有规律的隔一段时间执行一次代码。也就是,你可以根据你自己的需要,给Timer控件设置时间,Timer每隔这段时间,就执行一次代码(这个代码你可以根据自己需要的功能写。)属性 说明Interval 事件发生的频率,以毫秒为单位Enabled 获取或设置计时器是否正在运行事件 说明Tick 每隔指定间隔发生的事件方法 说明Start 启动计时器Stop 停止计时器属性 值Name tmDateInterval 1000(1秒=1000毫秒)4.ImageList案例:动态相册using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms; namespace demo61{ public partial class frmImage : Form { //要让0 1 2 3 4 5,需要定义变量; int i = 0; public frmImage() { InitializeComponent(); } /// <summary> /// 在时钟时间,每滴答一次更改一下图片 /// imageList:图像列表;它里面每一项都是一个图像(Image) /// images:很多图片;images[0]--就是第一个图片;/// </summary>跑马灯和颜色变化/// /// private void timer1_Tick(object sender, EventArgs e) { if (i > 80) i = 0; this.pictureBox1.Image=this.imageList1.Images[i]; i++; } private void button1_Click(object sender, EventArgs e) { this.timer1.Enabled = true; // this.timer1.Start(); } private void button2_Click(object sender, EventArgs e) { this.timer1.Stop(); } //快 private voidradioButton1_CheckedChanged(object sender, EventArgs e) { this.timer1.Interval = 100; } //中 private void radioButton2_CheckedChanged(object sender, EventArgs e) { this.timer1.Interval = 500; } //慢 private voidradioButton3_CheckedChanged(object sender, EventArgs e) { timer1.Interval = 1000; } }}using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;四.作业namespace demo61{ public partial class frmGun : Form { //颜色改变,定义变量 int i=0; public frmGun() { InitializeComponent(); } private void timer1_Tick(object sender, EventArgs e) { } /// <summary> /// 跑马灯,在Html,marquee /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void frmGun_Load(object sender, EventArgs e) { } //从右向左; //颜色是怎么构成的?三原色(红 绿 蓝)0-255; //255最强光;255 255 255->白;0 0 0 private void timer1_Tick_1(object sender, EventArgs e) { label1.Left = label1.Left - 2; //this.Left += 2; //this:就是窗体; this.label2.Left -= 3; if (label1.Left < -label1.Width) label1.Left = this.Width;//this:代表当前窗体宽度; if (label2.Left < -label2.Width) label2.Left = this.Width;//this:代表当前窗体宽度; //调色; Color color = new Color();//弄一个新颜色; color = Color.FromArgb(255,i,255-i); i += 5; //i值变化; if (i > 255) i = 0; //label2.ForeColor = color;//前景色; //变窗体的背景色; this.BackColor = color; } }}第八章 C#和Mysql数据库连接一.知识点1.安装插件和补丁包软件2.下载dll文件3.二.重点1.访问顺序;2.三.内容准备工作,注意不是复制dll文件,也不是复制到bin/debug下,而是添加引用;第一步熟悉一下:C#连接数据库的一些常用类库农夫山泉:口号;不生产水,搬运工;数据提供程序:不生产数据,数据库生产数据;只是搬运工;不能用的处理方式把目标框架更改一下:数据库访问的顺序:1)建立数据库连接2)打开数据库连接//在之前的代码基础上,增加如下代码。进行测试; conn.Open(); //Open():表示搬运工已经和对方水厂(数据库建立了联系). ConnectionState state = conn.State; MessageBox.Show(state.ToString());//?3)编写SQL语句//mysql: 4个功能;增删改查;String sql="";//insert grade(gname) values(S1),(S2),(S3)多个 String sql = "insert grade(gname) values(S5)";String sql = "delete from grade where gname in(S4,S5)"; //id>3String sql = "update grade set gname=大一 where id=1";4)创建SQL命令对象SQLCommand//str:是一个连接数据库的连接字符串; String str = "server=localhost;userid=root;password=root;database=school"; //建立连接;练习搬运工;这个搬运工叫conn MySqlConnection conn = new MySqlConnection(str); // conn.ConnectionString = str; //给搬运工的连接方式(联系方式,去丹江口)赋值 MessageBox.Show(conn.ConnectionString);//给搬运工下达命令;MySqlCommand:命令类,用来执行搬运工的命令; MySqlCommand comm = new MySqlCommand(sql, conn); // +3方法有三个同名的方法 ; //comm.Connection = conn; //和刚才的搬运工建立联系; //comm.CommandText = sql; //接受命令;5)执行SQL命令int result=comm.ExecuteNonQuery(); //不是查询是增删改 if (result > 0) MessageBox.Show("插入成功"); else MessageBox.Show("插入失败");6)关闭数据库连接//最后有一个关闭???为啥要关闭呢?示例1:添加班级信息string constr="server=localhost;userid=root;password=root; database=school"; MySqlConnection conn = new MySqlConnection(constr);//创建数据库连接对象 conn.Open();//打开连接对象 string className = txtClassName.Text; string createDate = txtCreateDate.Text; string sql =string.Format("insert into classes(className,createDate) values({0},{1})",className,createDate); MySqlCommand command = new MySqlCommand(sql,conn);//根据sql命令和数据库连接创建数据库命令对象 int count=command.ExecuteNonQuery();//执行数据库的非查询命令 if (count > 0)//如果返回值(影响的行数)大于0,提示录入成功 { MessageBox.Show("班级录入成功"); } conn.Close();//关闭数据库连接2.四.作业1.熟练掌握增删改查第九章:数据库连接一.知识点1.动态插入数据,新控件的学习2.DataReader查询信息属性 说明HasRows 是否返回结果,如果有查询,则返回True,否则返回FalseFieldCount 返回当前行中的列数方法名 说 明Close 清除任何数据的DataSetReader 将XML和数据导入到DataSetNextResult 使数据读取器前进到下一个结果IsDBNull 判断列中的数据是否为NULL值,返回True/False3.MDI窗体二.重点1.动态增删改2.DataReader三.内容1.增加学生信息步骤:1.1建立窗体,拖拉控件;1.2.改名字;1.3.引用数据库using MySql.Data.MySqlClient;1.4.写代码;2.DataReader控件的使用DataReader对象的属性和方法常用方法3.MDI窗体效果如下:单击:信息增加代码:frmAddStu addStu = new frmAddStu();//new新窗体; addStu.MdiParent = this; //设置新窗体的父窗体是当前MDI容器; addStu.Show();效果:拖动主界面窗体,子窗体界面会随主窗体界面来回跑动。四.作业:4.1开始项目设计数据库和表;做好分析;4.2练习上课内容4.3做酒店需要自学第8章的ListView第十章 DataSet 、数据适配器、数据表格一.知识点1.DataSet2.导入数据到数据表格二.重点2.1数据集2.2 数据适配器2.3 数据表格三.内容3.1数据集1)数据集合的作用:是在内存中建立起一个临时的数据仓库,可以对其进行操作并同步到底层数据库。为什么用它?MySqlConnection conn连接对象。--》打开完毕之后,给commMySqlCommand 可以增删改查。考试理论(50道),这些试题就放在了数据集里面。考试完毕之后,要提交的时候,再插网线,将内存中的答案等提交一下。相当于C#给我们提供的临时数据库。2)数据集结构:3)使用DataTable有行和列的集合:Columns和Rows,Rows就是查询获得的数据表中的每一行数据集合,集合就可以通过索引或下标访问,例如:通过Rows[行号][]"班级名称" ]获得该数据,Columns是表格中列的集合,通过Columns["身份证号码"]来获得指定的列对象3.2 数据适配器数据适配器类似于充电器;充电器找到一个手机,去手机里面充电。从数据源把数据拿到DataSet(数据集)的DataTable(数据表)new的时候,查看参数是哪些。大家也可以看书。fill()方法;参数是数据集对象也可以填充数据表,填充数据表到通用类来讲。封装提取代码:3.3 DataGrid控件4)DataGridView常用属性:DataSource:数据源,可以设置某一个DataTable即可SelectionMode:是表格的选择模式,一般选择FullRowSelectMultiSelect:是否可以多选ReadOnly:是否只读添加该控件后顺手把它的这几个选项如图选定,一般不在表格中进行添加和修改操作。查询使用数据适配器MySQLDataAdapter,用法和MySqlCommand相同,该适配器可以填充一个内存中的表格DataTable对象,然后让dataGradView的数据源(DataSource)指向该表格。String str = "server=localhost;userid=root;password=root;database=school;charset=utf8"; MySqlConnection conn = new MySqlConnection(str); conn.Open(); String sql="select id 编号,name 姓名,gender 性别,age 年龄,birth 生日,address 地址 fromstudent"; //加两个参数:(sql命令,连接对象) MySqlDataAdapter adapter = new MySqlDataAdapter(sql, conn); //DataSet临时数据库对象ds DataSet ds=new DataSet(); //Fill(参数是数据集对象) //adapter.Fill(ds); 索引下标; adapter.Fill(ds, "学生"); //又加了一个表名 //目的是填充到数据表格里面。 //???就是ds这个临时数据库里面有几个表??? //MessageBox.Show(ds.Tables.ToString()); 不加Count是数据表的集合 //MessageBox.Show(ds.Tables.Count.ToString()); 是数据表的个数 //向数据表格进行填充; //数据源是一个数据表??? //dgvStudent.DataSource = ds.Tables[0]; 对的是索引下标,从0开始; dgvStudent.DataSource = ds.Tables["学生"]; //表名3.4 数据库通用代码假设现在6个表,每个表对应4个窗体,24个,再加上额外的6个,30个窗体。有很多重复的代码:String conStr = "server=127.0.0.1;userid=root;password=root;database=school;charset=utf8"; MySqlConnection conn = new MySqlConnection(conStr); conn.Open(); String sql = String.Format("select name,pwd from student where name={0} and pwd={1}",txtName.Text.Trim(),txtPwd.Text.Trim()); MySqlCommand comm = new MySqlCommand(sql, conn); //数据;读者;数据读取器; MySqlDataReader reader=comm.ExecuteReader();怎么办?3.4.1 一个记忆好,每次都敲,这叫劳模;3.4.2 复制 、粘贴,要快些;3.4.2 合格的程序员,要偷懒;把这些公共的代码要进行封装,放到一个类里面,这个类是一个公共的类。util文件夹,它里面放公共的类文件。using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using MySql.Data.MySqlClient; /*加mysql命名空间;*/ using System.Data; //使用System.Data命名空间,否则;DataTable出不来; //命名空间:chapter08.utilnamespace chapter08.util { /// <summary> /// 这个是一个公共的连接数据库的类 /// static:静态的关键字;static:不可变的;访问的时候,可以直接类名.属性/类名.方法 /// </summary> class DBHelper { static String str = "server=localhost;userid=root;password=root;database=school;charset=utf8"; //1.获得通用连接对象 ;static,是否可以去掉; public static MySqlConnection getConn() { MySqlConnection conn = new MySqlConnection(str); conn.Open(); //自动打开; return conn; } //2.关闭连接;关闭的连接对象,所以参数是连接对象 public static void close(){ MySqlConnection conn = getConn(); if(conn!=null){ conn.Close(); } } //3.增删改操作;方法有参数没有??? public static int update(String sql) { //通用方法的增删改的连接对象也是通用的. MySqlConnection conn = getConn(); MySqlCommand comm = new MySqlCommand(sql,conn); //sql是从外部传过来的命令语句;conn是通用的连接对象. int result = comm.ExecuteNonQuery(); return result; } //4.查询操作;参数 public static DataTable query(String sql) { //通用方法的增删改的连接对象也是通用的. MySqlConnection conn = getConn(); MySqlDataAdapter adapter = new MySqlDataAdapter(sql, conn); //定义了一个数据表格对象;没有数据; DataTable dt = new DataTable(); //这时候填充到数据表格对象dt里面 adapter.Fill(dt); //这时候dt就有数据了; return dt; } } }3.5 单击数据表格获取值//使用一个变量来接受一下;rows:行的集合; //首先是获得数据表格的rows, //其次是第几行的第几列;cells //这时候得到的是一个单元格对象;就是一个格子,我们的目标是其中的值; //String str = dataGridView1.Rows[0].Cells[1].ToString(); //MessageBox.Show(str); //*******得到其中的值*********** //String str2 = dataGridView1.Rows[0].Cells[1].Value.ToString(); //MessageBox.Show(str2); //*************得到当前行的值;e:代表的是当前鼠标单击事件;rowIndex:行号;ColumnIndex:列序号; //String str3 = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString(); //MessageBox.Show(str3);3.6 单击数据表格传值给新窗体数据表格代码://*******接下来目标就是把数据显示到frmUpdateGrade窗体上面; String id = dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString(); String name = dataGridView1.Rows[e.RowIndex].Cells[1].Value.ToString(); //声明了窗体对象,并new了一下,新建出来; frmUpdateGrade updateGrade = new frmUpdateGrade(); updateGrade.id = id; updateGrade.name = name; updateGrade.Show(); //跨窗体传值的时候,应该把id,name传给updateGrade;新窗体代码://1.给窗体定义两个属性;id,name public String id;//如果是int,则需要强制转化一下; public String name;在窗体加载事件添加代码://这时候没有值; //MessageBox.Show(id + "初始化....," + name); //当我们写了frmDataGrid2,两行赋值代码之后,id和name的值就传过来了。 //我们要把这个值传到哪里去呢???this:在这里代表当前窗体对象; txtId.Text = this.id; txtGName.Text = this.name;更新按钮代码:/// <summary> /// 更新按钮代码 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnUpdate_Click(object sender, EventArgs e) { String sql = string.Format("update grade set gname={0} where id={1}",txtGName.Text,txtId.Text); int result=DBHelper.update(sql); if (result > 0) MessageBox.Show("更新成功"); else MessageBox.Show("更新失败"); DBHelper.close(); }四.作业4.1 掌握三类内容4.2 使用通用的数据库操作类来实现增删改查;4.3 项目的所有资料:4.3.1 需求分析+人员分工(放假之前交),具体的人做哪个模块4.3.2 数据库表的设计(写本上,就是几张表,表名,字段名和含义)4.3.3 命名规范 写下来(frm前 ;btn;cmb;)4.4 DBHelp.cs录屏讲解C#程序设计第一章:C#基础一.知识点二.重点三.内容四.作业第二章 :循环和字符串一.知识点二.重点三.内容四.作业第三章 双重循环和数组一.知识点二.重点三.内容1.双重循环:循环的嵌套2.数组四.作业第四章:复习课1.求含有5个数组元素的平均值2.求数字为n的阶乘及阶乘和3.求母串中子串出现的位置及其个数4.作业:4.1 录屏第一题,需要加注释,并自己讲解,头像、声音;4.2预习第五章第五章 窗体控件一.知识点二.重点三.内容1.窗体的概念2.登录窗体效果四.作业第六章 控件一.知识点二.重点三.内容四.作业第七章 控件二一.知识点二.重点三.内容四.作业第八章 C#和Mysql数据库连接一.知识点二.重点三.内容数据库访问的顺序:2.四.作业第九章:数据库连接一.知识点二.重点三.内容1.增加学生信息2.DataReader控件的使用3.MDI窗体四.作业:第十章 DataSet 、数据适配器、数据表格一.知识点二.重点三.内容3.1数据集3.2 数据适配器3.3 DataGrid控件3.4 数据库通用代码3.5 单击数据表格获取值3.6 单击数据表格传值给新窗体四.作业
2023年12月03日
0 阅读
0 评论
0 点赞
2023-12-03
干货满满(java函数式编程实例)java函数式编程实战,Java中的常用函数式接口,java常用接口,
1、Supplier接口java.util.function.Supplier<T> 接口仅包含一个无参的方法:T get() 。用来获取一个泛型参数指定类型的对象数据。///////////////////////Supplier接口////////////////////////// private static String getStringSupplier(Supplier<String> function) {return function.get();}private static void testSupplier(){String msgA = "Hello";String msgB = "World";System.out.println(getStringSupplier(() -> msgA + msgB));}// 求一个数组的最大值 private static int getMax(Supplier<Integer> function){return function.get();}private static void runGetMax(){int[] arr = {2,3,4,52,333,23};int maxNum = getMax(() -> {int max = arr[0];for (int i : arr){if (i > max){max = i;}}return max;});System.out.println(maxNum);}2、Consumer接口java.util.function.Consumer<T> 接口则正好与Supplier接口相反,它不是生产一个数据,而是消费一个数据,其数据类型由泛型决定,其抽象方法为void accept(T t)。如果一个方法的参数和返回值全都是 Consumer 类型,那么就可以实现效果:消费数据的时候,首先做一个操作,然后再做一个操作,实现组合。而这个方法就是 Consumer 接口中的default方法 andThen() 。///////////////////////Consumer接口////////////////////////// private static void consumerString(Consumer<String> function){function.accept("Hello");}private static void testConsumer(){consumerString(s -> System.out.println(s));}// Consumer.andThen() 方法,接收和返回的对象都是Consumer private static void andThenAccept(Consumer<String> one, Consumer<String> two){one.andThen(two).accept("Hello");}// 先转成小写,再装换成大写 private static void testAndThenAccept(){andThenAccept(s -> System.out.println(s.toLowerCase()),s -> System.out.println(s.toUpperCase()));}// 下面的字符串数组当中存有多条信息,请按照格式“ 姓名:XX。性别:XX。”的格式将信息打印出来。 // 要求将打印姓名的动作作为第一个 Consumer 接口的Lambda实例, // 将打印性别的动作作为第二个 Consumer 接口的Lambda实例,将两个 Consumer 接口按照顺序“拼接”到一起 // .forEach(System.out::println); private static void formatPrint1(Consumer<String> one, Consumer<String> two, String s){one.andThen(two).accept(s);}private static void runFormatPrint1(){String[] array = { "迪丽热巴,女", "古力娜扎,女", "马尔扎哈,男" };for (String i : array) {formatPrint1(s -> System.out.print("姓名:" + s.split(",")[0] + "。"),s -> System.out.print("性别:" + s.split(",")[1] + "\n"),i);}}private static void formatPrint2(Consumer<String> one, Consumer<String> two, String[] array){for(String s : array){one.andThen(two).accept(s);}}private static void runFormatPrint2(){String[] array = { "迪丽热巴,女", "古力娜扎,女", "马尔扎哈,男" };formatPrint2(s -> System.out.print("姓名:" + s.split(",")[0] + "。"),s -> System.out.print("性别:" + s.split(",")[1] + "\n"),array);}3、Predicate接口有时候我们需要对某种类型的数据进行判断,从而得到一个boolean值结果。这时可以使用java.util.function.Predicate<T> 接口。他有一个抽象方法boolean test(T t) 用来条件判断。还有三个默认方法:与、或、非default Predicate<T> and(Predicate<? super T> other) {Objects.requireNonNull(other);return (t) ‐> test(t) && other.test(t);}default Predicate<T> or(Predicate<? super T> other) {Objects.requireNonNull(other);return (t) -> test(t) || other.test(t);}default Predicate<T> negate() {return (t) -> !test(t);}例子:///////////////////////Predicate接口////////////////////////// private static void predicateTest(Predicate<String> function){boolean veryLong = function.test("Hello");System.out.println("这个字符串很长吗? " + veryLong);}private static void runPredicateTest(){predicateTest(s -> s.length() > 5);}// 判断一个字符串既要包含大写“H”,又要包含大写“W” private static void predicateAndTest(Predicate<String> one, Predicate<String> two, String string){System.out.println("既包含大写“H”,又包含大写“W”吗? " + one.and(two).test(string));}private static void runPredicateAndTest(){String string = "Hello Java";predicateAndTest(s -> s.contains("H"), s -> s.contains("W"), string);}// 判断一个字符串包含大写“H” 或者 包含大写“W” private static void predicateOrTest(Predicate<String> one, Predicate<String> two, String string){System.out.println("包含大写“H”或者包含大写“W”吗? " + one.or(two).test(string));}private static void runPredicateOrTest(){String string = "Hello Java";predicateOrTest(s -> s.contains("H"), s -> s.contains("W"), string);}//字符串很长吗 private static void predicateNegateTest(Predicate<String> function){boolean veryLong = function.negate().test("Hello");System.out.println("这个字符串很长吗? " + veryLong);}private static void runPredicateNegateTest(){predicateNegateTest(s -> s.length() <= 5);}// 数组当中有多条“姓名+性别”的信息如下, // 请通过 Predicate 接口的拼装将符合要求的字符串筛选到集合ArrayList 中, // 需要同时满足两个条件:1. 必须为女生;2. 姓名为4个字。 private static List filterByPredicate(Predicate<String> one, Predicate<String> two, String[] array){List<String> list = new ArrayList<String>();for (String string : array){if (one.and(two).test(string)){list.add(string);}}return list;}private static void runFilterByPredicate(){String[] array = { "迪丽热巴,女", "古力娜扎,女", "马尔扎哈,男", "赵丽颖,女" };List<String> list = filterByPredicate(s -> "女".equals(s.split(",")[1]),s -> s.split(",")[0].length() == 4,array);System.out.println(list.toString());}4、Function接口java.util.function.Function<T,R> 接口用来根据一个类型的数据得到另一个类型的数据,前者称为前置条件,后者称为后置条件。Function 接口中最主要的抽象方法为: R apply(T t) ,根据类型T的参数获取类型R的结果。使用的场景例如:将 String 类型转换为 Integer 类型。Function 接口中有一个默认的 andThen 方法,用来进行组合操作。///////////////////////Function接口////////////////////////// private static void functionApply(Function<String, Integer> function){int num = function.apply("30");System.out.println(num + 20);}private static void runFunctionApply(){functionApply(s -> Integer.parseInt(s));}// 先将一个字符串转为int,然后再乘10 private static void functionAndThenApply(Function<String, Integer> one, Function<Integer, Integer> two){// 第一个操作是将字符串解析成为int数字,第二个操作是乘以10。两个操作通过 andThen 按照前后顺序组合到了一起。 System.out.println(one.andThen(two).apply("10"));}private static void runFunctionAndThenApply(){functionAndThenApply(s -> Integer.parseInt(s), integer -> integer * 10);}// 1. 将字符串截取数字年龄部分,得到字符串; // 2. 将上一步的字符串转换成为int类型的数字; // 3. 将上一步的int数字累加100,得到结果int数字。 private static void convertByFunction(Function<String, String> one,Function<String, Integer> two,Function<Integer, Integer> three){System.out.println(one.andThen(two).andThen(three).apply("赵丽颖,20"));}private static void runConvertByFunction(){convertByFunction(s -> s.split(",")[1], s -> Integer.parseInt(s), integer -> integer += 100);}延迟方法与终结方法函数式接口当中,方法可以分成两种:延迟方法:只是在拼接Lambda函数模型的方法,并不立即执行得到结果。终结方法: 根据拼好的Lambda函数模型,立即执行得到结果值的方法。总结:统一运行一遍:public static void main(String[] args) {System.out.println("Supplier 接口==================");testSupplier();runGetMax();System.out.println();System.out.println("Consumer 接口==================");testConsumer();testAndThenAccept();runFormatPrint1();runFormatPrint2();System.out.println();System.out.println("Predicate 接口==================");runPredicateTest();runPredicateAndTest();runPredicateOrTest();runPredicateNegateTest();runFilterByPredicate();System.out.println();System.out.println("Function 接口==================");runFunctionApply();runFunctionAndThenApply();runConvertByFunction();}输出:Supplier 接口==================HelloWorld333Consumer 接口==================HellohelloHELLO姓名:迪丽热巴。性别:女姓名:古力娜扎。性别:女姓名:马尔扎哈。性别:男姓名:迪丽热巴。性别:女姓名:古力娜扎。性别:女姓名:马尔扎哈。性别:男Predicate 接口==================这个字符串很长吗? false既包含大写“H”,又包含大写“W”吗? false包含大写“H”或者包含大写“W”吗? true这个字符串很长吗? false[迪丽热巴,女, 古力娜扎,女]Function 接口==================50100120
2023年12月03日
0 阅读
0 评论
0 点赞
2023-12-03
这样也行?(java克隆对象的方法)java如何实现克隆,Java中如何克隆集合——ArrayList和HashSet深拷贝,java list clone,
编程人员经常误用各个集合类提供的拷贝构造函数作为克隆List,Set,ArrayList,HashSet或者其他集合实现的方法。需要记住的是,Java集合的拷贝构造函数只提供浅拷贝而不是深拷贝,这意味着存储在原始List和克隆List中的对象是相同的,指向Java堆内存中相同的位置。增加了这个误解的原因之一是对于不可变对象集合的浅克隆。由于不可变性,即使两个集合指向相同的对象是可以的。字符串池包含的字符串就是这种情况,更改一个不会影响到另一个。使用ArrayList的拷贝构造函数创建雇员List的拷贝时就会出现问题,Employee类不是不可变的。在这种情况下,如果原始集合修改了雇员信息,这个变化也将反映到克隆集合。同样如果克隆集合雇员信息发生变化,原始集合也会被更改。绝大多数情况下,这种变化不是我们所希望的,克隆对象应该与原始对象独立。解决这个问题的方法是深克隆集合,深克隆将递归克隆对象直到基本数据类型或者不可变类。本文将了解一下深拷贝ArrayList或者HashSet等集合类的一种方法。如果你了解深拷贝与浅拷贝之间的区别,那么理解集合深克隆的方法就会很简单。Java集合的深克隆下面例子有一个Employee集合,Employee是可变对象,成员变量name和designation。它们存储在HashSet中。使用java.util.Collection接口的addAll()方法创建集合拷贝。然后修改存储在原始集合每个Employee对象的designation值。理想情况下这个改变不会影响克隆集合,因为克隆集合和原始集合应该相互独立,但是克隆集合也被改变了。修正这个问题的方法是对存储在Collection类中的元素深克隆。输出:可以看到改变原始Collection中Employee对象(改变designation为”staff“)在克隆集合中也有所反映,因为克隆是浅拷贝,指向堆中相同的Employee对象。为了修正这个问题,需要遍历集合,深克隆Employee对象,在这之前,要重写Employee对象的clone方法。1)Employee实现Cloneable接口2)为Employee类增加下面的clone()方法3)不使用拷贝构造函数,使用下面的代码来深拷贝集合4)运行相同的代码更改原始集合,克隆集合不会也被更改。可以看到克隆集合和原始集合相互独立,它们指向不同的对象。这就是Java中如何克隆集合的内容。现在我们知道拷贝构造函数或者List或Set等各种集合类的addAll()方法仅仅创建了集合的浅拷贝,而且原始集合和克隆集合指向相同的对象。为避免这个问题,应该深克隆集合,遍历集合克隆每个元素。尽管这要求集合中的对象必须支持深克隆操作。
2023年12月03日
0 阅读
0 评论
0 点赞
1
2
...
278