小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多页)

原文地址:https://www.cnblogs.com/acm1314/p/4811738.html