本次作业要求:https://edu.cnblogs.com/campus/hljkj/Cprogramming_2018Autumn_CST2018_3/homework/2503
函数 6-1统计各位数字
1 #include <stdio.h> 2 3 int Count_Digit ( const int N, const int D ); 4 5 int main() 6 { 7 int N, D; 8 9 scanf("%d %d", &N, &D); 10 printf("%d\n", Count_Digit(N, D)); 11 return 0; 12 } 13 14 int Count_Digit( const int N,const int D ){ 15 int i,count = 0; 16 int s = N; 17 if(N < 0){ 18 s = -N; 19 } 20 if(s==0){ 21 if(D==0){ 22 count = 1; 23 }else{ 24 count = 0; 25 } 26 }while(s%10>0||s/10 != 0){ 27 if(s%10==D){ 28 count++; 29 } 30 s = s/10; 31 } 32 return count; 33 }
第一步,首先调用函数count-Digit()引入i,并且将count附初始值为零,将n的值赋给s,目的使数据变为正数。’
第二步,如果使某数为零,那么查找该数中的零的个数就为一,反之个数为零。
第三部,每次对该数除以十再去和十取余确定该数中的其他数要查的个数。
第四部,返回count。
首先看这个错误代码,我后来才发现将count打成了const,因为调用函数时,当时很着急,可能就马虎了,不小心将count达成了const,最后导致的错误。
对于这种错误,下次一定会注意。也要多敲一些代码去巩固。
2.求一组数中的最大值和次最大值
1 #include<stdio.h> 2 int main() 3 { 4 int i,a[10]; 5 int max=0,cmax=0; 6 for(i=0;i<10;i++) 7 { 8 scanf("%d",&a[i]); 9 if(max<a[i]) 10 { 11 cmax=max; 12 max=a[i]; 13 }if(cmax<a[i]) 14 { 15 cmax=a[i]; 16 } 17 } 18 printf("max=%d,cmax=%d",max,cmax); 19 return 0; 20 }
第一步,首先声明变量i做循环,引入一个数组含有十个元素,定义max,cmax,将他们初始化为第一个数,也就是假定第一个数为要取的数。
第二步,依次将数组里的每个数附值,取地址。
第三步,将所选的每个数依次和max作比较,如果大于max 将max值赋给cmax,将所选的数赋给max,之后将剩余的其他的数和次大值进行比较如果比次大值大,将该数赋给次大值。
第四步,依次输出最大值和次大值。
首先,看我所打的代码,显示是一处错误,可实则为两处,第一处是n没有定义,就引入了循环中,应该是10,或者在前面定义一个n,这样才可以用n做循环变量,第二个我的错误是没有显示出来的,就是编译没错误,但是如果运行出来错误就明显了,不符合题意,也是源于自己对程序的不了解吧,正常情况下在下面cmax<a[i-1]那段,应该打成cmax<a【i】,我之前一直以为,为了使次大值和剩余的数进行比较,应该是i-1,可不知道的是这道题就不用强调剩余的数了,因为正确答案的意思,已经是比完最大值之后剩余的数和次大值进行比较了,所以不用强调。
3.简化的插入排序
1 #include<stdio.h> 2 int main() 3 { 4 int N,x; 5 scanf("%d",&N); 6 int a[10]; 7 int i; 8 for(i=0;i<N;i++) 9 {scanf("%d",&a[i]); 10 } 11 scanf("%d",&x); 12 for(i=0;i<N;i++) 13 { 14 if(a[i]>x) 15 { 16 printf("%d ",x); 17 break; 18 }else{ 19 printf("%d ",a[i]); 20 } 21 }if(i==N) 22 { 23 printf("%d ",x); 24 } 25 else{ 26 for(;i<N;i++){ 27 printf("%d ",a[i]); 28 } 29 } 30 return 0; 31 }
第一步,定义个数n,和要插入的数x,引入含有一个十个元素的数组,定义循环变量i,之后对数组里每个元素依次取地址赋值,之后对要插入的数取地址赋值。
第二步,进入for循环中,如果数组里每个值都大于要插入的值,那么将x这个数落下来,之后跳出这个循环,否则按以前的顺序输出数组里小于这个数的其他数。
第三步,如果最后一个位置是你要插入的数话,还得另做考虑,直接落下来。
首先自己的错误有三处,我认为,后两处的错误简直是太马虎了,第二个图的错误就是我正常情况下应该在最后一个if前面再加上一个括号,但是我忘打了,还有第三个图那个错误其实之前也犯过很多次,而且每次我都没记性,都找了很久才找出来,就是标点符号一定要注意,必须是英文的形式,而我打成了中文的形式。好,那现在转过头来再说说第一个错误,可能是对代码的第一印象吧,我总是将那个for()循环定义成(i=0;i<n;i++)但这道题并不是那个意思,他最后应该让你把那个剩下的数落下来,而如果将i=0,最后 写入式子的话,就说明从第一个数进行,而不是将剩下的数落下来。还有就是我最初忘了想要插入的这个数是最后一位的情况,但这也是我的室友教我的,刚开始没反应过来,因为 如果要插入的数如果按升序排列的话,如果这个数比任何数都大,就得放在最后一位,但是我之前打的那些情况,没包含这种情况。所以得在下面说明这种情况if(i==n)时。
为了解决这类情况就得多敲,因为现在也是刚刚理解,入门,底子实在是太薄,而且也要善于向别人虚心学习,有的时候别人的方法会给你很多思路,所以我觉得这点很重要。
总结:通过这几天的学习,逐渐理解了什么是数组,如何引用数组,使用数组的时候也应该定义数组,理解了什么是二维数组,以及二维数组使用
数组是一些具有相同类型数据的集合,数组中的数据按照一定的顺序排列存放。同一数组中的每个元素都具有相同的数据类型,有统一的标识符即数组名,用不同的序号即下标来区分数组中的元素。
引用数组前首先要定义数组,数组元素的使用方法与同类型的变量完全相同。例如:int k,a【10】;定义了整形变量k和整形数组。在可以使用整形变量的任何地方,都可以使用整形数组a的元素、例如:
k=3;
a[0]=23;
a[k-2]=a[0]+1;scanf("%d",&a[9]);
scanf("%d",&a[9]);
一维数组的初始化,就是对数组中的每个数依次附初始值,如果静态数组没有初始化,系统自动给所有的元素赋值为零。即static int b【5】;等价于static int b[5]={0,0,0,0,0};数组的初始化也可以针对部分元素,例如:static int b【5】={1,2,3};即对数组中的前三个数附了初始值其余都为零。
而二维数组和一维数组也是类似的。例如:int a【3】【2】;定义一个二维数组a,3行两列,共六个元素,引用二维数组要指定两个下标,即行下标和列下标,形式为数组名【行下标】【列下标】
二维数组的初始化也可以只针对部分元素,例如static int b 【4】【3】={{1,2,3,},{},{4,5}};只对b数组的第零行的全部元素和第二行的前两个元素赋初值,其余元素的初值都为零。
问题:对于一些定义新变量,对这个变量取地址我还是有一点懵,首先是我不明白为什么一定要用到这个变量的时候才可以对他取地址,而如果目前用不到的话,目前只能够定义它,不能够对他进行取地址,这是我想了很久也没有明白的。
收货:我觉得我的能力应该提高了不少,因为在这之前还是根本看不明白代码,现在能够读懂了一些,以后还是需要去多敲,多练,多向厉害的人学习,这样才能够进步。还有我觉得章宇楠同学的流程图做的很厉害,我到现在还是不怎么会做流程图,只是能够理解代码是什么意思,而不能够运用流程图去给他说清楚,所以还需要多理解,多与大家沟通,去学习,还有就是对于我上面那个问题其实我请教了室友,只有用的时候,才可以去赋值,用不到先不能对他进行取地址赋值。
孙凯同学https://www.cnblogs.com/sunkai6815618/p/10134556.html
章宇楠同学 https://www.cnblogs.com/zyn-66/p/10145222.html
梁德辉同学https://www.cnblogs.com/wsaldh/p/10127051.html