算法入门 day2 (第一章)

1

新建文本文件1.c,notepad++编写程序,命令行中切换到路径然后gcc编译,得到a.exe(为啥不是1.exe),直接a,得到正确结果

# include<stdio.h>
int main()
{
	printf("%d\n", 1+2);
	return 0;
}
Microsoft Windows [版本 10.0.17134.112]
(c) 2018 Microsoft Corporation。保留所有权利。

C:\Users\Administrator>E:

E:\>cd mycfile

E:\mycfile>gcc 1.c

E:\mycfile>a
3

E:\mycfile>

在这里插入图片描述
文件名也是标识符,不要以数字开头,否则你看被替换为a.exe了,我试了,数字不管是多少,生成的都是a.exe

# include<stdio.h>
int main()
{
	printf("%d\n", 3-4);
	printf("%d\n", 3*4);
	printf("%d\n", 13/4);
	printf("%d\n", 13%4);
	return 0;
}

整数输出格式 %d
实数(专业说法:浮点数,如4.3)输出格式 %lf
整数之间运算结果还是整数
浮点数之间运算结果是浮点数
整数和浮点数运算结果是 浮点数,编译器会把整数先转换为浮点数

E:\mycfile>gcc a.c

E:\mycfile>a
-1
12
3
1

E:\mycfile>

保留1位小数

# include<stdio.h>
int main()
{
	//printf("%d\n", 3-4);
	//printf("%d\n", 3*4);
	printf("%d\n", 13/4);
	printf("%d\n", 13%4);
	printf("%.1lf\n", 13/4); //前后格式不对应,得到错误结果0
	printf("%.1lf\n", 13.0/4.0); //保留1位小数
	printf("%.2lf\n", 13.0/4.0); //保留2位小数
	printf("%d\n", 13.0/4.0); //前后格式不同,得到错误结果0
	return 0;
}

这里错误结果涉及到整数和浮点数的编码,先不管,只要你规范写代码就不会出现问题

E:\mycfile>gcc a.c

E:\mycfile>a
3
1
0.0
3.3
3.25
0

E:\mycfile>

2 数学运算需要math.h头文件

# include<stdio.h>
# include<math.h>
int main()
{
	printf("%.6lf", 2*sqrt(3)/(4-.1));
	
	return 0;
}
E:\mycfile>a
0.888231
E:\mycfile>

3 输入输出

# include<stdio.h>
# include<math.h>
int main()
{
	int a,b; //声明变量以让编译器分配内存
	scanf("%d%d", &a, &b); // 标准输入输出函数, 从键盘读取输入,占位符%d必须和声明的变量数据类型一样
	printf("%d", a+b);
	
	return 0;
}
E:\mycfile>a
16
23
39
E:\mycfile>

c语言中三角函数使用弧度制

# include<stdio.h>
# include<math.h>
int main()
{
	const double pi = 4.0 * atan(1.0); // const 关键字表明这是个常量,它的值不可以改变
	double r,h,s1,s2,s; 
	scanf("%lf%lf", &r, &h);
	s1 = 2*pi*r*r; // 赋值,assignment
	s2 = 2*pi*r*h;
	s = s1 + s2;
	printf("Area = %lf", s); // 双引号里的格式字符串可以包含打印内容,只有%后面的东西被变量替代
	
	return 0;
}
E:\mycfile>gcc a.c

E:\mycfile>a
3.5
9
Area = 274.889357
E:\mycfile>a
3.5
9.0
Area = 274.889357
E:\mycfile>

在这里插入图片描述在这里插入图片描述

顺序结构设计

三位数反转

在这里插入图片描述

# include<stdio.h>
// # include<math.h>
int main()
{
	int n;
	scanf("%d", &n );
	printf("%d%d%d", n%10, n%100/10, n/100);
	// 百位 n/100
	// 十位 n%100/10  或者 n/10%10
	// 个位 n%10
	
	return 0;
}
C:\Users\Administrator>E:

E:\>cd mycfile

E:\mycfile>gcc a.c

E:\mycfile>a
125
521
E:\mycfile>a
450
054
E:\mycfile>

对于个位数是0的,反转后如果赛题方要求不输出0,则

# include<stdio.h>
// # include<math.h>
int main()
{
	int n, m;
	scanf("%d", &n );
	//printf("%d%d%d", n%10, n%100/10, n/100);
	m = (n%10)*100 + (n/10%10)*10 + n/100; // 计算反转结果
	printf("%d", m);
	return 0;
}
E:\mycfile>gcc a.c

E:\mycfile>a
450
54
E:\mycfile>

交换变量

在这里插入图片描述

  1. 经典三变量法
# include<stdio.h>
// # include<math.h>
int main()
{
	int a, b, t;
	scanf("%d%d", &a, &b); // 输入格式字符串不需要打空格或\n,输入一个数回车后才让你输入第二个数
	t = a;
	a = b;
	b = t;
	printf("%d %d\n", a, b); // 输出格式字符串的空格就是很重要的了,表示输出时间隔一个空格
	
	return 0;
}

忘记加分号报错

E:\mycfile>gcc a.c
a.c: In function 'main':
a.c:12:2: error: expected ';' before 'return'
  return 0;
  ^

E:\mycfile>gcc a.c

E:\mycfile>a
12
45
45 12

E:\mycfile>
  1. 不用中间变量的高级方法(反而不推荐)
# include<stdio.h>
// # include<math.h>
int main()
{
	int a, b;
	scanf("%d%d", &a, &b);
	a = a + b;
	b = a - b;
	a = a - b;
	printf("%d %d\n", a, b);
	
	return 0;
}
E:\mycfile>gcc a.c

E:\mycfile>a
45
12
12 45

E:\mycfile>

在这里插入图片描述

  1. 解决问题就行
# include<stdio.h>
// # include<math.h>
int main()
{
	int a, b;
	scanf("%d%d", &a, &b);
	printf("%d %d\n", b, a);
	
	return 0;
}

在这里插入图片描述

分支程序设计

鸡兔同笼

在这里插入图片描述

# include<stdio.h>
// # include<math.h>
int main()
{
	int a, b, n, m;
	scanf("%d%d", &n, &m);
	a = (4*n-m)/2;
	b = n - a;
	if (m % 2 ==1 || a < 0 || b < 0)
		printf("No Answer\n");
	else
		printf("%d %d\n", a, b);
	
	return 0;
}

if 语句的 条件 是逻辑表达式
|| 逻辑或
&& 逻辑与
! 逻辑非
C语言的逻辑运算符都是短路(short-circuit)运算符,即,一旦可以确定整个表达式的值,就不再继续计算了,比如 a || b, 只要程序判断a的值非零(为真),则整个表达式就是为真,不再去看b的值,这样不仅速度更快

E:\mycfile>gcc a.c

E:\mycfile>a
12
2
No Answer

E:\mycfile>a
14
32
12 2

E:\mycfile>a
10
16
No Answer

三个数排序

  1. 笨方法,没法处理输入 1 1 1
# include<stdio.h>
// # include<math.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);
	if(a < c && c < b) 
		printf("%d %d %d\n", a, c, b);
	if(b < a && a < c) 
		printf("%d %d %d\n", b, a, c);
	if(b < c && c < a) 
		printf("%d %d %d\n", b, c, a);
	if(c < a && a < b) 
		printf("%d %d %d\n", c, a, b);
	if(c < b && b < a) 
		printf("%d %d %d\n", c, b, a);
	
	return 0;
}
E:\mycfile>gcc a.c

E:\mycfile>a
1
4
5
1 4 5

E:\mycfile>a
1
1
1

E:\mycfile>

第一版改正, 但是由于条件交叉导致输出很多次

# include<stdio.h>
// # include<math.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);
	if(a <= c && c <= b) 
		printf("%d %d %d\n", a, c, b);
	if(b <= a && a <= c) 
		printf("%d %d %d\n", b, a, c);
	if(b <= c && c <= a) 
		printf("%d %d %d\n", b, c, a);
	if(c <= a && a <= b) 
		printf("%d %d %d\n", c, a, b);
	if(c <= b && b <= a) 
		printf("%d %d %d\n", c, b, a);
	
	return 0;
}
E:\mycfile>gcc a.c

E:\mycfile>a
5
8
1
1 5 8

E:\mycfile>a
1
1
1
1 1 1
1 1 1
1 1 1
1 1 1
1 1 1
1 1 1

E:\mycfile>

第二版修正, 通过else避免交叉重叠,程序功能正确但是太繁琐

# include<stdio.h>
// # include<math.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 if(c <= b && b <= a) 
	else
		printf("%d %d %d\n", c, b, a);
	
	return 0;
}
E:\mycfile>gcc a.c

E:\mycfile>a
1
1
1
1 1 1

E:\mycfile>
  1. 冒泡排序(聪明)
# include<stdio.h>
// # include<math.h>
int main()
{
	int a, b, c, 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 (b > c) {t = b; b = c; c = t;}
	printf("%d %d %d\n", a, b, c);
	return 0;
}
E:\mycfile>gcc a.c

E:\mycfile>a
1
1
1
1 1 1

E:\mycfile>a
4
5
9
4 5 9

E:\mycfile>

这里的顺序不可以换,否则就不是冒泡排序了,结果也不对

花括号把一些语句组成按顺序执行的整体

# include<stdio.h>
// # include<math.h>
int main()
{
	int a, b, c, t;
	scanf("%d%d%d",&a ,&b, &c);
	if (a > b) {t = a; a = b; b = t;} 
	if (b > c) {t = b; b = c; c = t;}
	if (a > c) {t = a; a = c; c = t;}
	
	printf("%d %d %d\n", a, b, c);
	return 0;
}
E:\mycfile>a
5
7
1
5 1 7

E:\mycfile>
  1. 求最大值和最小值(聪明),不排序
# include<stdio.h>
// # include<math.h>
int main()
{
	int a, b, c, x, y, z;
	scanf("%d%d%d",&a ,&b, &c);
	x = a; if (x > b) x = b; if (x > c) x = c; // minimum
	y = a; if (y < b) y = b; if (y < c) y = c; // maximum
	z = a + b + c - x - y;
	printf("%d %d %d\n", x, z, y);
	return 0;
}
E:\mycfile>gcc a.c

E:\mycfile>a
4
5
8
4 5 8

E:\mycfile>a
5
7
1
1 5 7

funny try

  1. 数据类型
    在这里插入图片描述
# include<stdio.h>
# include<math.h>
int main()
{
	printf("%d\n", 11111*11111); // 5个1
	printf("%d\n", 111111*111111); // 6个1 
	printf("%d\n", 111111111*111111111); // 9个1
	printf("%d\n", 11111.0*11111.0); // 5个1
	printf("%d\n", 1111111.0*1111111.0); // 7个1 
	printf("%d\n", 111111111.0*111111111.0); // 9个1
	printf("%d\n", sqrt(-10));
	printf("%lf\n", 1.0/0.0);
	printf("%lf\n", 0.0/0.0);
	printf("%d\n", 1/0);
	return 0;
}

计算结果太大,上溢警告,不知道为什么会输出这俩值,重复执行输出结果还不变

对负数开方得到0

只有1/0 被警告了且不输出结果,其他两个有输出,但结果都很奇怪

E:\mycfile>gcc a.c
a.c: In function 'main':
a.c:6:23: warning: integer overflow in expression [-Woverflow]
  printf("%d\n", 111111*111111); // 6涓?
                       ^
a.c:7:26: warning: integer overflow in expression [-Woverflow]
  printf("%d\n", 111111111*111111111); // 9涓?
                          ^
a.c:14:18: warning: division by zero [-Wdiv-by-zero]
  printf("%d\n", 1/0);
                  ^
E:\mycfile>a
123454321
-539247567
1653732529
-1006632960
1991970816
826866264
0
1.#INF00
-1.#IND00

E:\mycfile>a
123454321
-539247567
1653732529
-1006632960
1991970816
826866264
0
1.#INF00
-1.#IND00

  1. scanf
    整数用浮点数格式输出则输出0
    如果输入格式是%d, 但是输入浮点数则程序立即终止(不让继续输入别的变量的值),但输入的浮点数会被转换为整数存起来
# include<stdio.h>
# include<math.h>
int main()
{
	int a, b;
	scanf("%d%d", &a, &b);
	printf("%lf %lf\n", a, b);
	printf("%d %d\n", a, b);
	return 0;
}
E:\mycfile>gcc a.c

E:\mycfile>a
5
8
0.000000 0.000000
5 8

E:\mycfile>a
4.2
0.000000 0.000000
4 8

E:\mycfile>

在这里插入图片描述
空格分隔可以的

加入空格或者tab也没关系,scanf会过滤空格,tab和回车

但是换成字母后,%d输出的始终是8,两个字母就输出 3和8,不明白

命令行执行a.exe时候,可以输入A, 就像path 和PATH都是系统环境变量的路径一样, 命令行不区别大小写

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

E:\mycfile>a
12 2
12 2

E:\mycfile>a
12
2
12 2

E:\mycfile>a
  12   2
12 2

E:\mycfile>A
        12              2
12 2


E:\mycfile>a
s f
3 8

E:\mycfile>a
12  s
12 8

E:\mycfile>a
12 f
12 8

E:\mycfile>a
12 a
12 8

E:\mycfile>A
a
3 8

E:\mycfile>a
d
3 8

E:\mycfile>a
g
3 8

E:\mycfile>a
12     s
12 8

E:\mycfile>a
        23 s
23 8

在这里插入图片描述

# include<stdio.h>
int main()
{
	printf("%d\n\n\n %d\n", 1+2, 3+4); // 空格会输出
	printf("%s\n", "\\n"); // 输出\n
	printf("%d\n\n\n%d\n", 1+2, 3+4); // 空两行得三个\n
	printf("\\n \n"); // 输出\n
	printf("%s\n", "%d") ; // 输出 %d
	printf("%s\n", "\n"); // 无法输出\n,就算当字符串输出也必须加转义符号\
	
	return 0;
}
E:\mycfile>gcc a.c

E:\mycfile>a
3


 7
\n
3


7
\n
%d

考验

在这里插入图片描述

# include<stdio.h>
# include<math.h>
int main()
{
	int a=0, b=0, c=1, d=0, x=10, y=20;
	if(a&&b||c) printf("1 "); // a&&b||c  1
	if((a&&b)||c) printf("2 "); // (a&&b)||c  1
	if(a&&(b||c)) printf("3 "); // a&&(b||c) 0
	// 说明a&&b||c 和 (a&&b)||c一样
	printf("\n\n");
	
	printf("%d\n", (int)pow(2,30)); // pow()函数的运算结果是浮点数
	printf("%d\n", (int)pow(2,31));
	printf("%d\n", (int)pow(2,32)); 
	printf("%d\n", (int)pow(2,40)); 
	// 说明int最大整数 2147483647,最小 -2147483648,且int用32位内存
	printf("\n\n");
	
	const double pi = 4.0 * atan(1.0);
	printf("%.14lf\n", pi);
	printf("%.16lf\n", pi); 
	printf("%.29lf\n", pi); // 说明最多16位小数
	printf("\n\n");
	
	printf("%lf\n", pow(2,56));  // double数据类型%lf默认输出小数点后6位
	printf("%lf\n", pow(2,56)+1.0); // 说明double最大整数是72057594037927936.000000
	printf("%lf\n", pow(2,57)); // 从这里开始出现错误计算结果,2的次幂的尾数只可能是2,4,6,8,说明double用56位存整数部分,用7位存小数
	printf("%lf\n", pow(2,58));
	printf("\n\n");
	
	if(c)
		if(d)
		{ // 写matlab代码是不需要用花括号括起来的,不括会报错error: 'else' without a previous 'if'
			x++;
			printf("x = %d\n", x);
		}
		else // 当然是针对它上面第一个if了
		{
			y++;
			printf("y = %d\n", y);
		}
	
	return 0;
}
E:\mycfile>gcc a.c

E:\mycfile>a
1 2

1073741824
2147483647
2147483647
2147483647


3.14159265358979
3.1415926535897931
3.14159265358979310000000000000


72057594037927936.000000
72057594037927936.000000
144115188075855870.000000
288230376151711740.000000


y = 21

E:\mycfile>

只要把d改为1就会输出

x = 11

练习

在这里插入图片描述
扫一眼觉得这练习太简单了,实际做起来虽然也没多难,但反正需要修改一点的,不是一遍过

c语言的强制类型转换和python,matlab很不一样,刚开始挺容易错的,我会写 double(需要转换的内容)

# include<stdio.h>
//# include<math.h>
int main()
{
	int a, b, c;
	double d;
	scanf("%d%d%d", &a, &b, &c);
	d = (double)((a+b+c)/3);
	printf("%.3lf", d);
	
	return 0;
}
# include<stdio.h>
//# include<math.h>
int main()
{
	
	double c, f;
	scanf("%lf", &f);
	c = 5.0*(f-32.0)/9.0;
	//c = 5*(f-32)/9; // 也对
	printf("%.3lf", c);
	
	return 0;
}
 # include<stdio.h>
//# include<math.h>
int main()
{
	
	int n;
	scanf("%d", &n);
	printf("%d", n*(n-1)/2);
	
	return 0;
}
# include<stdio.h>
# include<math.h>
int main()
{
	
	double n; // 度数,n<360
	const double pi = 4.0 * atan(1.0);
	scanf("%lf", &n);
	if(n > 0.0 && n < 360.0)
	
	{
		printf("sin = %lf\n", sin(n/180*pi)); // 转换为弧度制,易错
		printf("cos = %lf\n", cos(n/180*pi));
	}
	else 
		printf("invalid input");
	
	return 0;
}
# include<stdio.h>
# include<math.h>
int main()
{
	
	double x1, y1, x2, y2, d;
	scanf("%lf%lf%lf%lf",&x1, &y1, &x2, &y2);
	d = sqrt(pow(x1-x2,2) + pow(y1-y2,2));
	printf("d = %lf", d);
	return 0;
}

在这里插入图片描述

# include<stdio.h>
//# include<math.h>
int main()
{
	
	int a;
	scanf("%d",&a); 
	if(a%2 == 0) printf("yes\n"); // 被2整除
	else printf("no\n");
	
	if(a%10%2 == 0) printf("yes\n"); // 个位数是偶数则为偶数
	else printf("no\n");
	
	if(a*a%2 != 1) printf("yes\n"); // 奇数的平方是奇数
	else printf("no\n");
	return 0;
}
# include<stdio.h>
//# include<math.h>
int main()
{
	
	int a, b=95;
	scanf("%d",&a); 
	if(a*b >= 300) printf("%.2lf\n", a*b*.85); 
	else printf("%.2lf\n", (double)a*b);
	
	
	return 0;
}
# include<stdio.h>
# include<math.h>
int main()
{
	double a;
	scanf("%lf",&a); 
	printf("%.2lf\n", fabs(a)); // abs函数求整数的绝对值,fabs求浮点数,float或double
	
	return 0;
}
# include<stdio.h>
//# include<math.h>
int main()
{
	int a, b, c;
	scanf("%d%d%d",&a, &b, &c);
    //排序	
	if(a > b) a = b; 
	if(a > c) a = c;
	if(b > c) b = c;
	if(a+b <= c || b-a >= c) printf("not a triangle\n");// 不是三角形
	else if(a*a+b*b == c*c) printf("yes\n");
	else printf("no");
	
	return 0;
}
E:\mycfile>gcc a.c

E:\mycfile>a
3 4 5
yes

E:\mycfile>a
6 6 6
no

E:\mycfile>a
1 2 3
not a triangle

在这里插入图片描述在这里插入图片描述

# include<stdio.h>
//# include<math.h>
int main()
{
	int a;
	scanf("%d", &a);
	if((a%4==0 && a%100!=0) || a%400==0) //leap year
		printf("yes");
	else 
		printf("no");
	
	
	return 0;
}
E:\mycfile>a
2004
yes
E:\mycfile>a
2000
yes
E:\mycfile>a
2019
no
E:\mycfile>

end of today

最简单的第一章,所有代码敲一遍总共也还是花了6个小时左右,希望以后可以每天半章,一个月内完成这本书的学习,加油
所有代码用记事本编辑,命令行编译执行;
只管输入计算输出,不做任何多余的事,感觉很棒;
代码的盲打还不太熟练
主要是学习了数据类型方面的知识
对顺序结构分支结构理解深刻一些了
逻辑表达式,算数表达式,逻辑运算符,短路运算符
解决问题第一,先打内功再去花里胡哨,或者永不花里胡哨···
const scanf printf

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值