重拾C/C++_程序设计入门

在自己大学的认知过程中,大一自己很不在意C,认为又难又没用,但随着自己的学习和对计算机专业的认证加深,自己还是觉得掌握C/C++并没有那么不堪。
这里以Dev-cpp为例,因为之前学过C了,这里的C/C++我就写的简洁一点了,可能有的地方会看的很莫名。
本系列以算法竞赛书籍为参考撰写。

算术表达式

#include<stdio.h>
int main()
{
	printf("%d\n", 1+2);
	printf("%d\n", 3-4);
	printf("%d\n", 5*6);	//计算5×6
	printf("%d\n", 8/4);	//计算8÷4
	printf("%d\n", 8/5);	
	printf("%.1f\n", 8.0/5.0);	//保留一位小数
	printf("%.2f\n", 8.0/5.0);	//保留两位小数
	printf("%.1f\n", 8/5);	//不加.0的结果
	printf("%d\n", 8.0/5.0);	//若不写%.f,但写了.0
	return 0;
} 

我们对应输出结果看一下
在这里插入图片描述
注意的东西:

  • C语言中,区分大小写
  • 整数用%d输出,浮点数用%f
  • 整数/整数=整数,浮点数/浮点数=浮点数

下面我们来试试复杂的计算题,计算一下1+2×根号3÷(5-0.1)。

#include<stdio.h>
#include<math.h>	//导入math.h头文件
int main()
{
	printf("%.8f", 1+2*sqrt(3)/(5-0.1));	//sqrt()就是算术平方根
	return 0;
} 

sqrt()是math.h的函数,所以我们需要导入math.h头文件,才能使用sqrt()函数。
在这里插入图片描述

变量及输入

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

在这里插入图片描述
现在,来一个常见数学题:
一有顶圆柱体,底为半径为r的圆,高为h,计算它的表面积。

#include<stdio.h>
#include<math.h>
int main()
{
	const double pi = acos(-1.0);
	double r,h;
	scanf("%lf%lf", &r, &h);
	printf("%.3f", 2.0*r*r*pi + 2.0*pi*r*h);
	return 0;
}

const是常数(值不会变的数)的声明。
在这里插入图片描述
算法竞赛中,输入输出必须严格按要求来,输出完程序就应该结束,不用加什么getchar(),system(“pause”)什么的。
每行输出均应为回车符结束,包括最后一行。除非特别说明,每行行首不应用空格,但行末通常可以有多余空格。另外,输出的没两个数或者字符串之间以单个空格隔开。

顺序结构程序设计

三位数反转

#include<stdio.h>
int main()
{
	int number;
	scanf("%d", &number);
	printf("%d%d%d\n", number%10, number/10%10, number/100);
	return 0;
}

在这里插入图片描述
%为取余,比如3%2为1,10%2为0,30%14为2。
不过这个题目有个bug,如果最后一位数是0,那反转输不输出0呢?竞赛出现这种情况可以问相关人员,这里我们两个方法都了解一下,上面的方法是输出0的,下面给出不输出0的

#include<stdio.h>
int main()
{
	int n,m;
	scanf("%d", &n);
	m = n%10*100 + (n/10%10)*10 + n/100;
	printf("%d", m);		//输出首部不带0
	printf("%03d\n", m);	//这样首部可以带0输出
	printf("%04d\n", m);	//观察输出格式
	return 0;
}

在这里插入图片描述

交换变量

第一个方法

#include<stdio.h>
int main()
{
	int a,b,t;
	scanf("%d%d", &a, &b);
	t = a;	//用一个中间介质来实现
	a = b;
	b = t;
	printf("%d %d\n", a, b);
	return 0;
}

第二个方法

#include<stdio.h>
int main()
{
	int a,b;
	scanf("%d%d", &a, &b);
	a = a + b;		//不用中间变量来辅助
	b = a - b;
	a = a - b;
	printf("%d %d", a, b);
	return 0;
}

上面的方法虽然少用一个变量,但实际上很少使用,因为其适用范围很窄。
许多算法竞赛是采用黑盒测试(不看你采用什么算法),所以有个简便的方法,第三个方法

#include<stdio.h>
int main()
{
	int a,b;
	scanf("%d%d", &a, &b);
	printf("%d %d\n", b, a);	//倒着输出就行了
	return 0;
}

这三段的代码我就没有放Dev运行了,如果有错误,评论帮我指出一下,谢谢哈。。

分支结构程序设计

讨论一个很典型的数学题= =

鸡兔同笼

已知鸡和兔总数为n,总腿数为m。输入n和m,依次输出鸡和兔的数量。
先来计算一下,设鸡a只,兔b只。那么可得出a + b = n,2a + 4b = m。
进而得出a = (4n-m)/2,b=n-a(不要=(m-2n)/2,这样计算复杂了,这不是数学作业)

#include<stdio.h>
int main()
{
	int n,m,a,b;	//令鸡为a只,兔为b只
	scanf("%d%d", &n, &m);
	a = (4 * n - m) / 2;
	b = n - a;
	if(a<0 || b<0 || m % 2 == 1)	//输入的m要是偶数,因为2a+4b为m
		printf("No answer\n");
	else
		printf("%d %d\n", a, b);
	return 0;
}

在这里插入图片描述

三整数排序

可能很多人知道冒泡排序法和选择排序法以及很多的排序方法,但这里才第一天,我们先从简单的说起吧。
首先,因为我们只有三个数,我们可以一一列举出来。abc,acb,bac,bca,cab,cba,六种情况。那我们可以六个if判断来解决这个问题。
不过,若1三个数相同,比如1 1 1输出,得出的是六行1 1 1。所以我们改进成else if,else if可以让条件与if的条件无交叉的情况。

#include<stdio.h>
int main()
{
	int a,b,c;
	scanf("%d%d%d", &a, &b, &c);
	if(a<=b && b<=c) printf("%d %d %d\n", a, b, c);
	else if(a<=c && c<=b) printf("%d %d %d\n", a, c, b);
	else if(b<=a && a<=c) printf("%d %d %d\n", b, a, c);
	else if(b<=c && c<=a) printf("%d %d %d\n", b, c, a);
	else if(c<=a && a<=b) printf("%d %d %d\n", c, a, b);
	else printf("%d %d %d\n", c, b, a);	//总共六种情况,所以else可以代表上面五种情况的例外情况
	return 0;
}

在这里插入图片描述
从大到小排序就把上述代码中所有<=变成>=。
还有种更简便的方法,我们先从三个数中挑出最大值,并换到第一个位置;再从剩下两个数中挑出最大值,放在第二位…这是选择排序的思想。

#include<stdio.h>
int main()
{
	int a,b,c,t;	//t是辅助变量互换的 
	scanf("%d%d%d", &a,&b, &c);
	if(a >= b)
	{
		t=a;
		a=b;
		b=t;
	}
	if(a >= c) { t=a; a=c; c=t;	}	//前两个if判断,等同于三个数中的最大值放到第一位 
	if(b >= c) { t=b; b=c; c=t; }	//剩下两个数大的放前,小的放后 
	printf("%d %d %d\n",a, b, c);	//输出 
	return 0;
}

第一个if和第二个if的格式都是正确的,这里我两个都写下,可能会不太美观,只是想提醒可以这样写。
在这里插入图片描述

注解与习题

C中double类型输出要用%lf,输出要用%f,VC++ 6.0和Dev都兼容了C和C++,所以有时候不会出现错误。我们这里每次保存的程序都是.cpp格式,可以把现在的学习当作C++语言中与C语言兼容的部分
接下来的部分,大家自己码码代码,自己探究,我这里就只给出截图了

更深认识数据类型与输入格式

这里的int和double并不能保存任意的整数和浮点数。我们来实验一下

  • A:11111*11111的值=?5个1变为6个1呢?9个1呢?
  • B:把第一个实验全换成浮点数?
  • C:sqrt(-10)=?会报错嘛?
  • D:1.0/0.0、0.0/0.0的值为?会报错嘛?
  • E:1/0的值为?会报错嘛?
    在这里插入图片描述
    在这里插入图片描述
    可以观察到,
    A:第一个printf是正常输出的;第二个输出的已经不对了;第三个也是;在Dev下面警告信息(橙色,红色才是报错)可以看到,6,7行integer overflow in expression [-Woverflow],就是超出整形(integer)界限了
    B:换成浮点数三个输出都正常输出了,可以用计算机上的计算器计算一下比照。
    C:没有警告报错信息,输出的也是奇怪的字符串
    D:和C类似的情况,第二个输出还输出了与C一样的奇怪字符串
    E:Dev警告了18行的输出,division by zero,被零除了,结果上也没有输出任何东西

对于C和D中的字符,我查阅了一些资料1.#INF00表示的是正无穷,inf是infinity(正无穷的缩写),超出了double浮点数的最大范围,一般是除0得出的结果;but,-1.#IND00不是负无穷,IND是indeterminate的缩写,意思是不确定,一般来说,它们来自于任何未定义结果(非法)的浮点数运算。Windows说的是IND,Linux上说的就是NAN(not a number)。-1.#IND00 对应符号位 1 , 阶码全1 , 尾数非0。可以说,出现1.#IND00就检查是否发生了非法的运算;出现1.#INF00就表示计算结果溢出,检查是否除了0。

输入格式的实验:

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

在同一行输入12和2,以空格分隔,观察结果
在不同两行输入12和2,观察结果
在12与2之间插入大量空格,tab(水平制表符)和空行,观察结果
把12和2换成12和字符s,重复上述步骤。

下面我们展示截图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
前三个大家可以看到,两个数中间的空格,tab,还是回车符都不会影响到值的读取;我们比较好奇的是为什么输入不是整型的s输出的是8。看下面的图,我们发现无论输入什么字符,输出的都是8,前一个数的输出为32。我也不知道应该怎么百度。。有知道的人可以在评论区说下,感激不尽。。(我也在论坛里问了,知道原理就回来补上)
在这里插入图片描述
\n是换行符,\在输出里面是个敏感的字符,想要输出"“的时候,要写成”\"
eg: printf(“12\12”); 输出为:122 正确写法:printf(“12\12”); 输出:12\12
那么如何输出%d呢?我试出了这个。
在这里插入图片描述
好了,Over,程序设计离不开练习,练习的题目另写了一个。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值