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



Day 5:



第五天的学习开始了,今天我们主要对几个程序进行编写,让自己充分的熟练编程语言,大量的题目会让自己变的精炼。以一个程序(program 5.1)敲开沉睡的脑门吧。



//求(1+2+3+...+98+99+100)+(1²+2²+3²+...+50²)+(1/1+1/2+...+1/10)=?



/*//program 5.1

 #include "stdio.h"

int main()

{

    double a,b=1,c=1,sum1=0,sum2=0,sum3=0;

    for(a=1;a<=100;a++)

    {

        sum1+=a;

    }

    printf("sum1 = %lf\n",sum1);

    while(b<=50)

    {

        sum2+=b*b;

        b++;

    }

    printf("sum2 = %lf\n",sum2);

    while(c<=10)

    {

        sum3+=1/c;

        c++;

    }

    printf("sum3 = %lf\n",sum3);

    return 0;

}

*/



很显然,这个程序也是累加求和的,只不过分了三部分,如果昨天的学习学的彻底的话,这个程序应该不难。再看下一个程序(program 5.2):



/*//program 5.2

//输出所有的水仙花数,水仙花数是一个三位数,其各位数字立方和等于该数本身。

#include "stdio.h"

int main()

{

    int n,a,b,c;

    for(n=100;n<=999;n++)

    {

        a=n/100;

        b=n/10%10;

        c=n%10;

        if((a*a*a+b*b*b+c*c*c)==n)

            printf("%d\n",n);

    }

    return 0;

}

 */



上面的这个程序(program 5.2)基本所有的初学者都会遇到。这个程序让我们对 取整(/) 和 取余(%) 有了明确的认识。

a=123,

取整:a/100=1,因为a中只含有一个100,所以省略余数留下商,结果为1

取余:a%100=23,同上,余数是几就是几

合理的运用取整、取余,能让计算变的精炼,简单。



再看这样一个程序(program 5.3)



/*//program 5.3

//如果一个数的所有因子之和等于他自己,那么这个数成为完数。

#include<stdio.h>

int main()

{

    int n,i,sum;

    for (n=1;n<=1000;n++) {

        sum=0;   //这个程序不难,可能会出现的问题在于每次需要把sum清零,否则无法正常计算下一个数据。sum=0位置放对即可。

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

        {

            if(n%i==0)   //表示n能被i整除

                sum+=i;

        }

        if(sum==n)

            printf("%d是完数\n",n);

    }

    return 0;

}

*/



再练习一个题目(program 5.4),这些题目大都是一样的,但是可能初学者看起来会脑袋蒙蒙的,找不到下手点,毕竟对编程语言还是比较陌生的。教给大家一个方法,每个题先用数学思想做出来,然后转化成计算机语言,就简单许多了。



/*//program 5.4

//求2/1+3/2+5/3+8/5+...(前20项之和)

#include<stdio.h>

int main()

{

    int i;

    double f1=1,f2=2,w;   //这里的前两项一定要设为double型,因为结果是小数,要求精度,不然结果相差太多。

    double term,sum=0;   //sum一定要设为0,这是做什么题基本都要的,不然结果就会不确定了。

    

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

    {

        term=f2/f1;

        w=f2;   //后面f2发生了变化,但是后面还要用到f2,所以f2的值要先储备起来,以后使用。

        f2=f1+f2;

        f1=w;

        sum+=term;

    }

    printf("%lf",sum);

    return 0;

}

*/

这里还有两个十分有意思的题目。



//一个球从100m的高处落下,落地反弹一半距离,然后再落下。问第十次落地时,共经过多少米,第十次反弹多高?

//提供一下答案:第十次落地共经过299.609375米,第十次反弹0.097656米



/*//program 5.5

#include "stdio.h"

int main()

{

    double l=100,i,c,h;   // l自然表示的初始高度,而c表示的路程

    c=100;   //我们不会去计算第一次落下接触到地面这一段的距离,所以这里要先将这段距离计算进去

    for(i=1;i<=9;i++)   //去画画图,有能力的就脑子想想,自然知道i的范围怎么来的了

    {

        l=l/2;

        c+=2*l;

    }

    h=l/2;   //第十次落地并没有经历第十次反弹,所以要求第十次反弹,自然还要再基础上减半

    printf("第十次落地共经过%lf米\n",c);

    printf("第十次反弹%lf米\n",h);

    return 0;

}

*/



//一个猴子摘了n个桃子,第一天吃了一半零一个,以后每天吃前一天剩下的一半多一个,第10天早上想吃的时候就还剩下一个了,求n。       (答案:n=1534)



/*//program 5.6

#include "stdio.h"

int main()

{

    int m=1,day=1;//设最后一天剩m个,然后倒着推,最后m表示的就是第一天的桃子数量

    while (day<=9) {

        m=(m+1)*2;

        day++;

    }

    printf("%d",m);

    return 0;

}*/



/* //program 5.7

//下面这个程序是对上面程序结果的验证

#include "stdio.h"

int main()

{

    int n=1534,day=1;

    while (day<=9) {

        n=n/2-1;

        day++;

    }

    printf(“%d”,n);//最后的结果,表示的是第九天晚上剩的桃子数,也就是第十天早上的,正好是1个桃子,说明上面程序(program 5.6)是正确的。

    return 0;

}

 */

下面来看这样一个问题,输出一个图形。这种问题大家可能接触到不少,今天我们来看这样一段代码:

/*

 输出以下图案

     *       1

    ***      3

   *****     5

  *******    7

   *****     5

    ***      3

     *       1

*/



/*//program 5.8

#include <stdio.h>   //这个菱形的题目总的感觉就是找规律,找的是空格数目和星号数目的规律,因为中间出现转折(由少到多→由多到少),所以要分两部分for循环

int main()

{

    int i,j,k,m=5;



    for (i=0;i<=3;i++) {

        for (j=3-i; j>=1; j--) {

            printf(" ");

        }

        for(k=1;k<=2*i+1;k++)    //自己是多sb??!!这里2i+1???这不是数学,是2*i+1!!!(当时愚蠢的我将这里写成了2i+1,永远记住,你面对的是计算机,不是你的数学老师)

        {

            printf("*");

        }

        printf("\n");

    }



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

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

            printf(" ");

        }

        for(k=m;k>=1;k--)

        {

            printf("*");

        }

        m=m-2;

        printf("\n");

    }



    return 0;

}

*/



//自己再用简单的方法做一遍(这一遍也是分两部分,第一部分是前4行,第二部分是后三行。i代表的是行数,要找到每行中i与空格数目还有星号数目的关系),读者自行探寻 program 5.9 比program 5.8 优秀在什么地方



/*//program 5.9

 #include <stdio.h>

int main()

{

    int i,j,k;



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

    {

        for(j=3-i;j>=0;j--)

        {

            printf(" ");

        }

        for(k=1;k<=2*i-1;k++)

        {

            printf("*");

        }

        printf("\n");

    }



    for (i=3; i>=1; i--) {

        for (j=0; j<=3-i; j++) {   //要仔细注意这几个变量之间的微妙关系。有时候可以先写出自己的程序,然后运行一下,看着结果去慢慢调试,逐渐向正确答案靠拢。

            printf(" ");

        }

        for (k=2*i-1; k>=1; k--) {

            printf("*");

        }

        printf("\n");

    }



    return 0;

}

 */



当然,写完这个程序,我们是不是可以加深一下,如果菱形的最长边是由我们人工输入的,那么我们对于这个不确定的值,应该怎么处理呢?





//还是菱形问题,这次的问题是,输入一个数值n,n代表菱形的最长的一边在第n行出现。(这个题目主要是找到三个变量:i(行数),j(空格),k(星号),然后把三个量关联到输入的n上,就ok了)



// 请输入一个数字,他代表了菱形的最长边在第几行:



/*//program 5.10

#include "stdio.h"

int main()

{

    int i,j,k,n;

    printf("请输入一个数字,他代表了菱形的最长边在第几行:\n");

    scanf("%d",&n);

    for(i=1;i<=n;i++) //i是代表了当前所在行

    {

        for(j=n-i;j>=1;j--)//j控制的是空格的输出,记住,要和n、j分别建立关系

        {

            printf(" ");

        }

        for (k=1; k<=2*i-1; k++) {//i控制的是 * 的输出

            printf("*");

        }

        printf("\n");

    }

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

        for (j=n-i; j>=1; j--) {

            printf(" ");

        }

        for(k=2*i-1;k>=1;k--)

        {

            printf("*");

        }

        printf("\n");

    }

    return 0;

}

*/



其实还是很简单,读者应该对这个程序牢记于心了,这个程序不管怎么变化,应该都会解答了。



再看这样一个问题,这个问题也是大家肯定会再学习中遇到的一个:



//甲、乙两个球队,甲有 A、B、C 三人,乙有 X、Y、Z 三人,A不和X比,C不和X、Z比,请找出三对对手的名单。

//其实解题关键在于怎么去设这相当于6个变量,怎么循环?怎么把条件用上。这都是重点



/*//program 5.11

#include "stdio.h"

int main()

{

    int a,b,c;//这里的小写的a、b、c,其实就是指代X、Y、Z。

    for(a='X';a<='Z';a++) //三个变量全部遍历,寻找所有情况

        for(b='X';b<='Z';b++)

            for(c='X';c<='Z';c++)

                if(a!=b&&a!=c&&b!=c)  //首先,情况只有一种,没有一个人和两个人打的,所以要保证三者不同。

                    if(a!='X'&&(c!='X'&&c!='Z')) //这里就是题目中的条件,a!='X',正好说明了,a是代替的球员X,球员A不和球员X比,所以变量a肯定不能指代球员X。因为最后输出球员A是和变量a指代的球员比赛。

                        printf("A vs %c\nB vs %c\nC vs %c",a,b,c);

    return 0;

}

 */



今天的学习到此结束了,今天我们大量反复的使用了循环语句,判定语句,希望今天的学习能让读者熟练掌握这些语句的使用。

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

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

  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 4)

    12天学好C语言--记录我的C语言学习之路 Day 4: 首先来看一段程序: //输出下面4*5的矩阵 /* 1  2  3   4   5 2  4  6   8   10 3  6  9   12 ...

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

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

随机推荐

  1. Remastersys打包你自己的ubuntu成iso文件,保存原来的所有配置

    你是不是辛辛苦苦地配好了ubuntu结果不久又重装,然后又重新配置很久呢? 笔者好不容易配置好了torch,但是换硬盘,于是就想到了将ubuntu打包成iso文件,下次直接安装,然后配置好的东西都搬过 ...

  2. 【Stage3D学习笔记续】山寨Starling(十):高效游戏设计、纹理集和ATF

    我发布了经过批处理优化的v0.3版,点击下载:https://github.com/hammerc/hammerc-study-Stage3D/archive/v0.3.zip 先看看我们批处理优化后 ...

  3. 【斐波那契DP】HDU 4639——HeHe

    题目:点击打开链接 多校练习赛4的简单题,但是比赛的时候想到了推导公式f(n)=f(n-1)+f(n-2)(就是斐波那契数列),最后却没做出来. 首先手写一下he(不是hehe)连续时的规律.0-1 ...

  4. uva 11246 - K-Multiple Free set(数论)

    题目链接:uva 11246 - K-Multiple Free set 题目大意:给定n,k.求一个元素不大于n的子集,要求该子集的元素尽量多,而且不含两个数满足a∗k=b. 解题思路:容斥原理.f ...

  5. javafx for android or ios ?

    javafx是否支持android 或者 ios这是一个令人感兴趣的话题.google一番,发现有可行方案: 1. javafx on android: 两种方案:(事实上差点儿相同) 1.有位大神已 ...

  6. Mac OS X 10.10优胜美地怎样完美接管iphone上的电话和短信

    自从今年苹果第一次的公布会上毛猫就特别注意这个功能.感觉特别Cool,特别方便.但直到今天毛猫才第一次成功測试出这个功能呀.尽管handoff功能还未測出来,可是认为在mac上发短信和打电话也已经足够 ...

  7. CircularProgressBar

    https://github.com/semicoder/CircularProgressBar https://github.com/amurani/MeterView

  8. as3调用外部swf里的类的方法

    as3项目要调用外部swf里的类有3种方法: 1.将外部的swf发布为swc,使用时将swc引用添加到相应的项目中,这应该是最简单的一种引用.不过当项目中的类或组件比较多时就会使项目发布生成的swf文 ...

  9. 【转】cocos2d-x 2.0版本 自适应屏幕分辨率

    http://codingnow.cn/cocos2d-x/975.html 我使用的版本是cocos2d-2.0-x-2.0.4,cocos2dx-2.0版本对多分辨率适配提供了很好的支持,使用起来 ...

  10. Android_AsyncTask_DownloadImg_progressDIalog

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools=&q ...