• 小C的故事(快速学C语言,,,极速版!)


               

      前几天这篇博客写了太多废话! 删啦~~。  

          本篇博客只是为chd A协的全嫩小鲜肉入门C语言的预科, 如果你在此处学习C语言, 不幸走火入魔, 小弱概不负责。       

    //请直接随便找个C语言编译器,抄一下下面的程序
    //如果不会用编译器,或根本不知什么是编译器
    //请自行默默百度, 下载, 安装,学习使用
    //如果你懒得不想去百度, 请出门遇红灯直行!
    
    #include<stdio.h>
    
    int main()
    {
        printf("What fuck are you doing?");
        return 0;
    } 

    不要问为什么, 先抄写一下, 执行一下再说。

    #include<stdio.h>// 这里指包含了一个文件,里面也是一些代码。
    //只不过这些代码几乎每个程序都要用,于是创造C语言的那帮家伙
    //替我们都写好啦, 直接用就可以啦! 
    
    int main()
    {
        printf("Talk is cheap!"); // 输出语句 
        return 0;
    } 

    下面试一些基本语法:
    然后是关键字, 简单变量类型 , 声明语句, 定义语句, 运算符号, 循环结构, 条件结构, 基本语句, 数组,字符串, 结构体,  指针 ,  函数 , 递归函数 , (生存空间与作用域 ,动态申请内存, 内存模型 )括号里面的东西现在先不要看! 。估计你们理解有困难的地方, 我已加了链接或将要加链接, 可能链接讲的有点儿深, 随便看一下就好啦。

    其实C语言真的就没多少东西可讲, 又感觉有好多东西要讲(像今天, 竟然一下就讲到了内存分配机制, 估计当时是智商挂掉了!)

    //神奇的C语言输入输出
    #include<stdio.h>
    
    int main()
    {
        double me = 2222.2222222;
        printf("%.0lf
    
    ", me);
        printf("%.2lf
    
    ", me);
        printf("%.10lf
    
    ", me);
        printf("%10.0lf
    
    ", me);
        printf("%2.2lf
    
    ", me);
        return 0;
    } 

    适当的应用 scanf 可以跳过我们不需要的字符!

    #include<stdio.h>
    
    int main()
    {
        int me, you;
        scanf("%d + %d", &me, &you);
        printf("%d + %d = %d
    ", me, you, me+you);
        return 0;
    } 
    
    //输入格式: 9 + 5 
    //输出结果: 9 + 5 = 13
     
     
    //关于字符串的输入输出
    #include<stdio.h>
    
    int main()
    {
        char str[100];
        char ch;
        scanf("%s", str);
        scanf("%c", &ch);
        if(ch=='
    ') printf("卧槽!
    ");
        printf("%s
    ", str); 
        printf("%c
    ", ch);
        return 0;
    } 
    // 输入:I love litte C.
    // 输出:I
    //         (这里输出了一个空格)
    
    
    //输入:ACMer
    //输出:卧槽!
    //      ACMer 
    //           
      
      

    是不是感觉有点怪? 这是因为 scanf("%s", str); 会在遇到空格, 制表符, 换行符时结束, 并且把空格, 制表符, 换行符留在输入队列里(也就是并没有读入str[]内)

    那么问题就来啦!

    //比较两个字母的字典序
    
    #include<stdio.h>
    
    int main()
    {
        char ch1, ch2;
        scanf("%c %c", &ch1, &ch2);
        if(ch1<ch2) printf("%c < %c
    ", ch1, ch2);
        else if(ch1 > ch2) printf("%c > %c
    ", ch1, ch2);
        else printf("%c = %c
    ", ch1, ch2);
        
        return 0;
    } 

    这个还是正常的, 但是如果再读入一次输入呢?

    //比较两个字母的字典序
    
    #include<stdio.h>
    
    int main()
    {
        char ch1, ch2;
        scanf("%c %c", &ch1, &ch2);
        if(ch1<ch2) printf("%c < %c
    ", ch1, ch2);
        else if(ch1 > ch2) printf("%c > %c
    ", ch1, ch2);
        else printf("%c = %c
    ", ch1, ch2);
        
        scanf("%c %c", &ch1, &ch2);
        if(ch1<ch2) printf("%c < %c
    ", ch1, ch2);
        else if(ch1 > ch2) printf("%c > %c
    ", ch1, ch2);
        else printf("%c = %c
    ", ch1, ch2);
        
        return 0; 
    } 
    
    //输入:a b
    //输出:a < b
    //输入:c d
    //输出: < c
    //上面出错的原因就是因为 ch1 是读取了第一次输入的换行符 
     

    在用scanf("%s", &str), scanf("%c", &ch) 一类的读入方式字符时, 如果有多组输入, 注意清理掉每行结尾的换行符。一个简单的方法就是用getchar()吸收掉换行符

    //比较两个字母的字典序
    
    #include<stdio.h>
    
    int main()
    {
        char ch1, ch2;
        scanf("%c %c", &ch1, &ch2);
        if(ch1<ch2) printf("%c < %c
    ", ch1, ch2);
        else if(ch1 > ch2) printf("%c > %c
    ", ch1, ch2);
        else printf("%c = %c
    ", ch1, ch2);
        
        getchar(); // 吸收掉换行符 
        
        scanf("%c %c", &ch1, &ch2);
        if(ch1<ch2) printf("%c < %c
    ", ch1, ch2);
        else if(ch1 > ch2) printf("%c > %c
    ", ch1, ch2);
        else printf("%c = %c
    ", ch1, ch2);
        
        return 0; 
    } 
    
    //输入:a b
    //输出:a < b
    //输入:c d
    //输出:c < d 
    //上面出错的原因就是因为 ch1 是读取了第一次输入的换行符 
     

    由于scanf("%s", &str); 不能读取字符串(含有空格, 制表符的字符串)。 读取带有空格和制表符的字符串时,可以用gets(str);gets(str)会把空格,制表符, 换行符全部读入(遇到换行符终止读入, 但是读入了换行符) 而输出字符串时可以用 printf("%s ", str), 或者 puts(str);

    这里给学弟学妹一个福利! 让小弱替你们写第一道题吧! (此题没有什么技巧性, 就是有个坑, 就是上面所说的东西!) 成功的替你们分担了一道题, 好开心!

    http://acm.hdu.edu.cn/showproblem.php?pid=2000

     1 #include <stdio.h>
     2 
     3 int main()
     4 {
     5     char a, b, c, d, e;
     6     while(scanf("%c%c%c", &a, &b, &c)!=EOF)
     7     {
     8         getchar();
     9         d = a; e = a;
    10         if(a > b) d = b;
    11         if(d > c) d = c;
    12         if(e < b) e = b;
    13         if(e < c) e = c;
    14         printf("%c %c %c
    ", d, a+b+c-d-e, e);    
    15     }
    16     return 0;
    17 }
    View Code
    #include<stdio.h>
    
    int main()
    {
        char str[105];
        char ch;
        gets(str);
        scanf("%c", &ch);
        printf("%s
    ", str);
        if(ch=='
    ') puts("so so!");
        printf("%c
    ", ch);
        return 0;
    }

    但是gets(str) 也有个很危险的地方, 就是你定义的字符串也许有 5 个字符, 但是如果你输入了6个或更多的字符, 它也是允许的,他妈的它竟然不报错! 这样就非法的占用了一部分内存, 像个定时炸弹! 弄不好程序就会出现错误!(而且这种错误在检查时很难检查)。 所以保险的做法就是 定义字符串时, 适当的定义大些。

    #include<stdio.h>
    
    int main()
    {
        char str[5];
        char ch;
        gets(str);
        puts(str); 
        return 0;
    }
    
    // 输入: 已经超过字符数组啦!
    //输出:  已经超过字符数组啦! 


    实现多组输入:

    在新手编写程序时, 只能实现一组输入输出。这是很蛋疼的事, 而且再次运行时,还需要在编译器里点击运行按钮。如果直接点击 .exe文件,会出现闪退的现象。这里就针对这两个小问题,给出解答方案!

     

    #include<stdio.h>
    
    int main()
    {
        int a, b;
        while(scanf("%d%d", &a, &b)!=EOF) // EOF是end of file 的缩写,这句话的意思是: 
        {                                 // 每次读取两个整数,一直读到文件结尾! 
            printf("%d
    ", a+b);
        }
        return 0;
    } 
    
    
    #include<stdio.h>
    
    int main()
    {
        int a, b;
        while(~scanf("%d%d", &a, &b)) // 和上面的程序意思一样  
        {                                 
            printf("%d
    ", a+b);
        }
        return 0;
    } 
    
    #include<stdio.h>// 和上面的程序效果一样  
    
    int main()
    {
        int a, b;
        while(scanf("%d%d", &a, &b)==2) // 意思是成功读取两个整数 
        {                                 
            printf("%d
    ", a+b);
        }
        return 0;
    } 


    实现 T 组输入, 这个更简单啦! 直接来个循环就行啦!

    #include<stdio.h>
    
    int main()
    {
        int T;
        scanf("%d", &T);
        while(T--)
        {
            int a, b;
            scanf("%d%d", &a, &b);
            printf("%d
    ", a+b);
        }
        return 0;
    } 

    如果想直接点击.exe 文件来运行程序时, 一般它会在输入结束后闪退,并看不到答案。 可以在程序最后加一句getchar(); 让它等待一个字符的输入, 这样它就不会闪退啦!

    如果还是闪退, 那么就可能是你最后输入的换行符,或空格 还停留在输入队列里。 那么这该怎么办呢? 加两个getcahr(); 不就行啦!~~~

    下面所有加注释的地方都可以跳过!

    /*到此, 如果你已经浏览了关于C语言的书籍(看没看懂都没关系,记住了一些基本语法就行), 并看完了上面的所有内容, 那么恭喜你,你的C语言已经入门啦。如果你想问你说什么时候能够精通 C语言, 我可以负责任的告述你,下辈子吧! C语言博大精深, 不是一两本书能够讲明白的, 更不是一两篇博客能够将清楚的。 它需要你在学习时, 不断的练习, 不断的尝试, 不断的发现! 学C语言是一辈子的事哦! 但是一般来说, 学个入门差不多就可以编写,抄写, 或阅读, 一些小程序啦。 然后在码代码时学习就行啦。 不懂的地方,可以找度娘,当然最好还是上维基百科和google好些,他们更专业化,也更全面。

               读到这里,即使你完全不曾听说过C语言, 现在也应该对C语言有了一定的了解。 然后只需要有一本C语言的书籍,自己随便翻翻,敲敲~~~。然后就入门啦! 学C语言并不难, 难的是学好C语言。 如果你不能看懂本篇博客(我就要深深的质疑你的智商问题啦!,开个玩笑)。 期待我们A协的课程吧! 到那时会有更细致的介绍~~~~。。。*/

    /*建议: 建议新学C语言的学弟学妹,想学好C语言(以及想学好任何东西), 一定要找一本权威的书,系统的学一下(最少应该浏览一下), 不要一味的追求速度! 碎片化的知识带来的一知半解,和思维定势是很危险的!!!。  */

    对于学C语言, 开始的时候不需要学的多么深,知道基本语法就行啦! 然后直接编写程序就行啦! 至于原理, 等自己学到了一定的程度会自然而然的明白的。 

     

    尾声: 本文到此结束! 欢迎大家批评指正, 你如有不满, 请递归到文章开头!小弱概不负责, 哈哈~~!

                                         Orz 。 掩面火速逃走!

    HDU 2000

    #include<stdio.h>
    int main()
    {
        char a,b,c,d,e;
    while(scanf("%c%c%c",&a,&b,&d)!=EOF)
    {
        getchar();
        if(a>b)
    {
        c=a;
        a=b;
        b=c;
    }
    if(a>d)
    {
        e=a;
        a=d;
        d=e;
    }
    if(b>d)
    {
        c=b;
        b=d;
        d=c;
    }
    
    printf("%c %c %c
    ",a,b,d);
    }
    
    return 0;
    }   
    View Code
     1 #include <stdio.h>
     2 
     3 int main()
     4 {
     5     char a, b, c, d, e;
     6     while(scanf("%c%c%c", &a, &b, &c)!=EOF)
     7     {
     8         getchar();
     9         d = a; e = a;
    10         if(a > b) d = b;
    11         if(d > c) d = c;
    12         if(e < b) e = b;
    13         if(e < c) e = c;
    14         printf("%c %c %c
    ", d, a+b+c-d-e, e);    
    15     }
    16     return 0;
    17 }
    View Code

    任选一份代码!

    HDU 2001

     1 #include<stdio.h>
     2 #include<math.h>
     3 main()
     4 {
     5     float x1,y1,x2,y2,n,t;
     6     while(scanf("%f %f %f %f",&x1,&y1,&x2,&y2)!=EOF)
     7     {
     8         t=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
     9         n=sqrt(t);
    10         printf("%.2f
    ",n);
    11     }
    12     return 0;
    13 } 
    View Code

    HDU 2002

     1 #include<stdio.h>
     2 #include<math.h>
     3 #define PI 3.1415927
     4 int main()
     5 {
     6     double r,v;
     7     while(scanf("%lf", &r)!=EOF)
     8     {
     9         v = (4.0/3)*PI*r*r*r;
    10         printf("%.3f
    ",v);
    11     }
    12     return 0;
    13 } 
    View Code

    HDU 1000

    #include<stdio.h>
    int main()
    {
       long long a,b;
       while(scanf("%ld%ld",&a,&b)!=EOF)
       {
           printf("%ld
    ",a+b);
       }
       return 0;
    } 
    View Code

    HDU 1001

    #include<stdio.h>
    int main()
    {
       int n,i,sum;
       while(scanf("%d",&n)!=EOF)
       {sum=0;
           for(i=1;i<=n;i++)
           sum=i+sum;
           printf("%d
    
    ",sum);
       }    
       return 0;
    }
    View Code


    其实弱感觉学好C的捷径还是,找几道题练习一下! 上面的几个程序如果能看懂, while();和for()循环就学的差不多啦。

    HDU 1002

    #include <stdio.h>
    #include <string.h>
    int main()
    {
        int a[1002];
        int b[1002] ;
        char a1[1002];     
        char a2[1002];
        int n,m,i,j,wbx,l1,l2,cc;
        scanf("%d",&n);
        m=n;wbx=1;
        while(m--)
        {
            memset(a,0,sizeof(a));
            memset(b,0,sizeof(b));
            scanf("%s",a1);
            scanf("%s",a2);
            l1=strlen(a1)-1;  
            l2=strlen(a2)-1;
            cc=0;
            for(i=l1;i>=0;i--)
                a[cc++]=a1[i]-'0';
            cc=0;
            for(i=l2;i>=0;i--)
                b[cc++]=a2[i]-'0';
            for(i=0;i<1002;i++)
            {
                a[i]+=b[i];
                if(a[i]>=10)
                {
                    a[i]-=10;
                    a[i+1]++;
                }
            }
            printf("Case %d:
    ",wbx++);
            printf("%s + %s = ",a1,a2);
            for(i=1001;i>=0;i--)
                if(a[i])
                    break;
                for(j=i;j>=0;j--)
                    printf("%d",a[j]);
                printf("
    ");
                if(wbx!=n+1)
                {
                    printf("
    ");
                }
        }
        return 0;
    }
     
    View Code

    这道题能看懂, 数组和字符数组就差不多啦!

    下面全是格式题: 都是简单的A+B

    HDU 1089

    #include<stdio.h>
    int main()
    {
        int a,b;
        while(scanf("%d%d",&a,&b)!=EOF)
        {
            printf("%d
    ",a+b);
        }
        return 0;
    }
    View Code

    HDU 1090

    #include<stdio.h>
    int main()
    {
        int a,b,n;
        scanf("%d",&n);
        while(n--)
        {
            scanf("%d%d",&a,&b);
            printf("%d
    ",a+b);
        }
        return 0;
    }
    View Code

    HDU 1091

    #include<stdio.h>
    int main()
    {
        int a,b;
        while(scanf("%d%d",&a,&b)!=EOF&&a!=0||b!=0)
        {
            printf("%d
    ",a+b);
        }
        return 0;
    }
    View Code

    HDU 1092

    #include<stdio.h>
    int main()
    {
        int n,m,i,sum;
        while(scanf("%d",&n)!=EOF&&n)
        {sum=0;
            for(i=0;i<n;i++)
            {
                scanf("%d",&m);
                sum+=m;
            }
            printf("%d
    ",sum);
        }
        return 0;
    }
    View Code

    HDU 1093

    #include<stdio.h>
    int main()
    {
        int m,n,a,i,sum;
        scanf("%d",&m);
        while(m--)
        {   sum=0;
            scanf("%d",&n);
            for(i=0;i<n;i++)
            {
                scanf("%d",&a);
                sum+=a;
            }
            printf("%d
    ",sum);
        }
        return 0;
    }
    View Code

    HDU 1094

    #include<stdio.h>
    int main()
    {
        int n,i,sum,b;
        while(scanf("%d",&n)!=EOF)
        {   sum=0;
            for(i=0;i<n;i++)
            {
                scanf("%d",&b);
                sum+=b;
            }
            printf("%d
    ",sum);
        }
        return 0;
    }
    View Code

    HDU 1095

    #include<stdio.h>
    int main()
    {
        int a,b;
        while(scanf("%d%d",&a,&b)!=EOF)
        {
            printf("%d
    
    ",a+b);
        }
        return 0;
    }
    View Code

    HDU 1096

    #include<stdio.h>
    int main()
    {
        int n,m,i,sum,t;
        scanf("%d",&m);
        while(m--)
        {   sum=0;
            scanf("%d",&n);
            for(i=0;i<n;i++)
            {
                scanf("%d",&t);
                sum+=t;
            }
            printf("%d
    ",sum);
            if(m!=0)
            printf("
    ");
        }
        return 0;
    }
    View Code

    上面这些题目, 全是侮辱智商的格式题。 但是表示当时做完后还是蛮开心的! 上面的题虽然侮辱智商, 但是对于不熟悉语言的新人来说, 还是有难度的! 请不要做直接copy的伸手党! 尽量独立完成, 格式问题可以参考代码!     仅供纯新手入门浏览!

     CHD  ACMer   新手必读

     虽然学长很弱, 但是学长真的很希望学弟学妹好好学习一下C语言(不管你来不来听课), 然后壮大A协!

         成功从来没有捷径, 永远别指望靠一篇水博客学会编程(这里特指C语言)。 这里推荐一本权威的C语言教材: C语言程序设计(200多页)

  • 相关阅读:
    软件工程 作业二
    软件工程 作业一
    201621123031 《Java程序设计》第14周学习总结
    201621123031 《Java程序设计》第13周学习总结
    201621123031 《Java程序设计》第12周学习总结
    201621123031 《Java程序设计》第11周学习总结
    201621123031 《Java程序设计》第10周学习总结
    201621123031 《Java程序设计》第9周学习总结
    Team抢救最后一下
    个人作业——案例分析
  • 原文地址:https://www.cnblogs.com/acm1314/p/4811738.html
Copyright © 2020-2023  润新知