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>
交换变量
- 经典三变量法
# 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>
- 不用中间变量的高级方法(反而不推荐)
# 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>
- 解决问题就行
# 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
# 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>
- 冒泡排序(聪明)
# 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>
- 求最大值和最小值(聪明),不排序
# 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
- 数据类型
# 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
- 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