ACM零基础新手入门详解

emmmm,这一篇博客比较水,主要是不太会讲,只能以代码加运行效果图拿出来看看了。。。将就看看吧QAQ,由于比较水,所以博主可能时常会更新这篇博客,直到它能看的过去为止。。。。

这里有个博客我觉得写得很好。。。比我牛逼多了。萌新们可以看看https://blog.csdn.net/qq_23079443/article/details/81108901

首先给出一份代码:

#include <cstdio>
int main()
{
	printf ("hellow world!\n");
	return 0;
}

运行效果图:
在这里插入图片描述
首先你得记住这玩意运行的是英文字符,也就是说如果你用中文输入法输入的话它会报错中文是全角,英文是半角的来着。。。。但鉴于还是有很多人不会。。。。看下面吧QAQ:
我们需要的是英文,那么必须要让它显示“英”!!!在这里插入图片描述
对于有些东西我们不必太懂它的运行机制,我们只要知道他是干什么的就好了。
比如对于:

#include < cstdio >

这是一个头文件,算的上是必须写的东西,这个就可以直接忽略了,反正写上去程序才能运行。只不过这是C++的头文件,如果使用的是C语言的编译器(就像手机的C语言编译器)那么就应该是这样的

#include <stdio.h>

C++和C语言的头文件,看到C++前面有个c的就把他去掉,在后面加个’.h’就好了

接下来就是int main()这个函数了,其格式为:

int main()
{
     //*******
}

他就会执行在这大括号里面的东西。不过这个东西是主函数。。。。新手到这里就可以了O(∩_∩)O。必须写这玩意就行了

printf

就是输出在屏幕上的意思,其具体格式为:

printf ("%d",x);

就是将双引号里面的东西输出。
其中分号是一个句子结束的意思。
其中x为一个被int类型所控制的整形,这里先忽略。
其中%是转义字符,如果不加%的话就会直接输出d这东西,而%d就是格式控制符,反正要输出一个整形变量就得用%d。。。。也先忽略吧QAQ

以下是一些实践:

printf ("d\n");

\n是在printf的双引号中表示换行的意思
在这里插入图片描述
假设我们这样写:

printf ("%d");

编译器不会报错,他会随机分配一个整形输出:

#include <cstdio>
int main()
{
	printf ("%d");
	return 0;
}

在这里插入图片描述
下面我们整一个整形变量,int x:表示x是一个绝对值不超过231-1的一个整数。(记住,只有先定义了才能够用,如果没有定义就使用的话会报错!!!!)
但刚开始的时候x也是被随机分配值的如果想以下这么写的话还是会随机输出东西。

#include <cstdio>
int main()
{
	int x;
	printf ("%d",x);
	return 0;
}

所以我们要给x赋值:

#include <cstdio>
int main()
{
	int x;
	x=10;
	printf ("%d",x);
	return 0;
}

‘=’号的意思是将右边的值赋给左边
其效果图:
在这里插入图片描述
。。。接下来我们就可以执行一些简单的操作了,比如说做一些运算:

#include <cstdio>
int main()
{
	int a,b;
	a=5,b=3;
	int c=a+b,d=a-b,e=a*b,k=a/b;
	printf ("%d%d%d%d",c,d,e,k);
	return 0;
}

在这里插入图片描述
因为没有空格,所以就粘在一起了。那么我们将它的printf里面加一个空格就好了:

printf ("%d %d %d %d",c,d,e,k);

在这里插入图片描述
假装你们应该懂了ε=(#>д<)ノ

最后renturn 0;记住加上就好了,没有为什么(* ^ ▽ ^ *)。
现在我们不想每次都对a和b进行修改而达到我们想要的值。我们想直接在屏幕上输入a,b的值然后让计算机帮我们按照一定的程序算出东西来:

#include <cstdio>
int main()
{
	int a,b;
	scanf ("%d%d",&a,&b);
	int c=a+b,d=a-b,e=a*b,k=a/b;
	printf ("%d %d %d %d",c,d,e,k);
	return 0;
}

那就使用scanf吧。‘&’是取地址的意思,记得加上就好了(* ^ ▽ ^*)。其实scanf和printf的格式差不多的这么看的话。但scanf对于输入的话也是格式控制来着。。。假设你的a输入结束了,你想输入b,那只要在输入不是整形的字符就好了比如空格就像这样:
在这里插入图片描述
最上面的是我们输入的a和b的值,但输入结束后只能按回车才能使得程序运行。

还有一个就是关于除法的。。。之前没写QAQ。。。整型/整型=整形。而且最后的这个整型是向下取整过后的整型。比如5/3=1、11/4=2…

接下来就是循环,计算机算得上是最大的优势:
一个是for循环和while循环:

#include <cstdio>
int main()
{
	int s=0;
	for (int i=1; i<=10; i++) s=s+i;
	printf ("%d\n",s);
	return 0;
}

在这里插入图片描述
大概意思就是令整形变量的初始值为1,当它小于等于10的时候就自增(相当于i=i+1的意思)。for的形式有很多,大家可以自己多试试,只要括号里面有两个分号就行了:
for (; ; )、for (int i=1; ; )……

#include <cstdio>
int main()
{
	int s=0;
	int i=1;
	while (i<=10){
		s=s+i;
		i++;
	}
	printf ("%d\n",s);
	return 0;
}

在这里插入图片描述
同样的效果。。。while(当满足该条件的时候做以下语句)。。现在我们接触到了大括号{}它的意思大概就是整个大括号里面的东西都是一句话。。。。

循环出现了,那么也可以说一下爆int的情况了,int的范围大概是21亿左右,很容易在循环中由于多次相加而爆掉比如就像上面的程序一样,累加10次,如果我每次加上的数在10亿左右(109就是1e9),那么s就会爆掉,显示一个很大的负数给你。。。。这个时候我们就要使用long long 了我们将使用int定义的s改为用long long来定义就好了:

long long s=0;

而long long 的格式控制符是lld,比起int 多了两个小写的‘L’那么也就是在输出的时候我们必须使用printf ("%lld",s);来进行输出。输入的时候也是一样,如果你输入的数据被你定义为long long形的你也应该使用%lld来进行输入。

我们ACM的比赛中题目也经常出现多组输入这种东西,也就是可以一直输入,它的操作有很多,比如处理到文件结束的多组输入,t组数据的多组输入,直到某一项为0的多组输入。。。

1.文件结束符为EOF,对于处理到文件结束的多组输入我们一般是这么写的:

while (scanf ("%d",&x)!=EOF) {........}

while (~scanf ("%d",&x)) {.......}

也差不多就这两种写法。
2.t组数据的多组输入,那么首先得给出t是多少,所以先读入一个t,接下来一个循环从1到t每次运行一遍程序。比如:

#include <cstdio>
int main()
{
	int t,a,b;
	scanf ("%d",&t);
	for (int i=1; i<=t; i++){
		scanf ("%d%d",&a,&b);
		printf ("%d\n",a+b);
	}
	return 0;
}

在这里插入图片描述
也就是输了两组A+B问题,但实际上我们不会用for来对组数做处理,我们一般使用:

while (t--) {.....}

好了,这里好像又涉及到了条件判断QAQ。。。我们while需要执行的时候必须满足括号里的条件,那么(t–)代表什么呢?大概就是先判断它存在与否,然后再把它减一后执行下面的程序。

条件的判断我只会if和else。。。。o(╥﹏╥)o,就先说说这个吧。其格式如下:

if (...){.....}
else if (...){.......}

我觉得学过英语的都应该看得懂吧。。。就是当括号中条件成立的时候执行第一个,否则当第二个条件成立的时候执行第二个。我们的条件判断大概也就几种而已,就像存在与否,相等关系的判断,大小关系的判断:

if (a!=0) //表示a存在,即不等于0,也可以写成if (a)
if (a==0) //表示a不存在,即a等于0的情况也写作if (!a)
if (a>b)   if (a<b)   if (a>=b)   if (a<=b)......

大概也就这几种,记住以下格式就行了,等于是==,赋值是=,大于等于是>=

执行一下程序吧:

#include <cstdio>
int main()
{
	int t,a,b;
	for (int i=1; i<=10; i++){
		if (i%2) printf ("...\n");//%代表取余的意思这里也就是i除以2的余数的意思
		else if (i%2==0)printf ("***\n");
	}
	return 0;
}

在这里插入图片描述
以上都是关于整数的运算,那么如果需要需要小数呢?
关于小数,即浮点型也有两个,相当于整形的int和long long

一个是float (精度不高)范围相当于int,另一个是double(精度较高能存的值也较大)范围相当于long long。

那么精度又是个什么东西呢?举个例子;
1在浮点数的存值可能为0.99999999,或1.000000001。即有一定的误差,但这并不妨碍,因为我们的答案都是精确到哪一位的,他会自动四舍五入。
对于他们的控制符是%f和%lf。要保留几位小数的话就是%.3f表示保留3位小数。

比如以下:

#include <cstdio>
int main()
{
	double s;
	scanf ("%lf",&s);
	printf ("%lf\n",s);
	printf ("%.2lf\n",s);
	return 0;
}

在这里插入图片描述
其中浮点类型都有一个默认的位数保留比如第二行,它保留了后6位。。。

还有一个关于整型转浮点型的操作,一个是强制类型转换,还有一个是直接乘以1.0就好了:

	int n;
	double s;
	s=(double)n;
	s=1.0*n;

。。。如果没有转换的话很多题目会答案出错(Wrong Answer)简称WA(哇)。。。

写一题吧。。感觉空口白讲一样。。。没啥作用:
题目链接https://www.luogu.org/problem/P1421

题目描述

班主任给小玉一个任务,到文具店里买尽量多的签字笔。已知一只签字笔的价格是1元9角,而班主任给小玉的钱是a元b角,小玉想知道,她最多能买多少只签字笔呢。

输入格式

输入的数据,在一行内,包括两个整数,依次表示a和b,a<=10000,b<=9。

输出格式

输出一个整数,表示小玉最多能买多少只签字笔。

输入输出样例
输入
10 3
输出
5


这道题的话直接换算一下就好了:一支笔需要多少角钱?19角。你总共有多少?
a* 10+b角钱。那么你只需要把(a* 10+b)/19就好了。由于整型的向下取整。可以证明这样写是没有毛病的。。。

#include <cstdio>
#include <cmath>
int main()
{
	int a,b;
	scanf ("%d%d",&a,&b);
	int s=(a*10+b)/19;
	printf ("%d\n",s);
	return 0;
}

。。。

下面给出一道需要浮点数运算的一题吧:
题目链接https://www.luogu.org/problem/P1422

题目描述

夏天到了,各家各户的用电量都增加了许多,相应的电费也交的更多了。小玉家今天收到了一份电费通知单。小玉看到上面写:据闽价电[2006]27号规定,月用电量在150千瓦时及以下部分按每千瓦时0.4463元执行,月用电量在151~400千瓦时的部分按每千瓦时0.4663元执行,月用电量在401千瓦时及以上部分按每千瓦时0.5663元执行;小玉想自己验证一下,电费通知单上应交电费的数目到底是否正确呢。请编写一个程序,已知用电总计,根据电价规定,计算出应交的电费应该是多少。

输入格式

输入一个整数,表示用电总计(单位以千瓦时计),不超过10000。

输出格式

输出一个数,保留到小数点后1位(单位以元计,保留到小数点后1位)。

输入输出样例
输入
267
输出
121.5

初中学过数学应该都会吧。。。。简单的一个分段函数就好了:
1.当用电<=150的时候直接将n* 0.4463
2.150到400的部分 * 0.4663
3.其余的部分*0.5663
下面是过了的代码:

#include <cstdio>
int main () 
{
	int n;
	double f;
	scanf ("%d",&n);
	if (n<=150) {
		f=n*0.4463;
		printf ("%.1f",f);
	} 
	else if (n<=400) {
		f=150*0.4463+(n-150)*0.4663;
		printf ("%.1f",f);
	} 
	else {//前面都不成立执行(之前没讲else,以为你们应该知道else if后不用讲了QAQ)
		f=150*0.4463+(400-150)*0.4663+(n-400)*0.5663;
		printf ("%.1lf",f);
	}
	return 0;
}

。。。当然这个写法比较笨,但比较好看懂,而我们有时候确实不必要追求一些花里胡哨的东西(需要永远记住的是越复杂(不管是想法还是代码操作)的代码越容易出错,越简单粗暴的代码越不容易出错(当然你的想法要对)):

emmm,好了,写不出来了QAQ好菜啊,溜了溜了。。。。

  • 8
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值