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



Day 3:



不知不觉到了第三天的学习,我们前两天学习的东西很杂乱,各个方面都有学习。我觉得这不是不系统,也不是学的不扎实,这种学习对于初学者而言我认为是很好的。我们不要循规蹈矩的一点一点按照教科书上的编排去学习,因为那样太慢了,人家的编排是72学时,48学时来的。你没有那么多时间,想要在15天认识C语言,自然需要一些“剑走偏锋”。我们虽然杂乱无章,但是记住,在看这15天的记录的时候,一定要多查资料,将这些没有规律的程序在自己的大脑中变的很有章法,让自己的脑子不乱,这就可以了!



 /*//program 3.1

 //输入三个数字,比较大小

 #include<stdio.h>

 int main()

 {

     int a,b,c,t;

     scanf("%d%d%d",&a,&b,&c);

     if(a<b)

     {

        t=a;

        a=b;

        b=t;     

     }

     if(a<c)

     {

        t=a;

        a=c;

        c=t;     

     }

     if(b<c)

     {

         t=b;

         b=c;

         c=t;

     }

     printf("max is %d\nmid is %d\nmin is %d",a,b,c);

     return 0;

 }

 */



在 program 3.1 中我们对三个数字进行大小的比较,相比于2个数字比较大小,多了一个数字,但显然一个数字的增加却增加了如此多的代码。大量运用if语句判断,试用于初学者,但是还是比较复杂的,今后我会对多个数字间比较大小做更为深入的讲解。



下面给大家来介绍一个复杂一点的式子——条件表达式。(program 3.2)



//条件表达式的应用(问号是条件运算符)。    (a>b)?a:b; 这条语句相当于是一个不带if的if语句,和if语句很相似

//其原理是如果括号里面的条件为真,则执行a,否则执行b;



/*//program 3.2

#include<stdio.h>

int main()

{

    int ch=12,c,d;

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

    scanf("%d%d",&c,&d); //scanf格式里面不要加\n,会出错的!!!!!两个值一起输入的话可以在格式中间加空格,但一个值的话可能会出错

    ch=(c+d>10)?(ch):(ch+10);

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

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

    int a;

    int b=1;

    scanf("%d",&a);

    b=(a==0)?(b+4):(b+6); //前面的判断是a==0,而不是a=0,要记住,a=0是赋值语句,无任何判断的必要!!!!!

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

    return 0;

}

*/



下面我们看一下switch语句(program 3.3)



//学习用switch语句,输入等级,输出成绩区间。

/*//program 3.3

#include<stdio.h>

int main()

{

    char ch;

    scanf("%c",&ch);

    switch (ch) { //switch后面的表达式应该是int类型(包括char型,因为可以隐式转化)

        case'A': //case后面每一个常量(常量表达式)都不相同

            printf("85~100\n");

            break;

        case 'B':

            printf("70~84\n");

            break;

        default://可以把default提前,因为他也是一种情况。只不过除最后一个情况外,其余的情况都要加break,若不加,会继续向下输出,造成结果判断错误

            printf("输入有误!");

            break;

        case 'D':

            printf("<60\n");

            break;

        case 'C':

            printf("60~69\n");

            break;

            

    }

    return 0;

}

*/



当然switch语句也有这样的用法(program 3.4)



/*//program 3.4

//输入A或者a,就会进行第一个操作action1,输入B或者b,就会进行第二个操作action2,用switch语句实现

#include<stdio.h>

int main()

{

    char ch;

    int a=1,b=2;

    int action1(int a,int b);

    void action2(int a,int c);

    printf("请输入a或者b:\n");

    scanf("%c",&ch);

    switch(ch){

        case 'a'://可以两个选项(条件)输出同一个值,但是要每一个case后面都跟冒号

        case 'A':action1(a,b);

            break;

        case 'b':

        case 'B':action2(a,b);

            break;

        default:

            printf("输入有误!\n");

    }

}

int action1(int x,int y)  //调用的两个方法定义成什么型的都不要紧,一般定义成无返回值的(void),这样直接输出想要的东西,比较简便。但是定义成int什么的也可以,只是要返回值,比如说下面两个方法分别用不同的类型去定义了

{

    printf("%d\n",x+y);

    return 0;

}

void action2(int x,int y)

{

    printf("%d\n",x-y);

}

*/



写了几个程序,我们来学习一下一些基本的知识。这些知识再编程的时候很重要。



算术运算:指的是运算中有能够完成算数功能运算的运算符;

关系运算:判断两个数的大小关系;

逻辑运算:逻辑运算的表达式是bool类型的,是明确条件与结论的一种关系,真、假。



/*

 C语言的运算符可分为以下几类:

 1.        算术运算符:用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)、自减(--)共七种。

 2.        关系运算符:用于比较运算。包括大于(>)、小于(<)、等于(= =)、大于等于(>=)、小于等于(<=)和不等于(!=)六种。

 3.        逻辑运算符:用于逻辑运算。包括与(&&)、或(||)、非(!)三种。

 4.        位操作运算符:参与运算的量,按二进制位进行运算。包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)六种。

 5.        赋值运算符:用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,^=,>>=,<<=)三类共十一种。

 6.        条件运算符:这是一个三目运算符,用于条件求值(?:)。

 7.        逗号运算符:用于把若干表达式组合成一个表达式(,)。

 8.        指针运算符:用于取内容(*)和取地址(&)二种运算。

 9.        求字节数运算符:用于计算数据类型所占的字节数(sizeof)。

 10.       特殊运算符:有括号(),下标[],成员(→,.)等几种。

 */







//写出下列逻辑表达式的值

//要先清楚优先级。从高到低:圆括号,算术运算符,关系运算符,逻辑运算符(但是其中 !运算符要更优先,但在圆括号之后)

//逻辑运算符中:! > & > ||

    

在做了简单的了解后,我们来看一下下面这个程序(program 3.5)



/*//program 3.5

 #include<stdio.h>

 int main()

 {

 int a=1,b=2,c=3,x,y;

 printf("%d\n",a+b>c&&b==c);

 printf("%d\n",a||b+c&&b-c);

 printf("%d\n",!(a>b)&&!c||1);

 printf("%d\n",!(x=a)&&(y==b)&&0);

 printf("%d\n",!(a+b)+c-1&&b+c/2);

 return 0;

 }

 */



program 3.5  列举了多个运算符,读者自行验证他们的值,进而熟悉这些运算符的先后执行顺序。但是最好是再一些繁琐的运算符中增加圆括号进行辨识,这样增加程序的可读性。



下面对if语句做一些说明:(if语句的具体怎么使用大家百度即可)



/*//program 3.6

#include<stdio.h> //if语句应遵循就近原则!!!!!!下面的程序两个if,但是else是匹配的第二个if,x=0没有匹配项,输出原来定义的值,如果y没有定义,那么就输出乱码。

int main()

{

    int x,y;

    printf("enter x:\n");

    scanf("%d",&x);

    y=-1;

    if(x!=0)

       if(x>0)

           y=1;

    else

        y=0;

    printf("x=%d,y=%d\n",x,y);

    return 0;

}

 */



下面是对if语句一个经典的使用案例(program 3.7)



//键盘输入一个<=5位数的数字,求出他是几位数,分别输出每一位数字,再按照逆序输出各位数字。



/*//program 3.7

#include<stdio.h>

int main()

{

    int n;

    printf("请输入一个数字,不超过五位数即可\n");

    scanf("%d",&n);

    int w,q,b,s,g;

    w=n/10000; //用先取余,再整除取整的方法。可以准确快速的找到每一位数字,第一个万位,因为我们一开始定义的最高是万位,所以求万位的时候就直接取整就行了。

    q=n%10000/1000;

    b=n%1000/100;

    s=n%100/10;

    g=n%10;

    if(w>0)   //if语句是整套的,下面的必须加else,否则会输出许多句话。

    {

        printf("这是一个5位数\n它的各位数字分别为:\n万位数字:%d 千位数字:%d 百位数字:%d 十位数字:%d 个位数字:%d\n逆序输出这个数字:%d%d%d%d%d",w,q,b,s,g,g,s,b,q,w);

    }

    else if(q>0)  //用各位数字是否大于零来判断n到底是几位数,如果判断出来是几位数,那么接下来就简单了

    {

        printf("这是一个4位数\n它的各位数字分别为:千位数字:%d 百位数字:%d 十位数字:%d 个位数字:%d\n逆序输出这个数字:%d%d%d%d",q,b,s,g,g,s,b,q);

    }

    else  if(b>0)

    {

        printf("这是一个3位数\n它的各位数字分别为:百位数字:%d 十位数字:%d 个位数字:%d\n逆序输出这个数字:%d%d%d",b,s,g,g,s,b);

    }

    else if(s>0)

    {

        printf("这是一个2位数\n它的各位数字分别为:十位数字:%d 个位数字:%d\n逆序输出这个数字:%d%d",s,g,g,s);

    }

    else

    {

        printf("这是一个1位数\n它的各位数字分别为:个位数字:%d\n逆序输出这个数字:%d",g,g);

    }

    return 0;

}

*/



我们以一个例子 求1+2+3+…+100之和 来对while和do while语句做说明



/*//program 3.8

 #include<stdio.h>

int main()

{

    int i=2,sum=1;

    while (i<=100) {

        sum=sum+i;

        i=i+1;

    }

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

    return 0;

}

*/



/*//program 3.9

//用do...while...语句来求1+2+3+。。。+100

#include<stdio.h>

int main()

{

    int sum=1,i=2;

    do

    {

        sum=sum+i;

        i++;

    }

    while(i<=100);

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

    return 0;

}

*/



具体的while,do while语句由读者去自学,看个一两分钟基本掌握,在此不说说明。



然后我们在对for语句的一些情况做探讨:(什么是for语句,还是得由大家自行学习)



/*//program 3.10

#include <stdio.h>

int main()

{

    char ch;

    for(;(ch=getchar())!='\n';) //没有for循环的初始值,也没有循环变量增值,只有循环条件,这个程序就是执行从键盘输入一个字符ch,然后立即输出,遇到换行的时候结束。

    {

        printf("%c\n",ch);

    }

    return 0;

}

*/



/*//program 3.11

#include "stdio.h"

int main()

{

    int i,sum;

    for(i=1;;i++)   // 这个式子会无限制的执行下去,因为没有循环条件,此时认为表达式2(循环条件)始终为真

    {

        sum+=i;

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

    }

    return 0;

}

*/



/*//program 3.12

#include <stdio.h>

int main()

{

    int i,sum;

    for(i=1;i<=100;i++,i++) //这里的i++,i++; 可以换成i=i+2; 其表示的含义完全一样

    {

        sum+=i;

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

    }

    return 0;

}

*/



对for循环的一个应用(program 3.13)



//手动输入捐款数额,当捐款达到10W的时候,捐款停止。捐款人次最多1000人。

/*//program 3.13

#include <stdio.h>

int main()

{

    int total,i,a;

    for (i=1,total=0;i<=1000;i++) {

        printf("请捐款\n");

        scanf("%d",&a);

        total+=a;

        if(total>=100000)

            break;  //break的作用是跳出循环(整个循环),接着执行循环体下面的语句,注意的是,break语句只能用于循环语句和switch语句之中,而不能单独使用!!!!!!!!!

    }

    printf("捐款金额为:%d,共%d人捐款",total,i);

    return 0;

}

*/



上面我们涉及到了break语句(在循环语句和switch中用来跳出 整个 循环的语句),下面我们一定要来看看与之对应的continue语句(在循环语句和switch中用来跳出 当前 循环的语句)。



再深入解释一下:break是终止循环,不再判断执行的循环条件是否成立。而continue只结束本次循环,而不终止整个循环的执行





//要求输出100~200之间(能)被3整除的数

 /*//program 3.14

#include "stdio.h"

int main()

{

    int n;

    for (n=100;n<=200;n++) {

        if(n%3==0)

        printf("%d\n",n); //如果n能被3整除,则立即输出这个数,然后跳出本次循环(n),而执行下一个循环(n+1),并不会跳出for循环体

        continue;

    }

    return 0;

}

*/



// 要求输出100~200之间(不能)被3整除的数

/*//program 3.15

#include <stdio.h>

int main()

{

    int n;

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

    {

        if(n%3==0)

            continue; //很简单,只是把continue提前了一个位置,这样遇到能被3整除的就跳出本次循环,跳出则不执行接下来的输出语句。而没法被3整除的自然就执行下面的输出语句输出了。

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

            

    }

    return 0;

}

*/



在上面两个程序 program 3.14 和 program 3.15 中,我们巧用了continue语句,只变换位置就可以改变一个问题的问法。是不是大家体会到了C语言的魅力所在呢?上面两个程序,用我们的大脑去算,可能会耽误很长的时间。而计算机却能瞬间给我们想要得到的结果,可见计算机的强大。



第三天的学习到此结束,读者可以回顾一下学习过程中不足之处,上面的每个程序当时自学的时候至少打了3遍以上,大家一定不要懒惰,要勤奋动手练习哦!

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

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

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

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

随机推荐

  1. [iOS基础控件 - 6.4] 汽车品牌展示 Model嵌套/KVC/TableView索引

    A.需求 1.使用汽车品牌名称头字母为一个Model,汽车品牌为一个Model,头字母Model嵌套品牌Model 2.使用KVC进行Model封装赋值 3.展示头字母标题 4.展示索引(使用KVC代 ...

  2. [Objective-c 基础 - 3.2] ARC

    A.ARC的基本原理 1.ARC的判断原则:只有没有强指针指向对象,就会立即释放对象 注意,在以下情况,会立即回收内存: (1)指针超出作用域 { Person *p1 = [[Personalloc ...

  3. 关于STM32下载问题的简单理解

    首先STM32分为两种下载方式1.ISP(IN-SYSTEM-PROGRAMMING在线编程)  2.JTAG 这里简单谈谈对ISP下载的理解: ISP下载是51单片机,STM等单片机比较常见的一种下 ...

  4. 设计模式之十三:适配器模式(Adapter)

    适配器模式: 将一个类的接口转换成另外一个期望的类的接口.适配器同意接口互不兼容的类一起工作. Convert the interface of a class into another interf ...

  5. mysql replication inside

    http://keithlan.github.io/2015/07/16/mysql_replication_inside/

  6. PDF转换成二进制字符串写入 HTTP 输出流

    最近项目需要做电子签章,需要网页打开PDF签章后保存:正好复习哈二进制和流的转换: 文件转换成二进制字符串写入HTTP输出流 protected void Page_Load(object sende ...

  7. Apache配置虚拟目录,以及各种操作

    apache配置虚拟目录: 打开并创建虚拟目录的步骤如下: # Virtual hosts # Include conf/extra/httpd-vhosts.conf 去掉conf/http.con ...

  8. C#_IComparable实例 - 对象ID进行排序

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Comp ...

  9. 手动开启tomacat服务器

    四.配置Tomcat环境变量 1,新建变量名(关键,你的tomacat安装目录):CATALINA_BASE,变量值:E:\apache-tomcat-6.0.37 2,新建变量名(关键,你的toma ...

  10. Fixflow引擎解析(一)(介绍) - Fixflow开源流程引擎介绍

    Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素 Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件 Fixflow引擎解析(二)(模型) - BPMN ...