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

时间:2022-11-13 16:48:44

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

本篇博客只是为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多页)