12天学好C语言——记录我的C语言学习之路



Day 4:



首先来看一段程序:



//输出下面4*5的矩阵

/*

1  2  3   4   5

2  4  6   8   10

3  6  9   12  15

4  8  12  16  20

*/



//算法1

/*//program 4.1

#include<stdio.h>

int main()

{

    int i,j,n;

    for(i=1;i<=4;i++)

    {

        n=i;

        for (j=1; j<=5; j++) {

            

            printf("%d “,n);   //可以用之前学过的格式符对齐

            n+=i;//每一行后一个和前一个之间正好差该行的行数

        }

        printf("\n");

    }

    return 0;

}

*/



//算法2

/*//program 4.2

 #include<stdio.h>

int main()

{

    int i,j;

    for (i=1; i<=4; i++) {

        for (j=1; j<=5; j++) {

            printf("%d ",i*j); //每一个值正好等于该值行列数的乘积

        }

        printf("\n");

    }

    return 0;

}

*/



两个算法不同,只是给大家举例参考,希望读者能提供更多优质的算法。



昨天学了break和continue,那么我们再这个矩阵之中对这两个语句再次形象的解释,大家请看 program 4.3





/*program 4.3

//break和continue在循环中的效果。

#include<stdio.h>

int main()

{

    int i,j;

    for (i=1; i<=4; i++) {

        for (j=1; j<=5; j++) {

            if(i==3&&j==1)

                continue;//跳出3行1列的数字,3行的每一个数字都向左移动一个位置。如果这里换成的break的话,3行均不输出,3行空出来。

            printf("%d ",i*j); //每一个值正好等于该值行列数的乘积

        }

        printf("\n");

    }

    return 0;

}

*/



一道经典的例题(program 4.4)

//用 pi/4 = 1 - 1/3 + 1/5 - 1/7 + ... 公式求pi的近似值,直到发现某一项的绝对值小于(10的6次方分之一)为止。



/*//program 4.4

#include<stdio.h>

#include<math.h>

int main()

{

    int sign=1;

    double pi=0,term=1,i=1;//这个地方不能先定义一个double类型的k,然后把绝对值赋给k,这样是会出错的。当然定义一个int型的k,然后再赋给k,也是不行的。遇到绝对值,还是乖乖的用绝对值的原本形式进行判断吧

    //int k;

    //k=fabs(term);

    while (fabs(term)>=1e-6)

    {

        pi=pi+term;

        sign=-sign;

        i=i+2;

        term=sign/i;   //写代码一定要仔细,这里是每一项的值,不要写错,理解对更要写对!!!!!!

    }

    pi=pi*4;

    printf("%10.8f\n",pi);

    return 0;

}

*/





之前我们求过最大公约数,现在下面的这个程序(program 4.5)加入了两个数的最大公倍数的求法,供大家回顾学习。



/*//4.5

//输入两个正数,求他们的最大公约数和最小公倍数

#include <stdio.h>

int main()

{

    printf("请输入两个数:\n");

    int m,n,temp;

    scanf("%d%d",&m,&n);

    if(m<n)

    {

        temp=m;

        m=n;

        n=temp;

    }

    for(int i=n;i>=1;i--)

    {

        if(n%i==0&&m%i==0){  //  注意这个大括号的位置,要包括break。如果没有包含break,那么break需要等着if中的条件都执行完毕才执行break,那样就会多输出很多值。而我们是找到符合条件的值就跳出循环。

            printf("最大公约数是%d\n",i);

            break;

        }

    }

    for(int j=m;j<=m*n;j++)

    {

        if(j%m==0&&j%n==0){

            printf("最小公倍数是%d\n",j);

            break;

        }

    }

    return 0;

}

 */



再写一个大家学习过程中一定会遇到的程序。(program 4.6)



//输入一行字符,分别统计其中英文字母、空格、数字和其他字符的个数

/*//program 4.6

 //在ascii表上,是先大写字母,再小写字母,也就是说小写字母的ascii值较大,但是大写字母和小写字母之间还有几个其他的字符,不是连续的

 #include "stdio.h"

 int main()

 {

 char ch;



 ch=getchar();   //①  将传入的字符给变量ch

 while(ch!=‘\n')   //②   //这里可以用这个(ch=getchar())!='\n'来代替①②③,因为getchar函数每一次只判断一个字符,如果在下面不加③,那么默认就只读入一个字符,while语句只执行一次,而无法执行'\n'指令,所以分开写的话必须在后面加③,这样才能持续读一个个字符。

 {

 if((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z'))

 {

 if((ch>='W'&&ch<='Z')||(ch>='w'&&ch<='z'))

 ch-=22;

 else

 ch+=4;

 }

 printf("%c “,ch);   //不是字母的,直接就输出了。是字母的要通过变化,就是执行上面的if语句。

 ch=getchar();   //③再输入下一个变量给ch(这个地方没有很看懂,明明是同时输入的China!,为什么这个地方看起来像是一个一个字符输入的一样呢~)————这个地方的原因是getchar一次只接收一个字符。

 }

 

 printf("\n");

 return 0;

 }



 */



下面是我在书中读到的一个题目,对于一个学了3.6天,哦不,可能是3.7天编程语言的人来说,它足够吸引人去做了。因为这个程序需要你自己输入需要计算的一切数据,然后计算机根据算法得到结果,再反馈回来。很有意思。而更有意思的是,在这个问题上,我发现了一个错误。



//Sn=a+aa+aaa+aaaa+aaaaa+...的值,n是最大项的位数,a、n由键盘输入()



这个题当时我看到的时候是用第一种方法(program 4.7)去做的,这个方法和书中提供的答案不一样,但是也是很接近正确答案的,但是运行结果不对。我希望读者能用我的这种方法做一做,然后找到第一种答案为什么是错误的,并改正。



/*//program 4.7

//第一种方法(运行时结果不对,为什么?)

#include<stdio.h>

#include<math.h>

int main()

{

    int a,n,Sn=0,term=0;

    scanf("%d%d",&a,&n);

    int i=n-1;

    while(i<=n&&i>=0)

    {

        term=a*pow(10,i);   //这里是用的10的n次方的方法去得到每一项

        Sn=Sn+term;

        i=i-1;

    }

    printf("%d",Sn);

    return 0;

}

*/



如果读者将我的代码验证过,那么下面的解释你就会觉得很容易懂了。首先,我说上面 program 4.7

所示的代码很接近正确答案了,但是却是不完整的。因为我求出的只是整个Sn中最大一项的值,比如说:a=2,n=3时。Sn=2+22+222=246,上面的程序只得到了222这一项,所以答案缺少的是其他项的部分,显然,一个for循环就可以解决了(program 4.8)



/*//program 4.8

#include<stdio.h>

#include<math.h>

int main()

{

    int a,n,Sn=0,term=0;

    scanf("%d%d",&a,&n);

    for(int j=n-1;j>=0;j--)

    {

        int i=j;   //这里很重要,因为j的值每次用完都会改变,所以不能直接使用,要先找一个替代品,也就是i了

        int sum=0;   //这里也很重要,因为sum的值是每一项的值(Sn的每一项),sum每次使用的时候必须初始化为0

        while(i<=n&&i>=0)

            {

                term=a*pow(10,i);

                sum=sum+term;   //term的值是sum的每一项

                i=i-1;

            }

        Sn=Sn+sum;

    }

    printf("%d",Sn);

    return 0;

}

*/



//第二种方法(program 4.9)和之前的略有不同,还是那个例子:当a=2,n=3时。Sn=2+22+222=246,2*10+2=22,22*10+2=222,依照每两项之间的规律,可以得出后一项与前一项的倍数关系



/*//program 4.9

 #include <stdio.h>

int main()

{

    int a,n,i,Sn=0;

    scanf("%d%d",&a,&n);

    int term=a; //这里很有必要,因为下面a的值不变。倍数关系需要一个新的变量的表示。

    if(n!=0) //这里必须判断n=0的情况,因为0个a是0。没有项。

    {

        for(i=1;i<=n-1;i++)

        {

            term=term*10+a;

            Sn=Sn+term;

        }

        printf("%d",Sn+a);//最后记得要加上a,因为上面的for循环是从第二项开始的。

    }

    else

        printf("0");

    return 0;

}

*/



再看下面这个题目(program 4.10),异曲同工。



//求1!+2!+3!+...+20!



/*//program 4.10

//求1!+2!+3!+...+20!

#include<stdio.h>

int main()

{

    double i,j,k,sum=0;

    for (i=20; i>=1; i--) { //i控制循环的次数,所以下面需要用到这个i的,所以i的值一定要用别的值取代了之后再用,不能改变了原本循环i的值

        j=i;

        k=j;

        while(j!=1)   //j控制的是每一项的循环次数,也不能变。如20!这一项,就要循环直至20*19*18*...*3*2*1

        {

            k=k*(j-1);  //k是每一项的循环之后的定值,最终值。

            j--;

        }

        sum+=k; //sum就是累计所有项的和

    }

    printf("%30.2f",sum);

    return 0;

}

*/



这个程序简直和上面的那道题的解题模式一模一样,读者一定要练习一下。



今天的学习到此为止吧,学习的程序并不多,但能活跃你的思维。读者务必将每个程序都亲力亲为一遍,做到烂熟于心的程度。如果你真的做了,那么你肯定就能学到不少东西,超出这些程序以外的。

版权声明:本文为博主原创文章,未经博主允许不得转载。

12天学好C语言——记录我的C语言学习之路(Day 4)的更多相关文章

  1. 12天学好C语言——记录我的C语言学习之路(Day 12)

    12天学好C语言--记录我的C语言学习之路 Day 12: 进入最后一天的学习,用这样一个程序来综合考量指针和字符串的关系,写完这个程序,你对字符串和指针的理解应该就不错了. //输入一个字符串,内有 ...

  2. 12天学好C语言——记录我的C语言学习之路(Day 11)

    12天学好C语言--记录我的C语言学习之路 Day 11: 因为指针部分比较的难,所以我们花费的时间也是最长的,希望大家耐的住性子,多多理解,多多打代码.好了,废话不多说,来看第11天的学习. //编 ...

  3. 12天学好C语言——记录我的C语言学习之路(Day 10)

    12天学好C语言--记录我的C语言学习之路 Day 10: 接着昨天的指针部分学习,有这么一个题目: //还是四个学生,四门成绩,只要有学生一门功课没及格就输出这个学生的所有成绩 /*//progra ...

  4. 12天学好C语言——记录我的C语言学习之路(Day 9)

    12天学好C语言--记录我的C语言学习之路 Day 9: 函数部分告一段落,但是我们并不是把函数完全放下,因为函数无处不在,我们今后的程序仍然会大量运用到函数 //转入指针部分的学习,了解指针是什么 ...

  5. 12天学好C语言——记录我的C语言学习之路(Day 8)

    12天学好C语言--记录我的C语言学习之路 Day 8: 从今天开始,我们获得了C语言中很有力的一个工具,那就是函数.函数的魅力不仅于此,一个程序到最后都是由众多函数组成的,我们一定要用好函数,用熟练 ...

  6. 12天学好C语言——记录我的C语言学习之路(Day 7)

    12天学好C语言--记录我的C语言学习之路 Day 7: 昨天进行了一天的数组学习,今天大家可以先写几个昨天的程序热热身,回顾回顾,然后今天第一个新程序也是关于数组的,比较难,准备好就开始啦! //输 ...

  7. 12天学好C语言——记录我的C语言学习之路(Day 6)

    12天学好C语言--记录我的C语言学习之路 Day 6: 今天,我们要开始学习数组了. //①数组部分,数组的大小不能够动态定义.如下: //int n;   scanf("%d,& ...

  8. 12天学好C语言——记录我的C语言学习之路(Day 5)

    12天学好C语言--记录我的C语言学习之路 Day 5: 第五天的学习开始了,今天我们主要对几个程序进行编写,让自己充分的熟练编程语言,大量的题目会让自己变的精炼.以一个程序(program 5.1) ...

  9. 12天学好C语言——记录我的C语言学习之路(Day 3)

    12天学好C语言--记录我的C语言学习之路 Day 3: 不知不觉到了第三天的学习,我们前两天学习的东西很杂乱,各个方面都有学习.我觉得这不是不系统,也不是学的不扎实,这种学习对于初学者而言我认为是很 ...

随机推荐

  1. 射频识别技术漫谈(4)——数据编码【worldsing 笔记】

    前已述及,射频识别技术中的调制方法一般使用调幅(AM),也就是将有用信号调制在载波的幅度上传送出去.这里的"有用信号"指用高低电平表示的数据"0"或" ...

  2. Swift 基本语法2

    一.?和! 1.可选类型: ? 在swift中,可选类型(?)其根源是一个枚举型,里面有None和Some两种类型.其实所谓的nil就是Optional.None, 非nil就是Optional.So ...

  3. NGUI学习笔记(四):动态加载UI和NGUI事件

    动态加载UI 我们进入一个场景后,如果将这个场景所有可能用到的UI都直接放在场景中做好,由于要在进入场景时就部署好所有的UI对象,那么当UI对象较多时会碰到的问题是:1.初始化场景会产生非常明显的卡顿 ...

  4. maven依赖传递关系

    一.maven 依赖传递规则 举个例子,比如A依赖B,B依赖C,那么A也是依赖C的.A是对B的直接依赖,A对C是传递依赖 ①.最短路劲原则 如,路劲一:A依赖B,B依赖C,C依赖D(1.0.0): 路 ...

  5. 关于Hadoop结合RDBMS应用的一些思考

    最近一段时间一直在从事和hadoop相关的工作,主要是技术内容学习.安装配置优化以及一些框架结构的设计.在此期间,我对于RDBMS和Hadoop的结合应用有了一些自己的看法,写出来大家共同探讨一下. ...

  6. LeetCode144:Binary Tree Preorder Traversal

    Given a binary tree, return the preorder traversal of its nodes' values. For example: Given binary t ...

  7. mysql中不同事务隔离级别下数据的显示效果--转载

    事务是一组原子性的SQL查询语句,也可以被看做一个工作单元.如果数据库引擎能够成功地对数据库应用所有的查询语句,它就会执行所有查询,如果任何一条查询语句因为崩溃或其他原因而无法执行,那么所有的语句就都 ...

  8. maven系列之二maven项目的创建和maven项目的结构

    maven系列之一简单介绍了maven的基本信息,安装和配置,大家对maven有一个大概的了解,但是在maven项目开发中远远不够,为了进一步了解maven,现在我们介绍maven项目的创建和mave ...

  9. struts2 CRUD 入门 配置

    本文介绍struts2在eclipse下的配置,实现一个具有CRUD功能的图书管理系统. 1         开发环境配置 1.1           在Eclipse中配置Struts2 1.1.1 ...

  10. -----------------------------SpringMVC理解-----------------------------

    1.用户发送请求到前端控制器(DispatcherServlet); 2.前端控制器转发请求到处理器映射器(HandlerMapping): 3.处理器映射器将拦截的Action返回到前端控制器: 4 ...