涉及到的知识点有:程序的三种结构、条件分支语句、循环语句、求自然数的和、
求到之间所有的水仙花数、在屏幕输出一个等腰三角形、循环语句案例-窗口移动
例如:
#defineMAX说明定义的MAX是一个有符号的int
constlonga=u;说明定义的a是一个无符号的long
"a"字符串常量相当于a\0
a字符常量,字符常量只能是一个ASCII字符
int4个BYTE、2个WORD、1个DWORD
c语言中不能直接书写二进制,用8进制和16进制来替代(和默认的十进制)。
inta=;
intb=sizeof(a);
sizeof关键字作用是:得到某一数据类型在内存中占用的大小(内存大小没有负的),单位是:字节
sizeof不是函数,所以不需要包含任何头文件
其实呢,sizeof返回值的类型是size_t,size_t类型在32位操作系统下是一个无符号的整数。
在32位系统下,sizeof返回值是unsignedint,用%u;在64位系统下,unsignedlong,用%lu。
例如:
在32位系统下:
inta=;
printf("%u\n",sizeof(a));
在64位系统下:
inta=;
printf("%lu\n",sizeof(a));
-----------------------------------------------------------------------------
inta;等同于signedinta;
unsignedinta;
long在32位系统下是4个BYTE,在64位系统下是多少?windows是4个字节,linux是8个字节。
f等同于.0
-----------------------------------------------------------------------------
inta=a;//a=97,是可以存放的
chara=;//是不可以存放的,溢出了,最大放
2和2的区别在哪里?
2是字符2dASCII
2是整数2
""和区别在哪里?
100\0
是一个int型整数常量
-----------------------------------------------------------------------------
inta=a;//错误的写法!
chara=97;
printf("%d\n",a);//输出结果是97
printf("%c\n",a);//输出结果是字符a
abc
bcd(这里其实是回车+换行)
abc
bcd(只有换行,没有回车)
bcd(abc是被bcd重叠了,这叫回车)
回车键的由来:
键盘:
--------------------------------------------------打印头
------------------------
--
-回车键-
--
------------------------
在打字机上按回车键,打印头就会复位
=============================================================================
程序的三种结构:
1,顺序结构
2,分支结构
3,循环结构
=============================================================================
条件分支语句:
1、关系运算符:在c语言中0代表false,非0代表真。
关系运算符有:(小于)、(大于)、=(小于等于)、=(大于等于)、==(等于)、!=(不等于)
-----------------------------------------------------------------
-----------------------------
前四种优先级相同大于后两种优先级相同
0假
1真
34真
-34 真,非0就是真
条件运算符:(条件)?值1:值2
当条件成立时,表达式的值为1;当条件不成立时,表达式的值为2。
很多时候用问号来替代简单的if语句。
例如:求绝对值的例子
inti=-8;
intx=(i0)?-i:i;
-----------------------------------------------------------------------------
2、逻辑运算符:(逻辑与/and)、
(逻辑或/or)、!(逻辑非/not)
-----------------------------------------
---------------------
双目运算符(两边必须要有表达式叫双目)单目运算符
-----------------------------------------------------------------------------
3、1)单分支语句
if是条件分支语句:如果条件为真,则执行代码块中的代码。
if(条件)
{
代码块;
}
-----------------------------------------------------------------------------
2)双分支语句
ifelse是双分支语句:
if(条件)
{
代码块1;
}
else
{
代码块2;
}
-----------------------------------------------------------------------------
3)多重分支语句(多重if):else总是跟上面最近那个if配对(特别注意)
if(条件1)
{
代码块1;
}
elseif(条件2)
{
代码块2;
}
elseif(条件3)
{
代码块3;
}
else
{
代码块3;
}
例子如下:四则运算
#include
intmain()
{
inta;
intb;
charc;
printf("pleaseinputa:");
scanf("%d",a);
printf("pleaseinputb:");
scanf("%d",b);
printf("pleaseinputc:");
getchar();//把调用scanf时候用户输入的回车键吃掉
c=getchar();
//printf("a=%d,b=%d,c=%c\n",a,b,c);//打印结果测试下
if(c==+)
{
printf("%d\n",a+b);
}
elseif(c==-)
{
printf("%d\n",a-b);
}
elseif(c==*)
{
printf("%d\n",a*b);
}
elseif(c==/)
{
if(b!=0)
printf("%f\n",(double)a/b);
else
printf("error\n");
}
else
{
printf("inputerror\n");
}
return0;
}
-----------------------------------------------------------------------------
4)多重分支语句(多重选择:switch与break,default)
switch(量)
{
case值1:
语句1;
break;
case值2:
语句2;
break;
case值n:
语句n;
break;
default:
语句;//当所有case都不满足时,执行default下面的语句。
}
例子如下:四则运算
#include
intmain()
{
inta;
intb;
charc;
printf("pleaseinputa:");
scanf("%d",a);
printf("pleaseinputb:");
scanf("%d",b);
printf("pleaseinputc:");
getchar();//把调用scanf时候用户输入的回车键吃掉
c=getchar();
//printf("a=%d,b=%d,c=%c\n",a,b,c);//打印结果测试下
switch(c)
{
case+:
printf("%d\n",a+b);
break;
case-:
printf("%d\n",a-b);
break;
case*:
printf("%d\n",a*b);
break;
case/:
if(b!=0)
printf("%f\n",(double)a/b);
else
printf("error\n");
break;
default:
printf("inputerror\n");
}
return0;
}
注意:当条件特别复杂时用if;当条件简单,但分支很多时用switch。
-----------------------------------------------------------------------------
if、switch与?(问号)都是有条件分支语句;
无条件分支语句:goto
gotoend;//无条件跳转到标号end去执行代码
end://标号
但是不提倡大量使用goto,除非使用goto能大大简化代码量。
=============================================================================
循环语句:
while(条件)
{
代码块;
}
-----------------------------------------------------------------------------
continue语句
当循环遇到continue语句时,不再执行continue下面代码,而是直接返回到循环起始语句处继续执行循环。
(即当循环遇到continue时,就直接返回到开始重新判断条件的地方去了)
-----------------------------------------------------------------------------
break语句
当循环遇到break语句时,立刻终止循环,循环结束。
-----------------------------------------------------------------------------
dowhile
do
{
语句;
}while(条件);
-----------------------------------------------------------------------------
while是先判断条件,再决定是否循环
dowhile先循环,然后再判断条件
while可能一次都不循环,但是dowhile至少能循环一次。
注意:
while(a!=10);//该句话相当于while(a!=10)
{
;
}
相当于死循环,什么都没有干。
=============================================================================
小练习:求自然数的和。
用户可以任意输入一个正整数,求从1到这个整数之间所有自然数的和。
例如:输入5
1+2+3+4+5=15
代码如下:
#include
#pragmawarning(disable:)
intmain()
{
intsum=0;//用来保存计算自然数之和的变量
inta=10;
scanf("%d",a);
while(a0)
{
sum+=a;
a--;
}
printf("%d\n",sum);
return0;
}
-----------------------------------------------------------------------------
任意输入一个整数,假设用户输入了,程序运行输出百
如果用户输入了,程序输出千
如果用户输入了00,输出万
代码如下:
#include
#pragmawarning(disable:)
intmain()
{
inta=0;
scanf("%d",a);
intsum=0;//sum是一个计数器
while(a0)//c语言中%是取余运算,/是取整运算
{
sum++;
a/=10;
}
switch(sum)
{
case1:
printf("个\n");
break;
case2:
printf("十\n");
break;
case3:
printf("百\n");
break;
}
return0;
}
-----------------------------------------------------------------------------
小练习:求到之间所有的水仙花数。
水仙花数是什么?
一个数的百位的立方+十位的立方+个位的立方=这个数本身
例如:就是一个水仙花数
3*3*3+7*7*7+1*1*1=
代码如下:
#include
intmain()
{
inta;
for(a=;a0;a++)
{
inta1;//百位
inta2;//十位
inta3;//个位
a1=a/%10;//a/=5;5%10=5注意:/和%的优先级一样,则结合性从左到右
a2=a/10%10;//a/10=53;53%10=3
a3=a/1%10;//a/1=;%10=7
if((a1*a1*a1+a2*a2*a2+a3*a3*a3)==a)
printf("%d\n",a);
}
return0;
}
-----------------------------------------------------------------------------
九九乘法表
VS下的代码如下:
#include
intmain()
{
inta;
intb;
for(a=1;a10;a++)//外循环,控制行,即外循环决定有多少行
{
for(b=1;b=a;b++)//内循环,控制列,即内循环决定每一行有几个列,外循环每循环一次,内循环循环4次
{
printf("%d\t",a*b);
}
printf("\n");
}
return0;
}
-----------------------------------------------------------------------------
在屏幕输出一个等腰三角形
-------*-------
------***------
-----*****-----
----*******----
---*********---
--***********--
-*************-
不能用printf一行一行打印输出等腰三角形
printf("*\n");
printf("***\n");
printf("*****\n");
分析:
每一行的*和行号的关系是:行号*2-1
每一行的*和减号的关系是:行号-1;行号-2;行号-3;......;行号-行号
代码如下:
#include
#pragmawarning(disable:)
intmain()
{
inta;
intb;
intnum=0;
scanf("%d",num);
for(a=1;a=num;a++)//外循环,控制行,即外循环决定有多少行
{
for(b=0;bnum-a;b++)
{
printf("-");
}
for(b=0;ba*2-1;b++)//内循环,控制列,即内循环决定每一行有几个,外循环每循环一次,内循环循环num次
{
printf("*");
}
for(b=0;bnum-a;b++)
{
printf("-");
}
printf("\n");
}
return0;
}
=============================================================================
循环语句案例-窗口移动
代码如下:
#includestdio.h
#includeWindows.h//使用窗口移动,需要利用API函数,则需要包含一个头文件
intmain()
{
intx=;
inty=;
intstatus=0;//0代表从左往右跑,1代表从右往左跑。
intstatus1=0;//0代表从上往下跑,1代表从下往上跑。
intstatus2=1;//0代表x轴不动,1代表y轴不动
while(1)
{
SetWindowPos((HWND)0x,NULL,x,y,,,0);//这个函数可改变一个窗口的位置和大小
if(status==0status2==1)
x+=10;
if(x=0)
{
status1=0;
status2=0;
}
if(status1==0status2==0)
y+=10;
if(y=)
{
status=1;
status2=1;
}
if(status==1status2==1)
x-=10;
if(x=)
{
status1=1;
status2=0;
}
if(status1==1status2==0)
y-=10;
if(y=)
{
status=0;
status2=1;
}
//if(status==0status2==1)
//x+=10;
Sleep(20);//Sleep函数的功能是程序休眠,参数单位是毫秒,0ms代表1秒
}
/*
该函数的参数解释如下:
第一个参数:是窗口的句柄。句柄:是windows的一个概念,即所有的窗口都有一个唯一的编号,这个编号叫句柄。(注意句柄是16进制的)
如何得到某一个窗口的句柄呢?在vs的/工具选项/Spy++(间谍的意思)/查找窗口/查找程序工具/拖动到对应的窗口
第二个参数:默认写NULL。
第三个参数:是窗口位置的x坐标。
第四个参数:是窗口位置的y坐标。
第五个参数:是窗口宽度。
第六个参数:是窗口高度。
第七个参数:默认写0。
(0,0)左上角
------------------------------x轴
y轴
*/
return0;
}
或者代码这样:
#include
intmain()
{
intx=-10,y=0;
intstatus=0;//0代表从左往右,1代表从上往下,2代表从右往左,3代表从下往上
while(1)
{
if(x==0y==10)
status=0;
if(x==0y==10)
status=1;
if(x==0y==)
status=2;
if(x==0y==)
status=3;
if(status==0)
x+=10;
if(status==1)
y+=10;
if(status==2)
x-=10;
if(status==3)
y-=10;
SetWindowPos((HWND)0x0016C,NULL,x,y,,,0);
Sleep(20);
}
return0;
}