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


    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(" ");
        }
        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(" ");
        }
        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(" ");
        }
        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 ",pi);
        return 0;
    }
    */


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

    /*//4.5
    //输入两个正数,求他们的最大公约数和最小公倍数
    #include <stdio.h>
    int main()
    {
        printf("请输入两个数: ");
        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 ",i);
                break;
            }
        }
        for(int j=m;j<=m*n;j++)
        {
            if(j%m==0&&j%n==0){
                printf("最小公倍数是%d ",j);
                break;
            }
        }
        return 0;
    }
     */

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

    //输入一行字符,分别统计其中英文字母、空格、数字和其他字符的个数
    /*//program 4.6
     //在ascii表上,是先大写字母,再小写字母,也就是说小写字母的ascii值较大,但是大写字母和小写字母之间还有几个其他的字符,不是连续的
     #include "stdio.h"
     int main()
     {
     char ch;

     ch=getchar();   //①  将传入的字符给变量ch
     while(ch!=‘ ')   //②   //这里可以用这个(ch=getchar())!=' '来代替①②③,因为getchar函数每一次只判断一个字符,如果在下面不加③,那么默认就只读入一个字符,while语句只执行一次,而无法执行' '指令,所以分开写的话必须在后面加③,这样才能持续读一个个字符。
     {
     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(" ");
     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;
    }
    */

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

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

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

  • 相关阅读:
    MSSQL_打开xp_cmdshell
    想在win7 32bit的情况下装个64位虚拟机的想法
    查看系统已运行了多久
    sql弄个表结构出来..
    在win下的cmd 的find
    告别google.com.hk的龟速
    VC常用数据类型使用转换详解
    C++中的文件输入/输出ios:xx eat Processing(zz)
    X86汇编语言学习手记(1)
    程序员数据结构笔记
  • 原文地址:https://www.cnblogs.com/wzy294250051/p/4787911.html
Copyright © 2020-2023  润新知