打仗C#言语只需短短几天时候,想要写出什么嵬峨上的深切性研讨文章,预计也是满篇的猜测和一些没有逻辑的揣摸。停止如今而言,从言语入门学问(大多数顺序员的入门典礼——输出“Hello,world!”)、数据和数据范例、数据运算、顺序功用完成流程和轮回、数组和鸠合这些分块的小学问到将所学学问串连运用,并没有蒙受太大的难题, 像是在用形貌的言语来求解运用题,再经由过程代码将这些形貌的语句表达出来。
记得开班时做了三道意见意义题。第一题是主人输送草、羊和狼过河,狼吃羊,羊吃草,主人看守状况不会发作任何事,一次只能输送一样过河,这道题给我的觉得是用来指导学员头脑体式格局,趁便视察学员是不是有一个清楚的思绪来剖析息争答题目,找到症结点就是羊只能零丁存在或许随主人一同,如许就可以很好的处理题目。第二题是三个僧人和三个怪物过河,只需一只空船,船一次可以运两人,每当涌现怪物数目大于僧人数目,游戏就完毕了,这道题也是磨练思索题目的体式格局,然则还要注重怪物和僧人运输流程的准确性,必需保证僧人平安的先悉数抵达对岸,缭绕这个中间来处理题目。第三题印象比较深入,做完后,旁边的同学说可以27s,然后我就举行了重复的尝试(只能是29s)。要求是应用一盏只能亮30s的灯指导5人过桥,一次只能两人持灯经由过程,5人所需时候分别为1s、3s、6s、8s、12s固然,这道题要捉住重点,就是只管将1s小孩用来反方向运灯,而且必需将12s的老人和8s的胖子一趟完成经由过程,在屡次尝试中,我发明只需保证1s的小孩返回两趟,3s小孩返回一趟,耗时最长的两位一次经由过程,不论其他如何排序设置,都不会影响到末了的结果。
回忆一下这个有意义的开课典礼,再回到C#的天下中,实在二者有许多的共同之处,如今就写一下差别代码的一样完成结果这一回事!
先举一个简朴的例子,在求水仙花数时,须要将一个百位数的每一名的数值举行求解,答案中给出的代码是如许的:
int i = 100;while (i < 1000) { int a = i / 100 % 10; int b = i / 10 % 10; int c = i % 10; if (a * a * a + b * b * b + c * c * c == i) { Console.WriteLine(i); } i++; }
而我在解答时运用了两种差别的要领,第一种是:
int i = 100;while (i < 1000) { int a = i /100; int b = i % 10 / 10; int c = i % 10; if (a * a * a + b * b * b + c * c * c == i) { Console.WriteLine(i); } i++; }
第二种要领是:
int i = 100;while (i < 1000) { int a = i / 100; int b = (i - a * 100) / 10; int c = i -a * 100 - b * 10; if (a * a * a + b * b * b + c * c * c == i) { Console.WriteLine(i); } i++; }
以上均是准确的、可完成的代码,代码之所以存在差别,就是在运算时,对题目剖析和思索的角度差别。第一种是将所求位数背面的内容扬弃,再将盈余的数对10取余,由于切除后盈余的数的个位老是对应所求位数的值。第二种也是将这个数拆分,将这个数对所求位数的10的倍数求余,将所求位数之前的数悉数扬弃,获得的是的第一名老是所求位数的值,再用除法就可以获得想要的值。第三种就是个死方法,过剩的全减掉再除就可以够了。总而言之,差别的思绪、差别的解题要领,并不会影响代码的完成,然则挑选简短、文雅的代码,可以进步全部代码的美感,这一点照样须要注重。就本身感悟而言,肯定是优先挑选本身可以明白的代码,如许用起来才会随心所欲,同时可要扩展本身的见地,多想一想差别的思绪的完成体式格局。
然则,说到这里,或许有人会有质疑,上面就是一道数学题,和编码的思绪有什么关系。那末再来看一下我和其他人差别的完成思绪,这个题目是关于竖立一个数组并赋值后,让用户输入一个要查找的数字,推断该数字在数组中是不是存在。
int[] nums = { 4, 8, 12, 333, -9, 1 };bool isFind = false;for (int i = 0; i < nums.Length; i++) { if (nums[i] == n) { isFind = true; break; } }if (isFind) { Console.WriteLine("数组中存在该数"); }else{ Console.WriteLine("数组中不存在该数"); }
我思索的要领是:
int[] nums = { 4, 8, 12, 333, -9, 1 }; Console.Write("请输入须要查找的数字:");int input2 = int.Parse(Console.ReadLine());for (int i = 0; i < 5; i++) { if (nums[i] == input2) Console.WriteLine("在数组中查找到该数值,该数为数组中的第" + (i + 1) + "项!"); if(i==4&&nums[i]!=input2) Console.WriteLine("未在数组中找到对应项!"); }
第一种代码是经由过程定义一个bool范例数据isFind,假如找到,就转变isFind的数据,然后经由过程isFind的数据完成完成。而我在思索时,是想假如没有找到,那末轮回完成后轮回次数就会到达最大值,然则此时末了一名数与输入的数雷同,两个输出对应前提都能满足,所以,排查到末了而且末了一名的值也不等,才满足输出未找到结果。经由过程如许的剖析,就写出了这两段代码。这就是差别思绪采纳差别代码来完成雷同功用的体式格局。
关于差别代码完成雷同功用,另有一个最典范的例子,是不能不提的,那就是数组和鸠合的排序,下面引见三种思绪:交流排序、冒泡排序和挑选排序。
交流排序中间思想是从第一个数组项最先,牢固nums[i],顺次序递次i+1个背面的数据举行比较,假如有比num[i]小的值,就对其举行交流。
for( int i = 0; i < arrays.Length - 1; i++) { for(int j = i+1; j < arrays.Length; j++) { if(arrays[i]>arrays[j]) { int temp=arrays[i]; arrays[i]=arrays[j]; arrays[j]=temp; } } }
冒泡排序是将最大的数沉到底部,先将末了一个位置牢固,再从第一个数最先比较,每碰到一个大的数,这个数就与后一名交流,就像气泡一样,这个更改的寻觅中的值越滚越大,直到末了一名。这时候,再肯定倒数第二位,再次举行替代。(第二个for轮回中,每次轮回,nums[j]的值老是逐步变大。)完成代码以下:
for(int i = nums.Length - 1; i > 0; i--) { for(int j = 0; j < i; j++) { if( nums[j] > nums[j+1] ) { int temp = nums[j]; nums[j] = nums[j+1]; nums[j+1] = temp; } } }
挑选排序从第一个数最先,先假定第一个数为最小的数,将其与背面每个数举行比较,假如碰到小的,就纪录这个数的下标,轮回完成后,纪录的下标对应的数一定是数据组的最小值,此时替代最小值到第一名。背面顺次轮回,完成排序。
for(int i = 0; i < nums.Length - 1; i++) { int index = 1; for(int j = i+1; j < nums.Length; j++) { if(nums[j])<nums[index]) { index=j; } } int temp = nums[i]; nums[i] = nums[index]; nums[index] = temp; }
有上面三种排序要领可以看出,只需可以完成功用,思绪和代码并不主要。只需能找到处理题目的症结点,并缭绕症结点弄懂处理题目的要领,依据要领肯定流程,再完成代码的编写,如许想要到达功用的完成并不难。不过为了全部代码的便于检察和修正,在运用这些代码时,在可以明白代码誊写的思绪前提下,只管运用构造优秀,语句简约的语句。固然,假如一些要领难以明白,最好照样运用本身明白的代码誊写,便于本身完成检察和修正,假如必要,解释也是必不可少。
总而言之,多视察他人的思绪,多看多想多开辟,老是没有害处。毕竟是编程,难以明白或许运用不熟练,处理的要领照样多练多敲,没有其他的捷径。
以上就是C#中关于顺序功用完成以及对代码挑选的思索的细致内容,更多请关注ki4网别的相干文章!