首页 > 代码库 > C语言学习日记 week1

C语言学习日记 week1

  作为一名业外人士,时光辗转已经从学校毕业两年半了,经历了工作、考研(失败)、再找工作最终决定向一名程序员发展。虽说最近人工智能传的沸沸扬扬,未来要取代各种基础工作岗位(当然也包括程序员),但是我认为只要比机器人学的更深入就行了,如果学的不如机器人那做什么行业又不是一样是被取代呢?当然也是有很多行业职能是人工智能暂时难以触及的,不过很多对于我来说并不是很感冒,至少现在是的。

  虽然报名学的Java,但是还未正式上课,老师先普及了一下C语言,为期两周,第一周已经结束了,同样也是在老师的建议下开通了这样的博客来记录学习过程。好处自然是很多的,只是对于一向不爱做笔记的我来说有点不舒服。不过该做的还是要做,不管是为巩固也好,完成任务也罢,如果认认真真记录每日所得总归是大有益处的,只是费些时罢了。

  言归正传,已经学习C语言5天了,博客开的有些迟,就把这5天的重要内容回顾一下总结为一篇把:

  首先作为一段程序的开始

    #include <stdio.h>用来一用C语言的标准输入输出库;

    void main(){}代表主程序,里面的程序作为主程序被编译,一般在所有的函数中()中的内容代表函数条件、       {}中写入函数执行的程序,每一句可执行的程序都必须以;作为结束(程序中的所有符号均为半角),void代表函数无       返回值,也可以写成 int main(void){程序+return 0;},代表返回值为零;

    程序中可加入  //+注释内容  代表单行的注释 用以说明当前程序含义;

    或者用/* 注释内容 */ 来进行多行注释,/* 代表注释开始,*/代表注释结束,注释的内容是不会被编译执行的;  

  

  这一周主要学习的几个函数:

  1.printf("");  

    用来打印出""内的字符串,其中可以用%d,%f,%ld,%lf,%c等来代表不同类型的占位符,用来引用程序中的数据变      量,在""后面加上,进行依次分别引用。例:

    #include <stdio.h>

    void main()

    {

      int num=1;                    //int(整形)、float(浮点)、char(单字符) 指定义相应类型的变量

                   //不同类型变量分配的内存大小不同,而相应的所能代表的取值范围也不同

                   //num代表被声明变量名称 变量名称只能由字母(区分大小写)、数字、_、来组成且不能以数字开头  不能与关键字相同

                   //=为赋值符号,将=后的数值赋值给=前的变量

      float numf=1.1;

      char character=‘a’;

      printf("输出%d/t%f/t%c/n",num,numf,character);

    }

  本段程序就是打印出  1  1.1

             a

  其中/t和/n分别代表制表位和换行

  

  2.scanf("",&); 

    用来获取输入的数据;例:

    #include <stdio.h> 

    void main()

    {

      int num;         //变量num被赋值之后会根据赋值的类型在内存中分配一定的地址

      prinf("请输入您需要给num的赋值:\n");

      scanf("%d",&num);  //%d 依旧是代表int类型的占位符,&代表取址符,&num就代表将前面输入的数据存入num被分配的地址中

                  //相当于num=输入的内容

      printf("您输入的%d已经赋值给num\n",num);   //程序会根据上下顺序一一执行

    }

    此段程序就是将输入值赋给变量num,然后打印;

  

  3.if(){}  else{} else if(){}

    if(){}用于条件判断,()中的内容为条件为布尔类型,ture or false,如果为条件为真则执行{}中的语句,如果条件为假则不会执       行{}中的语句; else if(){}与if()       {}连接使用,其()中的条件应与if()中的条件相;    else{}表示如果前面的 if()和else if()条件均不满足则执行其下{}中的语句

    {}可以省略而在满足()内条件的情况下执行if()或者else if()或者else()下面的一个语句;

    其中if(){}可以单独使用,而else if{}和else{}只能与其上的if(){}成对使用;

    例:

    #include <stdio.h>
    void main() //一段根据输入的年,月,日来计算该天是当年第几天的程序     {       int year,month,day,feb,count; //feb代表二月份天数,count代表当年的第几天       
      printf("请输入年份:\n");       scanf("%d",&year);       printf("请输入月份:\n");       scanf("%d",&month);       printf("请输入日期:\n");       scanf("%d",&day);       if((year%4==0&&year%100!=0)||(year%400==0)){  //()内的条件用于判断当前年份是否为闰年         //条件中%运算符代表求余,同样的运算符有+,-,*,/等, 若/的左右两侧均为int(short、long)型即整形则预算结果会自动取整
        //条件中的==以及未出现的<,<=,>,>=为比较运算符用于比较符号两边的值 比较结果为ture/false
        //条件中的!=,||,&&为逻辑运算符分别代表非,或,与 用于判断多个条件的ture/false

        feb=29;                  //若条件为真则执行本行 否则执行else下面语句
      }else{
        feb=28;       }       //根据输入的不同月份计算count值 从而得到结果       if(month==1){         count=day;       }else if(month==2){         count=day+31;       }else if(month==3){         count=day+31+feb;       }else if(month==4){         count=day+31+feb+31;       }else if(month==5){         count=day+31+feb+31+30;       }else if(month==6){         count=day+31+feb+31+30+31;       }else if(month==7){         count=day+31+feb+31+30+31+30;       }else if(month==8){         count=day+31+feb+31+30+31+30+31;       }else if(month==9){         count=day+31+feb+31+30+31+30+31+31;       }else if(month==10{         count=day+31+feb+31+30+31+30+31+31+30;       }else if(month==11{         count=day+31+feb+31+30+31+30+31+31+30+31;       }else if(month==12{         count=day+31+feb+31+30+31+30+31+31+30+31+30;       }
      //输出结果       printf("%d年%d月%d日是%d年中的第%d天\n",year,month,day,year,count);     }

 

  4.switch(表达式){case  值1:  case 值2: ... default :}  

    类似于if...else  switch也是条件结构,不同的是switch其下{}中的 case 值  与()中的表达式相比较,如果相同则执行case 值:下的语句,否则执行default下语句;case后面所跟必须是一个特定的值;不同于if....else if语法,从表达式值等于某个case语句后的值开始,它下方的所有语句都会一直运行,并忽略其他case,直到遇到一个break为止,
假如任何一个case语句的值都不等于表达式的值,就运行可选标签default之下的语句;

    例:

    用switch结构写一段与上面相同的程序

    

#include <stdio.h>
void main()
{
        int year,month,day,feb,count=0;
        
        printf("请输入年份:\n");
        scanf("%d",&year);
        printf("请输入月份:\n");
        scanf("%d",&month);
        printf("请输入日期:\n");
        scanf("%d",&day);
 
        if((year%4==0&&year%100!=0)||(year%400==0)){
                feb=29;
        }else{
                feb=28;
        }

        switch(month)
        {
            case 12:
                count+=30;//这里的+=是运算符相当于count=count+30
                                   //类似的还有-=,/=,*=用法一样
                                   //还有一种++,--代表自+1或者自-1
            case 11:
                count+=31;
            case 10:
                count+=30;
            case 9:
                count+=31;
            case 8:
                count+=31;   //其间如果出现break;则会跳过后面的case和default
            case 7:
                count+=30;
            case 6:
                count+=31;
            case 5:
                count+=30;
            case 4:
                count+=31;
            case 3:
                count+=feb;
            case 2:
                count+=31;            
            case 1:
                count+=day;
        }
        printf("%d年%d月%d日是%d年的第%d天\n",year,month,day,year,count);
}               

 

  5.while(){}  do{}while(); 

    while是一种循环语法,()中的内容为循环执行的条件,如果()中条件为ture则执行{}中的程序,否则停止执行;

    do..while不同与while,会先执行do{}内的程序后再进入while()中条件进行判断,如果ture则继续执行do{}中的程序,其中while作为一条单独的语句需要以;结尾;

    例:

    

#include <stdio.h>
void main()
{
//打印100~1000之间所有的水仙花数,并统计其个数
    int i=100;//循环变量
    int count=0,ge,shi,bai,sum;
    
    do{
        ge=i%10;//获取个位
    shi=i/10%10;//获取十位
    bai=i/100; //获取百位
    sum=ge*ge*ge+shi*shi*shi+bai*bai*bai;
    if(sum==i){      //用于判定进入循环中的i值是否为水仙花数
                                //while,do....while,if等语句中都可以彼此嵌入
            printf("%d\t",i);
       count++;    //用于计数
    } 
      i++;  //每次循环的间隔,i++代表每次循环后i的值+1
    }while(i<1000); //()中为循环条件如果满足会一直执行do{}中程序
     printf("\n100~1000之间共有%d个水仙花数",count);
}            

  循环嵌套的用法示例:

#include <stdio.h>
void main()
{
//打印正的等腰三角形
//   *
//  ***
// *****
//*******
    int i=0,j,k;
    
    while(i<4){              //外层循环控制行数 
        j=0,k=0;
    while(j<3-i){        //找到变量与需要循环次数的关系
        printf(" ");        //利用空格定位
        j++;
     } 
    while(k<2*i+1){  //打印每一行星号
        printf("*");
        k++;
     } 
     printf("\n");          //每一行的循环结束后换行 
    i++;
    }
}                            

 

  6.for(;;){}  

    for循环效果类似与while循环;都是在()中条件满足的情况下执行{}中的程序

    在for循环中;是不能或缺的,表达式1,表达式2,表达式3都可以省略;

    for(表达式1 ;表达式2 ;表达式3 ){//循环体;}

    执行顺序: 初始化循环变量即表达式1;循环条件判断即表达式2;执行循环体即{}内语句;更改循坏变量即表达式      3;其中表达式1初始化循环变量,只执行1次;

    例1:

#include <stdio.h> 
void main()
{
/**************************************************** 
*************zhaoyi 2017.3.18 test2************ 
******根据用户输入的数据输出合适数量大小整齐排列的菱形 
***************************************************/
    //size代表菱形大小,row输出行数,colum输出列数,xyij内外循环变量
    int size,row,column,x,y,i,j;
    
    //获取用户输入信息 
    printf("请输入你要显示菱形的对角线长:\n"); 
    scanf("%d",&size);
    printf("请输入你要显示菱形的行数:\n"); 
    scanf("%d",&row);
    printf("请输入你要显示菱形的列数:\n"); 
    scanf("%d",&column);
    printf("\n");
    
    for(x=0;x<column;x++){                      //循环行数 
        for(i=0;i<size/2+1;i++){                
            for(y=0;y<row;y++){                    //循环菱形的列数 
                for(j=0;j+i<size/2;j++){        //单个菱形的上半部分 
                    printf(" ");
                }
                for(j=0;j<2*i+1;j++){               
                    printf("*");
                }
                for(j=0;j+i<size/2;j++){
                    printf(" ");
                }                                 
            }    
            printf("\n");
        }
        for(i--;i>0;i--){                        
            for(y=0;y<row;y++){                    //循环菱形的列数 
                for(j=0;j+i<size/2+1;j++){        //单个菱形下半部分 
                    printf(" ");
                }
                for(j=0;j<2*i-1;j++){
                    printf("*");
                }
                for(j=0;j+i<size/2+1;j++){
                    printf(" ");
                }
            }        
            printf("\n");
        }     
    }
    printf("\n");    
} 

    另外循环中可以插入break和contine关键字

    break:跳出循环

    continue: 跳过本次循环,继续下一次循环

    例2:

#include <stdio.h>
void main()
{
/**********************************************
****打印0,1,2,3,4可以组成的数字各不相同的三位数 
**********************************************/
    int num,ge_5,shi_5,bai_5,count=0;
    
    for(num=25;num<125;num++){
        ge_5=num%5;             //将十进制数转化为三位数的5进制(25~125对应100~1000) 
        shi_5=num/5%5;            //并分别提取各位的数字 
        bai_5=num/5/5%5;
        if(ge_5==shi_5||ge_5==bai_5||shi_5==bai_5){  //判定如果每位数字都不相同就跳过该循环 
            continue;
        }
        printf("%d%d%d\t",bai_5,shi_5,ge_5);         //输出得到的五进制数字 
        count++;                                         //循环计次 
    } 
    printf("\n\n0,1,2,3,4可以组成的数字各不相同的三位数有%d个\n",count);
}

  

  写了这么多依然没有将这周老师所教授的全部总结到位,只是通过这一周学习的几个函数穿插几个典型的案例来阐述总结,不免疏漏、不到位或是出错的地方,最后两个案例是老师布置的周末作业,老师还未点评,不一定是最佳写法,不过我还是挺满意的。  

至此结束本周的回顾。

  ps:刚开始没发现注意到插入代码的功能懒得再改了,后续的再完善把~

C语言学习日记 week1