zoukankan      html  css  js  c++  java
  • C基础入门(想到哪敲到哪的,可能不全,有漏洞)

                                             C基础入门

     第一天(数据类型与运算符):

            (1)对基本数据类型的了解:

                在32 位的系统上short 咔出来的内存大小是2 个byte;

                int 咔出来的内存大小是4 个byte;

                long 咔出来的内存大小是4 个byte;

                float 咔出来的内存大小是4 个byte;

                double 咔出来的内存大小是8 个byte;

                char 咔出来的内存大小是1 个byte。

               大致知道他们的取值范围,因为在赋值时会出现溢出现象;

             (2)对操作符的了解(只举经常用到的):

                   +,-,*,/  不解释;

                   %(重点)用于求余;(给我写一个水仙花数来练练这个求余(搜搜什么是水仙花数))

                {

                   int i=15;

                    int j;

                    j=15%10;

                    //此时j为5

                 }

      

                 

                   = 赋值运算符(不是等号)

                   == 这个是等号

                   !=这是不等号

                   >=,<=不解释

                   ++,--运算符(重点)

                  把这个运算恨敲几遍,搞懂,至少3遍;

                   {

                     int i=0;

                     int sum;

                      sum=i++;

                      //此时运算顺序是先把i赋值给sum,然后i+1;

                      sum=++i;//此时的运算顺序是i+1后再赋值给sum;

                    }

                 ||,&&这两个了解下,前一个是或逻辑,后一个是与逻辑,

                  {

                      int i=2,j=5;

                     (i>0||j>10)//此时是true;

                     (i>0&&j>10)//此时是false

                   

                   }

                 -=,*=,/=,+/这些玩意纯属造出来扯淡,不直观

                 sum-=i相当与sum=sum-i;//其他的一样,不解释;

                &取地址运算符,先了解下,后面会说;

                a?b:c这个最牛*了,太喜欢了,判断a,如果a为true,则取b,反之取c;

                   {

                      int i=0,j=2;

                      int result;

                       result=(i<j)?j:i;//判断i是否小于j,如果是就把j赋值给result,反之就把i赋值给result;

                    }

              (3)对数据的隐式和显式转换(不做重点,以后遇到问题了可以加个显式转化试试);

               隐式就是系统自动给你转换了

                  {

                   float i;

                    int j;

                    (j+i)//这两个数加起来就被自动转换为float类型

                  }

                 所谓显式转化就是在一个数据前面加一个数据类型,

                    int i;

                     (float)i//此操作就把i转换为了float类型

    ...........................................................................................................

    几道题(自己写,没思路的时候去敲helloworld去,等敲的很有成就感想这个):

      做这些程序时别用调用函数,就在main里干

        1.水仙花数

        2.搞几遍--,++运算符的原理

        3.对a?b:c的理解

        4.多敲敲第(1)中的数据类型,看看怎么会溢出

    ............................................................................................................

    第二天(几种操作运算符)

             (1)for

               对于for循环,这很使用,它无处不在,可以不知道while,但必须知道for,

            主要用法就是

                 for(i;j;k)这个形式;

              {

                  for(int i=0;i<100;i++) //这个是对i进行递加

                    {

                       //dosomething

                     }

                 for(int i=100;i>0;i--)//这个是对i进行递减

                 {

                       //dosomething

                 }

                }

               

          

          

               (2)if else

             对于 if ....else主要是判断用的

                  主要形式就是

                 {

                      if(int i>0)

                       {

                         //dosomething;

                       }

                      else

                       {

                        //dosomething;

                        }

                  }

                当然形式是自己吊出来的,随便套随便改;

                     

                        {

                          if(int i>0)

                           {//dosomething;

                            }

                           else if(int i>10)

                            {//dosomething;

                             }

                           else if(int i>20)

                            {//dosomething;

                             }

                          else

                          {//dosomething;

                            }

                         }

                     在if或者else里仍可以嵌套if...esle,不解释

               (3)while

                对于while同样是带有判断的循环;

               形式就是

                {

                    while(int i>100)//直到i大于100的时候停止循环

                     {

                       //dosomething;

                      }

                 }

               

               (4)switch() {case}

                 对于switch这个是个选择判断;

                 形式就是

               {

                 switch(判断的参数)

                  {

                   case 判断参数1:

                      //dosomething;

                      break;

                    case 判断参数2:

                      //dosomething;

                      break;

                        ......

                   

                   }

                 }

                (5)do while(至于这玩意吧,造出来也可能是个费的,没咋用过,看形式很神奇,前面还带个do)

                 形式就是

                     do

                        {

                      //dosomething;

                     

                          }while(判断)

               它跟while的区别就是,它先执行一次后在判断,这个在考试中貌似经常出,平时做项目没用到过;

                 (6)break,continue

                  这两个玩意,太风骚了,都是跳出,但管的范围不一样;

              break常用在switch中,就是直接跳出,哥们我不干了,爱咋咋地,说的就是他;

              continue常用在for或while循环中,他没break有骨气,只是偶尔的罢工,然后还得回来继续干活,他只是跳出本次循环

              break在switch中的应用就不解释了,在for里看看:

             for(int=0;i<100;i++)

             {

                 if(i==10){

                 printf("%d",i);//执行到i=10的时候,因为break这货要罢工,这个循环就停了,只循环了10下就完了

                break;}

             } 

               再来看看continue

             {

                 for(int i=0;i<100;i++)

                   {

                     if(i==10)

                      {

                       continue; //在这当i=10  continue罢工了一次,后面的printf语句不执行了,但是for会从i=11继续循环

                       }

                    printf("%d",i);

                   }

             }

     ...........................................................................................................

    几道题

      1.分别用for循环,while循环,do while循环算出一个100!的结果,效果分别是1*2*3*....*100=和100*99*98...*1=  

       2.分别用switch和if else写出成绩评价,当i<60 打印不及格,i>60且i<80打印良,当i>80,打印优秀;

      3.好好敲敲第(6)中我写的break和continue的代码,好好理解理解他们的区别

    .............................................................................................................

    第三天(对函数之间的调用关系)

      函数之间传递的是值;

      对于什么是实参,什么是形参,搞不明白算了,只要知道怎么用就够了;

      第一点:

          对于一般的函数调用

              (1)无参调用(说白了就是把被调用的函数的语句掉到了主函数里,为什么这么做,主要是那样看着好看,主函数看着不至于

    那么臃肿);

      {

         void print()

            {

             printf("hello world");

             } 

        void main()

        {

        print();

        }

      } 

          (2)对于有参的一般调用

            {

              void print(int i)

             {

                printf("输出%d",i);

             }

            void  main()

             {

              int j=2;

               print(j);

             }

           

             }

          

           (3)对于有返回值的带参数的一般调用(函数定义了什么返回值,最后的return类型也必须是什么类型,这个不解释)

           {

             int sum(int i,int j)

              {

                int sum;

                  sum=i+j;

                return sum;

              }

           void main()

            {

             int n=2,m=2;

             int sum;

             sum=sum(n,m);

             printf("输出的和是%d",sum);

       

             }

            }

          上面的都是很直观的调用和很直观的参数

    第二点:讲点关于传递地址和指针的玩意

            (1)对于地址传递的调用;

            不管在C#,C,C++,Java,还是网站语言PHP,我都碰到过这样一个典型的值传递例子,考试的话不考这个就是出题人的失职:

               

          void max(int a,int b)

         {

          int tem;

          tem=a;

          a=b;

          b=tem;

         }

         void main()

          {

          int m,n;

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

          max(m,n);

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

         }

    ........................................................

    ...........................................................

          void max(int &a,int &b)

         {

          int tem;

          tem=a;

          a=b;

          b=tem;

         }

         void main()

          {

          int m,n;

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

          max(m,n);

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

         }

    运行上面的两段程序,看看运行结果,有什么区别;原因就是一个是值传递一个是地址传递

    (2)对于在参数中取值的调用函数

          {

            void outPut(int i,int j,int *sum)

            {

               sum=i+j;

            }

          void main()

          {

           int m=2,n=2,i,sum;

           outPut(m,n,&i);//因为outPut函数第三个函数是*sum,所以在调用是要用地址来填参

          sum=i;//在这里就把m+n的值给引了出来;

       

           }

           }

      (3)对于近来在数据结构中经常出现的指针参数很无奈,在这也简单的说一下

          对于指针参数其实跟一般的参数一样,只是一般的参数的数据类型都很常见,一碰到了指针这个类型有点怕;

         但对于什么参数类型只要知道一点就够了,被调用的函数的参数是什么类型,在调用是也同样用什么类型,这在学习java或者c#是经常只是给你方法让你填参一样;

         {

            struct Person

              {

                  char name[10];

                   int age;

               }

             void print(Person *person)

               {

                  person->name="wanghe";

                  person->age=20;

                 printf("%s%d",person->name,person->age);

                 }

            void main()

           {

             Person *person=(*Person)malloc(sizeof(Person));//在这里定义了一个Person指针

            print(person)//因为在print函数里就是Person指针参数,所以在这里就放入person这参数;

            

            }

          }

    ..........................................................................................................

    至于题嘛,来一个输入一个长方体的长宽高,然后算出她的体积和各面的面积吧,要求用调用函数

    .........................................................................................................

    第四天:

            对于数组的理解

        对于数组都知道是用于原始存储数据的,它的初始索引值是0;

      第一讲:一维数组:

             对于一维数组就很简单了,

           (1)定义数组:数据类型 变量名[数组大小];

             下面主要举例对数组的具体操作:

              {

                 int data[5];

                for(int i=0;i<5;i++)

                 {

                    scanf("%d",&data[i]);

                 }//再此循环中对数组进行赋值

                for(int j=0;j<5;j++)

                {

                   printf("%d",data[j]);

                 }//在此对数组进行取值

               }    

             当然也可以对其进行直接赋值

             比如:int data[5]={1,2,3,4,5};

                   char data[5]={'a','b','c','d','e'};

                   char data[6]="abcde";//在这为什么是6呢,因为在"abcde"这个字符串中,这个是字符串有串尾结束符'\0'符,这点记住就行了;

                  用sizeof("abcde")可以得出是6;

            (2)对于数组指针这个玩意,这个指针是指向数组的头元素:

               例如:

                     int data[5]={1,2,,3,4,5};

                      怎么用指针来取它的值呢

                    {

                       int *p;

                       p=data;//这一步是用于去得数组的第一个元素地址

                      for(int i=0;i<5;i++)

                     {

                       printf("%d",*(p+i));//取得地址里的值

                      }

                     }

           (3)对于数组做参数

                 数组做参数跟其他的数据类型没区别:

                  {

                     void print(int data[])

                    {

                  for(int i=0;i<5;i++)

               print("%d",data[i]);

                      }

                    void main()

                  { 

                  int data[5]={1,2,3,4,5};

                  print(data);

                  }

                   }

             对于一维数组基础的就这些吧,扩展的玩意都可以在此基础上玩

          第二讲  就是二维数组了

                还是那样,对二维数组的操作还是分为三个方面(1.具体的存入取出,2.指针对他的操作,3.怎么做参数)

                 (1)对二维数组的存入和取出

                   {

                     //定义数组

                      int  data[3][3];

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

                       {

                         for(int j=0;j<3;j++)

                           {

                              scanf("%d",&data[i][j]);//对二维数组的循环存入数据操作

                            }

                        }

                    //下面进行取出操作

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

                       {

                         for(int j=0;j<3;j++)

                           {

                              printf("%d  ",data[i][j]);//对二维数组的循环取出数据操作

                            }

                               printf("\n");//这句换是让它成二维排列

                        }

                    }

                   对于普通的赋值:

                 data[3][3]={{1,2,3},{4,5,6},{7,8,9}};

    (       2)对于数组指针这个玩意,这个指针是指向数组的第一行的第一个元素:

               例如:

                     data[3][3]={{1,2,3},{4,5,6},{7,8,9}};

                      怎么用指针来取它的值呢

                    {

                        int  data[3][3]={{1,2,3},{4,5,6},{7,8,9}};

                        int (*p)[3];//定义二维数组的指针,也叫数组指针,这里就不纠结于概念了,免得烦

                      p=data;

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

                     {

                     for(int j=0;j<3;j++)

                     {

                      cout<<*(*(p+i)+j);//这里出现了两个指针符,里面的是取行,加个列就成准确的行列

                       }

                     }

                     }

       可能现在还不好理解 ,等以后你敲的多了,会慢慢明白的

           (3)对于数组做参数

                 数组做参数跟其他的数据类型没区别:

                  {

                     void print(int data[][])

                    {

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

                    for(int j=0;j<3;j++)

               print("%d",data[i][j]);

                      }

                    void main()

                  { 

                  int  data[3][3]={{1,2,3},{4,5,6},{7,8,9}};

                  print(data);

                  }

                   }

             对于二维数组基础的就这些吧,扩展的玩意都可以在此基础上玩

             对于数组这玩意,也不要相的太复杂,它其实就是一个存入取出的工具,你越想的复杂你越搞不懂它;

     第五天:

             对于结构体的理解:

            其实结构体就是让你自己定义数据类型的,不是什么新鲜玩意,以前的像int  float什么的是系统给你的,现在给你自由了,让你自己来玩,应该是好事,其实在往深处玩代码时,你会发现往往系统给你的东西你总是不满意,老想玩自己写的。而结构体就是C给你的想象体,也学是C太古老了吧,我没在他里面发现class这个玩意,这里就不详细说class了,有兴趣自己可以查查,比struct好用多了。

      废话少说,开始玩代码:

             对于结构体的定义就是:

               C的标准:

               typedef struct {

                   数据类型 变量名;

                   数据类型 变量名;

                   数据类型 变量名;

                   数据类型 变量名;

                         .

                         .

                         .

                  

                    }结构名;//最后的这个“;”符号不能掉;

               C++就自由多了:

             struct 结构名{

                  数据类型 变量名;

                   数据类型 变量名;

                   数据类型 变量名;

                   数据类型 变量名;

                         .

                         .

                         .

                  

                    };

    对于结构体到底占多少了字节,那就是它里面定义的所以数据类型占的字节数总和;

     对于结构体的用法,应该都不陌生:

         {

            typedef struct

              {

                 char name[10];

                 int age;

              }Person;

         void main()

        {

            Person person;

             scanf("%s%d",&person.name,&person.age);

             printf("%s%d",person.name,person.age);

             Person *p;

              p=&person;//去person的地址

              printf("%s%d",p->name,p->age);

         }

           }

     当然也可以对结构体进行嵌套:

        typedef struct

        {

          char name[10];//姓名

          int age;//年龄

         }Person;

        typedef struct

         {

           Person person;//嵌套个结构体person;

           int num;//学号

          }PersonMsg;

    void main()

     {

       PersonMsg personmsg;

       //怎么对它进行赋值,看好了

        personMsg.person.name="wanghe";

        personMsg.person.age=20;

        personMsg.num=123456;

    //当然取值是也是一样

      }

      关于指针对他的操作就还是上面的玩意,没新意;

    结构体很简单,不要想复杂,就这几个操作;

    第六天 指针(其实也不能算是一个很多的题目)

          对于指针这玩意,也就在C或C++里看到,在C#,java,或者别的玩意里我都没见到,也确实没有,因为这玩意太危险,所以后来发展的高级语言都摒弃了,指针就想是一把枪,本来是要崩别人的,但是指向这个,再指指那个,最后拿枪的自己给自己给崩了,因为他也不知道到底指向了谁;

         (1)指向普通类型;

             比如 int ,float等;

              int i;

            int *j;

            j=&i;//在这里把指针指向了i的地址,这个地址名字叫j;

            *j=2;//为指向的地址的变量赋值

          (2)指向数组;这个在讲数组时说过了;

           (3)指向结构体,这个也讲过了;

       下面讲讲,指针在函数调用是的主要作用:

         由于指针是指向一个变量的地址,所以就确定了位置,不会变,能够确定操作的准确性,主要原因还是双向传递,互通的,而不是单单的单向值传递:

                 对于在函数调用那节的那个例子就很经典:

        {

          void max(int a,int b)

         {

          int tem;

          tem=a;

          a=b;

          b=tem;

         }

         void main()

          {

          int m,n;

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

          max(m,n);

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

         }

    运行结果:

      2 3

     输出 2 3

    ........................................................

    ...........................................................

          void max(int &a,int &b)

         {

          int tem;

          tem=a;

          a=b;

          b=tem;

         }

         void main()

          {

          int m,n;

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

          max(m,n);

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

         }

    运行结果:

      2 3

     输出 3 2

    第一个就是单单的值传递,在mian函数里调用max函数,只是把m,n穿到了max里,但肉包子打狗,max也确实完成了任务但就是穿不过来

    第二个就不一样了,进行的是地址传递,在m,n传给max函数是,同时max还取得了m,n的地址,max在地址里把事就干了,完成了互通;

       对于在数据结构中出现的返回类型为指针类型的,说白了跟返回int类型一样:

    举个例子

     {

       typedef struct

       {

        int num;

         int age;

        }Person;

      *Person getPerson()

      {

         Person *p;//在这里p是个指针吧,等会就把它给返回了;

         Person person;

       p=&person;

        p->num=12;

         p->age=12;

       return p;

       }

    void main()

    {

     Person *p;

      p=getPerson();

      //这时得到的p->num就是12,p->age也是12;

    }

      }

    指针也不会玩太难的,就是这些基础;

    关于C的基础就这写吧,可能还有些琐碎的东西没点到,在学习的时候做参考吧,还是那句话,玩代码玩的就是熟练,多敲,如果只是为了考个试,少敲也无可厚非;  

  • 相关阅读:
    Codeforces 845E Fire in the City 线段树
    Codeforces 542D Superhero's Job dp (看题解)
    Codeforces 797F Mice and Holes dp
    Codeforces 408D Parcels dp (看题解)
    Codeforces 464D World of Darkraft
    Codeforces 215E Periodical Numbers 容斥原理
    Codeforces 285E Positions in Permutations dp + 容斥原理
    Codeforces 875E Delivery Club dp
    Codeforces 888F Connecting Vertices 区间dp (看题解)
    Codeforces 946F Fibonacci String Subsequences dp (看题解)
  • 原文地址:https://www.cnblogs.com/wangheblog/p/2765156.html
Copyright © 2011-2022 走看看