小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\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 0;
}
适当的应用 scanf 可以跳过我们不需要的字符!
#include<stdio.h> int main() { int me, you; scanf("%d + %d", &me, &you); printf("%d + %d = %d\n", 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=='\n') printf("卧槽!\n"); printf("%s\n", str); printf("%c\n", 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\n", ch1, ch2);
else if(ch1 > ch2) printf("%c > %c\n", ch1, ch2);
else printf("%c = %c\n", ch1, ch2);
return 0;
}
这个还是正常的, 但是如果再读入一次输入呢?
//比较两个字母的字典序
#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 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\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 0;
}
//输入: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
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 }
#include<stdio.h>
int main()
{
char str[105];
char ch;
gets(str);
scanf("%c", &ch);
printf("%s\n", str);
if(ch=='\n') puts("so so!");
printf("%c\n", 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\n", a+b);
}
return 0;
}
#include<stdio.h>
int main()
{
int a, b;
while(~scanf("%d%d", &a, &b)) // 和上面的程序意思一样
{
printf("%d\n", a+b);
}
return 0;
}
#include<stdio.h>// 和上面的程序效果一样
int main()
{
int a, b;
while(scanf("%d%d", &a, &b)==2) // 意思是成功读取两个整数
{
printf("%d\n", 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\n", 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\n",a,b,d); } return 0; }
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
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",n); 11 } 12 return 0; 13 }
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\n",v); 11 } 12 return 0; 13 }
HDU 1000
#include<stdio.h> int main() { long long a,b; while(scanf("%ld%ld",&a,&b)!=EOF) { printf("%ld\n",a+b); } return 0; }
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\n\n",sum); } return 0; }
其实弱感觉学好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:\n",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("\n"); if(wbx!=n+1) { printf("\n"); } } return 0; }
这道题能看懂, 数组和字符数组就差不多啦!
下面全是格式题: 都是简单的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 0; }
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 0; }
HDU 1091
#include<stdio.h> int main() { int a,b; while(scanf("%d%d",&a,&b)!=EOF&&a!=0||b!=0) { printf("%d\n",a+b); } return 0; }
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\n",sum); } return 0; }
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\n",sum); } return 0; }
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\n",sum); } return 0; }
HDU 1095
#include<stdio.h> int main() { int a,b; while(scanf("%d%d",&a,&b)!=EOF) { printf("%d\n\n",a+b); } return 0; }
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\n",sum); if(m!=0) printf("\n"); } return 0; }
上面这些题目, 全是侮辱智商的格式题。 但是表示当时做完后还是蛮开心的! 上面的题虽然侮辱智商, 但是对于不熟悉语言的新人来说, 还是有难度的! 请不要做直接copy的伸手党! 尽量独立完成, 格式问题可以参考代码! 仅供纯新手入门浏览!
虽然学长很弱, 但是学长真的很希望学弟学妹好好学习一下C语言(不管你来不来听课), 然后壮大A协!
成功从来没有捷径, 永远别指望靠一篇水博客学会编程(这里特指C语言)。 这里推荐一本权威的C语言教材: C语言程序设计(200多页)