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

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

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

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

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

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

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

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

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

#include<stdio.h>

int main()
{
int me, you;
scanf("%d + %d", &me, &you);
printf("%d + %d = %d\n", me, you, me+you);
return ;
} //输入格式: 9 + 5
//输出结果: 9 + 5 = 13
//关于字符串的输入输出
#include<stdio.h> int main()
{
char str[];
char ch;
scanf("%s", str);
scanf("%c", &ch);
if(ch=='\n') printf("卧槽!\n");
printf("%s\n", str);
printf("%c\n", ch);
return ;
}
// 输入: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\n", ch1, ch2);
else if(ch1 > ch2) printf("%c > %c\n", ch1, ch2);
else printf("%c = %c\n", ch1, ch2); return ;
}

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

//比较两个字母的字典序

#include<stdio.h>

int main()
{
char ch1, ch2;
scanf("%c %c", &ch1, &ch2);
if(ch1<ch2) printf("%c < %c\n", ch1, ch2);
else if(ch1 > ch2) printf("%c > %c\n", ch1, ch2);
else printf("%c = %c\n", ch1, ch2); scanf("%c %c", &ch1, &ch2);
if(ch1<ch2) printf("%c < %c\n", ch1, ch2);
else if(ch1 > ch2) printf("%c > %c\n", ch1, ch2);
else printf("%c = %c\n", ch1, ch2); return ;
} //输入: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\n", ch1, ch2);
else if(ch1 > ch2) printf("%c > %c\n", ch1, ch2);
else printf("%c = %c\n", ch1, ch2); getchar(); // 吸收掉换行符 scanf("%c %c", &ch1, &ch2);
if(ch1<ch2) printf("%c < %c\n", ch1, ch2);
else if(ch1 > ch2) printf("%c > %c\n", ch1, ch2);
else printf("%c = %c\n", ch1, ch2); return ;
} //输入:a b
//输出:a < b
//输入:c d
//输出:c < d
//上面出错的原因就是因为 ch1 是读取了第一次输入的换行符

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

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

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

 #include <stdio.h>

 int main()
{
char a, b, c, d, e;
while(scanf("%c%c%c", &a, &b, &c)!=EOF)
{
getchar();
d = a; e = a;
if(a > b) d = b;
if(d > c) d = c;
if(e < b) e = b;
if(e < c) e = c;
printf("%c %c %c\n", d, a+b+c-d-e, e);
}
return ;
}
#include<stdio.h>

int main()
{
char str[];
char ch;
gets(str);
scanf("%c", &ch);
printf("%s\n", str);
if(ch=='\n') puts("so so!");
printf("%c\n", ch);
return ;
}

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

#include<stdio.h>

int main()
{
char str[];
char ch;
gets(str);
puts(str);
return ;
} // 输入: 已经超过字符数组啦!
//输出: 已经超过字符数组啦!

实现多组输入:

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

#include<stdio.h>

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

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

#include<stdio.h>

int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int a, b;
scanf("%d%d", &a, &b);
printf("%d\n", a+b);
}
return ;
}

如果想直接点击.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\n",a,b,d);
} return ;
}
 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\n", d, a+b+c-d-e, e);
15 }
16 return 0;
17 }

任选一份代码!

HDU 2001

 #include<stdio.h>
#include<math.h>
main()
{
float x1,y1,x2,y2,n,t;
while(scanf("%f %f %f %f",&x1,&y1,&x2,&y2)!=EOF)
{
t=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
n=sqrt(t);
printf("%.2f\n",n);
}
return ;
}

HDU 2002

 #include<stdio.h>
#include<math.h>
#define PI 3.1415927
int main()
{
double r,v;
while(scanf("%lf", &r)!=EOF)
{
v = (4.0/)*PI*r*r*r;
printf("%.3f\n",v);
}
return ;
}

HDU 1000

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

HDU 1001

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

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

HDU 1002

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

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

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

HDU 1089

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

HDU 1090

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

HDU 1091

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

HDU 1092

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

HDU 1093

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

HDU 1094

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

HDU 1095

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

HDU 1096

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

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

CHD  ACMer   新手必读

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

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

小C的故事(快速学C语言,,,极速版!)的更多相关文章

  1. 快速学习C语言一: Hello World

    估计不会写C语言的同学也都听过C语言,从头开始快速学一下吧,以后肯定能用的上. 如果使用过其它类C的语言,如JAVA,C#等,学C的语法应该挺快的. 先快速学习并练习一些基本的语言要素,基本类型,表达 ...

  2. 先定一个小目标:10天自学C语言编程,教你如何改变一生

    C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...

  3. 我是先学C语言还是先学C++,实不相瞒,鱼和熊掌可兼得!

    这是最近一周时间几个读者小伙伴所提的问题,我顺手截了两个图. 实不相瞒,这类问题之前也经常看到.     每次遇到这种问题,看起来很简单,但是打字一时半会还真说不清,想想今天周末了,写一篇文章来统一聊 ...

  4. 20155224聂小益 - 我的技能与C语言学习

    20155224聂小益 - 我的技能与C语言学习 预备作业2 ● 你有什么技能比大多人(超过90%以上)更好? 我认为我可能有些技能身边有的人比较少有,但是要是超过90%以上我实在不敢保证.毕竟厉害的 ...

  5. hdu4505小Q系列故事——电梯里的爱情

    小Q系列故事——电梯里的爱情 Time Limit: 300/100 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tota ...

  6. Java程序员快速入门Go语言

    这篇文章帮助Java程序员快速入门Go语言. 转载至 开源中国社区. http://www.oschina.net 本文将以一个有代表性的例子为开始,以此让Java程序员对Go语言有个初步认识,随后将 ...

  7. 小Q系列故事——电梯里的爱情

    小Q系列故事——电梯里的爱情 Time Limit : 300/100ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total ...

  8. 2018年如何快速学Java

    前言 只有光头才能变强 提前预警:本文适合Java新手阅读(老手可在评论区给下建议),希望大家看完能有所收获. 一.为什么我要写下这篇文章 1.1直接缘由: 在今天(2018年11月4日)有个同学给我 ...

  9. 小朋友学C语言(7)

    数组 一.数组简介 C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合.数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量. 数组的声明并不是声明一个个单独的变量,比 ...

随机推荐

  1. restful 注解

    @Path @Path 注释被用来描述根资源.子资源方法或子资源的位置.value 值可以包含文本字符.变量或具有定制正则表达式的变量. @GET.@POST.@PUT.@DELETE.@HEAD @ ...

  2. 【PHP设计模式 09_ZhuangShiQi.php】装饰器模式 (decorator)

    <?php /** * [装饰器模式 (decorator)] * 有时候发布一篇文章需要经过很多人手,层层处理 */ header("Content-type: text/html; ...

  3. JavaEE基础(二十一)/IO流

    1.IO流(字符流FileReader) 1.字符流是什么 字符流是可以直接读写字符的IO流 字符流读取字符, 就要先读取到字节数据, 然后转为字符. 如果要写出字符, 需要把字符转为字节再写出. 2 ...

  4. C#:IText构造PDF文件

    IText构造PDF文件 1.1 生成Document Document是我们要生成的PDF文件所有元素的容器,因此要生成一个PDF文档,必须首先定义一个Document对象. Document有三种 ...

  5. PHP serialize & JSON 解析

    对于JSON(JavaScript Object Notation)大家应该不陌生,它是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript Program ...

  6. asp.net 关闭子窗体 刷新主窗体

    主窗体************************************************************************************ //原窗口保留,以对话框 ...

  7. Android开发中完全退出程序的三种方法

    参考: http://android.tgbus.com/Android/tutorial/201108/363511.shtml Android程序有很多Activity,比如说主窗口A,调用了子窗 ...

  8. Gift Hunting(分组背包)

    Gift Hunting Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...

  9. 山东理工大学第七届ACM校赛-经济节约 分类: 比赛 2015-06-26 10:34 19人阅读 评论(0) 收藏

    经济节约 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 由于经济紧张,某国国王决定减少一部分多余的士兵,这些士兵在边界都有各自的 ...

  10. Poj(3615),Floyd,最大值中的最小值

    题目链接:http://poj.org/problem?id=3615 题意:大致题意:有N个木桩,和M个木桩对之间的高度差(从x跳到y需要往上跳的高度).从x跳跃到y的路径消耗的体力值是路径中的一个 ...