# include <stdio.h>
int main ()
{
return 0;
}
变量定义
标识符:字母,数字,下划线(例如:price)
初始化
常量 const int AMOUNT = 100;
数据类型
两个整数的运算只能是整数
浮点数 double 输入%lf 输出%f
整数计算没有误差
表达式
运算符 + - =
算子 5 a i
运算符存在优先级
复合赋值
关系运算结果成立则为1,否则为0
关系运算符
== 相等
!= 不相等
> 大于
>= 大于或等于
< 小于
<= 小于或等于
注意其中有两个字符的运算符:==、>=和<=的两个字符必须紧紧连在一起,中间不能插入空格。
关系运算存在优先级:判断是否相等的 == 和 != 的优先级更低
运算关系:从左到右
关系运算结果成立则为1,否则为0
example:printf(" %d", 7 >= 3+4);
total += sum == total + sum
a++ == a + 1
a++作为表达式结果为a
++a 作为表达式结果为a+1
套路
交换变量
判断
if ( ){
}else {
}
if (score < 60 )
printf(" not pass);
else
printf(" pass ");
注释(comment)
// 初始化
int price = 0;
/* 42 */
循环体内要有打破循环的条件
while ( ){
;
;
}
判断,再执行
do
{
<循环体语句>
}while( );
for 念做 对于
( ; ; )for 中的可以省略
for ( <初始条件> ; <循环继续条件> ; <每轮动作> ){
}
逻辑运算
自左向右,如果左边的结果可以决定结果了, 就不会做右边的计算
结果是0 或 1
运算符 例
! !a
&& a && b
|| a || b
优先级
单目 > 双目
关系 > 逻辑 > 条件 > 赋值
条件运算方向:自右向左
逗号运算for (i=0 ,j=10 ;i<j ;i++,j-- )
if 再探
if (){
}else if ()
{
}else if ()
{
}else {
}
switch ( type ){
case 1:
printf("hello\n");
break;
case 2:
break;
default:
break;
}
循环
break可跳出所在那层循环,而continue则结束这一次循环
// 判断素数
int x = 0;
int i = 2;
int isPrime = 1;
scanf("%d", &x );
for ( i=2 ; i<x ; i++ )
{
if (x % i == 0 ){
isPrime = 0;
break;
}
}
if (isPrime == 1){
printf ("是素数");
}else{
printf("不是素数");
}
return 0;
跳出嵌套循环
goto
// 如何用1角、2角和5角的硬币凑出10元以下的金额
int x = 0;
int one , two , five = 0;
scanf ("%d",&x);
for ( one = 0 ; one <x*10 ; one++){
for ( two = 0 ; two <x*10/2 ; two++){
for ( five = 0 ; five <x*10/5 ; five++){
if (1*one + 2*two + 5*five == x*10 ){
printf("%d个一角和%d个两角和%d个五角可以合成%d元\n",one ,two , five , x);
goto out;
}
}
}
}
out :
return 0;
接力break
// 如何用1角、2角和5角的硬币凑出10元以下的金额
int x = 0;
int one , two , five = 0;
int exit = 0;
scanf ("%d",&x);
for ( one = 0 ; one <x*10 ; one++){
for ( two = 0 ; two <x*10/2 ; two++){
for ( five = 0 ; five <x*10/5 ; five++){
if (1*one + 2*two + 5*five == x*10 ){
printf("%d个一角和%d个两角和%d个五角可以合成%d元\n",one ,two , five , x);
exit = 1;
break;
}
}
if (exit == 1) break;
}
if (exit == 1) break;
}
return 0;
素数判断
int x = 0;
int i = 2;
int isPrime = 1;
scanf("%d", &x );
for ( i=2 ; i<x ; i++ )
{
if (x % i == 0 ){
isPrime = 0;
break;
}
}
if (isPrime == 1){
printf ("是素数");
}else{
printf("不是素数");
}
return 0;
// 整数的正分解
int x = 0;
int mask = 1;
int t = 0;
scanf ("%d", &x);
t = x;
while ( t>9 ){
t /= 10;
mask *= 10;
}
do{
printf ("%d", x/mask);
if ( mask>9 ){
printf(" ");
}
x %= mask;
mask /= 10;
}while( mask>0 );
return 0;
// 给定不超过6的正整数A,考虑从A开始的连续4个数字。请输出所有由它们组成的无重复数字的3位数
int x = 0;
int i,j,k;
int cnt = 0;
scanf("%d",&x);
for ( i=x ; i<=x+3 ; i++ ){
for ( j=x ; j<=x+3 ; j++){
for ( k=x ; k<=x+3 ; k++){
if (i!=j && j!=k && i!=k){
printf("%d%d%d",i,j,k);
cnt++;
if (cnt == 6){
printf("\n");
cnt = 0;
}else{
printf(" ");
}
}
}
}
}
return 0;
水仙花数
// 水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153),
int n = 3;
scanf ("%d",&n);
int mask = 1;
int t = n;
while(t>1){
t--;
mask *= 10;
}
// printf("%d",mask);
int i = mask;
for (i ;i<mask*10;i++){
// 先令t=i,d=mask
// 再分解t,求幂
// 求和
t=i;
int d=mask;
int sum = 0;
while(t>0){
int p = t/d;
int j = 1;
int k = p;
while (j<n){
k *= p;
j++;
}
sum += k;
t = t%d;
d /=10;
}
if (sum == i){
printf ("%d\n",i);
}
}
return 0;
九九乘法表
int i,j = 1;
// 记每行为i*j,第一行j=1,第二行j=2
// 而每一行i递增到j
for (j=1;j<10;j++){
for (i=1;i<=j ;i++){
printf ("%d*%d=%d",i,j,i*j);
if (i*j<10){
printf (" ");
}else {
printf (" ");
}
}
printf("\n");
}
return 0;
统计素数并求和
// 遍历m~n的数
// 判断素数,cnt ++
// printf
// sum
int m,n = 0;
scanf ("%d %d",&m,&n);
int i = 1;
int cnt = 0;
int sum = 0;
// m = 10;n = 31;
if (m ==1){
m = 2;
} //考虑 m=1 的特殊情况
for ( i=m ; i<=n ; i++ ){
int j = 1;
int isPrime = 1;
for ( j=2 ; j<i ; j++){
if ( i%j == 0){
isPrime = 0;
break;
}
}
if ( isPrime == 1){
cnt ++;
sum += i;
// printf("%d\n",i);
}
}
printf ("%d %d",cnt,sum);
return 0;
猜数游戏(mine)
// 统计cnt,scanf n
// for 循环 n 次,猜中就break
// 判断正负,if
int x=12,n=2;
scanf ("%d %d",&x,&n);
int cnt = 0;
int a = 0;
do{
scanf ("%d",&a);
cnt ++;
if ( a<0 ) {
cnt = n+1;
break;
}
if ( a == x ){
break;
}else if ( a>x){
printf ("Too big\n");
}else {
printf ("Too small\n");
}
}while ( a!=x && cnt <n );
if ( cnt == 1){
printf ("Bingo!\n");
}else if ( cnt<=3 ){
printf ("Lucky You!\n");
}else if ( cnt<=n ){
printf ("Good Guess!");
}else {
printf ("Game Over");
}
// printf ("%d\n",cnt);
数据类型
C语言的类型
整数; char ;short ;int ; long ;long long
逻辑: bool
浮点数;float ; double ; long double
指针
//个人认为还有 字符
类型名称:int ,long ,double
输入输出时的格式化:%d %ld %lf
表达数的范围:char < short < int < float < double
内存中占据字节的大小:1各字节到16个字节
内存中的表达形式:二进制数(补码)、编码
sizeof
是判断数据类型或者表达式长度的运算符
例:int 为4个字节
sizeof(int) = 4
整数的内部表达
补码的认识
如果不以补码的形式,需加上 unsigned
例:unsigned char c = 255;
整数越界
# include <stdio.h>
int main ()
{
char c = 127;
c = c+1;
printf("c=%d",c);
return 0;
}
输出结果:c=-128
整数的输入输出
整数的输入输出
%d : int
%u : unsigned
%ld : long long
%lu : unsigned long long
8进制和16进制
- 一个以0开始的数字字面量是8进制
- 一个以0x(0X)开始的数字字面量是16进制
- %o用于8进制,%x用于16进制
代码试验
char c = 012;
int i = 0x12;
printf ("c=%d,i=%d",c,i);
return 0;
{
c=10,i=18 //输出结果
}
char c = 012;
int i = 0x1a;
printf ("c=%d,i=%d",c,i);
return 0;
{
c=10,i=26 //输出结果
}
char c = 012;
int i = 0x12;
printf ("c=%o,i=%x",c,i);
return 0;
{
c=12,i=12 //输出结果
}
char c = 012;
int i = 0x1a;
printf ("c=%o,i=%x\n",c,i);
i = 0X1a;
printf ("c=%o,i=%X",c,i);
return 0;
{
c=12,i=1a
c=12,i=1A //输出结果
}
浮点类型
- float 有效数字 7
- double 有效数字 15
浮点的输入与输出
类型 | scanf | printf |
float | %f | %f,%e(E) |
double | %lf | %f,%e(E) |
浮点的输入与输出(例子)
double ff = 1234.56789;
printf ("%f\n%e\n%E\n",ff,ff,ff);
ff = 1e-10; // 中间不能有空格
printf ("%f\n%e\n%E\n",ff,ff,ff);
printf ("%.16f\n",ff);
return 0;
{
1234.567890
1.234568e+003
1.234568E+003
0.000000
1.000000e-010
1.000000E-010
0.0000000001000000 //输出
}
输出精度
- 在%和f之间加上.n可以指定输出小数点后几位,这样的输出是做4舍5入的
- printf ("%.3f\n",-0.0049);
- printf("%.30f\n",-0.0049);
- printf("%.3f\n",-0.00049);
输出精度(实例)
printf ("%.3f\n",-0.0049);
printf("%.30f\n",-0.0049);
printf("%.3f\n",-0.00049);
printf ("%.3f\n",-0.0045); //此处我还未理解为啥结果不是-0.005
return 0;
{
-0.005
-0.004899999999999999800000000000
-0.000
-0.004 // 输出
}
浮点运算的精度
float a,b,c ;
a = 1.345f;
b = 1.123f;
c = a + b ;
if (c == 2.468)
printf ("相等\n");
else
printf ("不相等! c=%.10f,或%f\n",c,c);
{
不相等! c=2.4679999352,或2.468000 //输出
}
- 带小数点的字面量是double而非float
- float需要用f或F后缀来表明身份
- f1 == f2可能失败
- fabs(f1-f2) < 1e-12 //判断浮点数相等的方法,fabs表示取绝对值
字符(character)
- char是一种整数,也是一种特殊的类型:字符。这是因为:
- 用单引号表示的字符字面量:'a' , '1'
- ''也是一个字符 //中间无空格
- printf和scanf里用%c来输入输出字符
char x = 49;
char c = '1';
int i = 49;
scanf ("%c",&c);
scanf ("%d",&i);
x = i;
printf ("%c\n",x);
'1'的ASCII编码是49,所以c==49时,它代表'1'
字符计算
字符计算实例
char c = 'A';
c++;
printf ("%c\n",c) ;
int i = 'Z'-'A';
printf ("%d\n",i);
{
B
25 //输出
}
- 一个字符加一个数字得到ASCII码表中那个数之后的字符
- 两个字符的减,得到它们在表中的距离
大小写转换
- 字母在ASCII表中是顺序排列的
- 大写字母和小写字母是分开排列的,并不在一起
- 'a'-'A'可以得到两段之间的距离,于是
- 'X'+'a'-'A'可以把一个大写字母变成小写字母,而
- 'x'+'A'-'a'可以把一个小写字母变成大写字母
逃逸字符
- 用来表达无法印出来的控制字符或特殊字符
,它由一个反斜杠“\”开头,后面跟上另一
个字符,这两个字符合起来,组成了一个字符
printf ("请分别输入身高的英尺和英寸,如输入\"5 7\"表示5英尺7英寸");
字符 | 意义 | 字符 | 意义 |
\b | 回退一格 | \" | 双引号 |
\t | 到下一个表格位 | \' | 单引号 |
\n | 换行 | \\ | 反斜杠本身 |
\r | 回车 |
自动类型转换
- 当运算符的两边出现不一致的类型时,会自动转换成较大的类型
- 大的意思是能表达的述的范围更大 //例如 整数会转换为浮点,int会转换为double
- char -> short -> int -> long -> long long
- int -> float -> double
- 对于printf,任何小于int的类型会被转换成int;float会被转换成double
- 但是scanf不会,要输入short,需要%hd
强制类型转换
- 要把一个量强制转换成另一个类型(通常是较小的类型),需要:
- (类型)值
- 比如:
- (int)10.2
- (short)32
- 注意这时候的安全性,小的变量不总能表达大的量
- (short)32768
只是从那个变量计算出了一个新的类型的值,它并不改变那个变量,无论是值还是类型都不改变
- 强制类型转换的优先级高于四则运算
强制类型转换实例
double a = 1.0;
double b = 2.0;
int i = (int)a/b;
printf ("%d\n",i);
{
0 //输出
}
bool
- #include<stdbool.h>
- 之后就可以使用bool和true、false
bool实例
# include <stdio.h>
# include <stdbool.h>
int main ()
{
bool t = true ;
bool b = true ;
t = false;
printf ("%d %d",b,t);
return 0;
}
{
1 0 // 输出
}
逻辑运算
- 逻辑运算的结果只有0或1
- 逻辑量是关系运算或逻辑运算的结果
运算符 | 描述 | 示例 | 结果 |
! | 逻辑非 | !a | 如果a是true结果就是false(0),如果a是false结果就是true(1) |
&& | 逻辑与 | a && b | 如果a和b都是true,结果就是true;否则就是false |
|| | 逻辑或 | a || b | 如果a和b有一个是true,结果为true;两个都是false,结果为false |
例 : 表达数学中 4<x<6
x>4 && x<6
问题:如何理解!age<20
单目运算符的优先级 高于 双目运算符,所以先对!age运算结果是0或1,再判断<20,所以必然成立,故结果为1(true)
优先级
! > && > ||
- 例题:理解 !done && (count >MAX)
优先级 | 运算符 | 结合性 |
1 | () | 从左到右 |
2 | ! 、+ 、- 、++、 -- | 从右到左(单目的+和-特殊) |
3 | * 、/ 、% | 从左到右 |
4 | +、 - | 从左到右 |
5 | <、<=、 >、 >= | 从左到右 |
6 | ==、 != | 从左到右 |
7 | && | 从左到右 |
8 | || | 从左到右 |
9 | = 、+=、 -=、 *= 、/= 、%= | 从右到左 |
短路
不要把赋值,包括复合赋值组合进表达式!
- 逻辑运算是自左向右进行的,如果左边的结果已经能够决定结果了,就不会做右边的计算
- a==6 && b==1
- a==6 && b+=1
- 对于&&,左边是false时就不做右边了
- 对于||,左边是true时就不做右边了
条件运算符
count = (count>20)?count - 10:count+10;
- 条件、条件满足时的值和条件不满足时的值
- 条件运算符的优先级高于赋值运算符,但是低于其它运算符
- 条件运算符是自右向左结合的
- x ? y : z;
逗号运算
- 逗号用来连接两个表达式,并以其右边的表达式的值作为它的结果。
- 逗号的优先级是所有的运算符中最低的,所以它两边的表达式会先计算
- 逗号的组合关系是自左向右,所以左边的表达式会先计算,而右边的表达式的值就留下来作为逗号运算的结果
- for (i=0,j =10 ; i<j ; i++,j--)
函数
- “代码复制”是程序质量不良的表现
调用函数
- 函数名(参数值);
- ()起到了表示函数调用的重要作用
- 即使没有参数也需要()
- 如果有参数,则需要给出正确的数量和顺序
- 这些值会被按照顺序依次用来初始化函数中的参数
从函数中返回值
- return停止函数的执行,并送回一个值
- return;
return 表达式;
- 一个函数里可以出现多个return语句
返回值
- 可以赋值给变量
- 可以再传递给函数
- 甚至可以丢弃
- 有的时候要的是副作用
没有返回值的函数
- void函数名(参数表)
- 不能使用带值的return
- 可以没有return
- 调用的时候不能做返回值的赋值
- 如果函数有返回值,则必须使用带值的return
标签:10,return,int,scanf,C语言,运算符,printf,进程,翁恺 From: https://www.cnblogs.com/alien-han/p/16548645.html