输入字符类型的判断
#include <stdio.h>
int main(int argc,char *argv[]){
int a,b,c,yes;printf("请输入两个数字(以空格空开)\n");
yes=scanf("%d %d",&a,&b);
if(yes!=2) //判断数据输入的正确性,输入错误进入下一步{
while((yes=getchar())!='\n'); //一次一个的吧 yes里面的内容提出 (清空),不然 yes里面会一直有值printf("格式错误,重新输入\n");goto input;}c=a+b;printf("%d+%d=%d\n",a,b,c);return 0;if-else练习
输入一个年份整数,判断是平年还是闰年,能够被4整除的年份是闰年,但其中能够被100整除的却不是闰年,除非它同时能够被400整除,其情况为平年 400
#include<stdio.h>
int main(void)
{
int year,flag;
printf("please input the year:\n");
while(1)
{
flag = scanf("%d",&year);
if(flag == 1 && getchar() == '\n' && year>0)
break;
printf("Sorry!Please try again!\n");
if(year<=0)
continue;
while(getchar() !='\n'); //清缓冲区
}
if(year%4||(year%100==0&&year%400==0))
{
printf("This year is leap year!\n");
}
else
printf("This is not leap year!\n");
return 0;
}
switch -- case 开关(选择语句)
switch(表达式)
{
case 常量表达式1:语句1;
....
case 常量表达式2:语句2;
default:语句;
}
表达式:字符变量,整形变量,枚举变量
运用switch-case 输入的月份及日,计算这为这一年的第几天
一月31天 二月28 29天(平年28 闰年29 ) 三月31天 四月30天 5月31天 6月30天 七月31天 八月31天 九月30 十月31天 十一月30 十二月31天
#include <stdio.h>
int main(void)
{
int day,flag,year,month,a;
printf("please input the year month day:\n");
while(1)
{
flag = scanf("%d %d %d",&year,&month,&day);
if(flag == 3 && getchar() == '\n' )
break;
printf("Sorry!Please try again!\n");
while((flag=getchar() !='\n')); //清缓冲区
}
a=29;
else a=28;
switch(month-1)
{case 11:day+=30;
case 10:day+=31;
case 9:day+=30;
case 8:day+=31;
case 7:day+=31;
case 6:day+=30;
case 5:day+=31;
case 4:day+=30;
case 3:day+=31;
case 2:day+=a;
case 1:day+=31;break;
case 0:day;
}
printf("%d\n",day);
return 0;
}
这道题的重点就是,了解 switch-case 的机制,case如果没有加break,他会进入下一条,直到遇到break;
goto 跳转语句
goto 标签;
标签:
不建议使用,容易破坏栈
常量与变量
变量命名规则:由字母,数字,下划线,变量只能是字母及下划线开始 (变量不能是系统的关键字、return void printf main int char static ) 变量命名跟实际意义相符合 int add_num; int photo_flag常量
十进制常量DEC 100; 0xc == 12
八进制常量OCT 0132 0981(错误:超过了八)
十六进制常量HEX 0x123 (0~f) a b c d e f
浮点常量 1.0 3.15 1e-1 = 1X10^-1
字符: 'x'
字符串"sdfdf" 'x' 'd' 'f' 'd' 'f' '\0'
运算符
算术运算符 + - */ 取整(商) 5/2 = 2 (int形 取整)
% 取余 5%2 = 1
++ 自加 i++ ++i
- - 自减 i- - - -i
最近原则(i在最左边,则先赋值再运算,若+或者-则先运算再赋值)
关系运算 > < >= <=
== 等于 if(i%100=0)错误 if(1 == flag)正确
!= 不等于
逻辑运算
非0即真 1,-1都是真 if(-1)
&& if(表达式&&表达式1) 当表达式与表达式1都为真的情况,条件成立
if((5>2)&&(2>3)) 假
|| if(表达式1||表达式2) 只要一个条件为真,则为真
! if(!表达式)
练习:从键盘输入三个数,比较大小,输出最大的一个
A B C A>B && A>C ==>A
位运算
&(位与) 两个为1为1,否则为0
0x7 & 0x4 = 0x4 0100
0111
& 0100
------------------------------
0100
|(位或) 有1则为1,否则为0
0x7 & 0x4
0111
| 0100
----------------
0111 0x7-->7(DEC)
~r 位取反 0x7 0111 ==1000
^ 位异或 相同为0,不同为1
>>右移 0xa4 右移4
1010 0100
0000 1010
---------------------------------
0 a
<<左移
0xb 0x7
1 0 1 1
^ 0 1 1 1
-------------------------
1 1 0 0 ==> 0xc
x^y^y = x :
0xb 0x7
1 0 1 1
^ 0 1 1 1
-------------------------
1 1 0 0 ==> 0xc
^y 0 1 1 1
---------------------
1 0 1 1 ===x
练习:输入两个值,交换两个值的并输出,不用第三个变量
x=0xb y=0x7
x^y x y
0xb 0x7
1 0 1 1
^ 0 1 1 1
-------------------------
1 1 0 0 ==> new->x
0 1 1 1
--------------------
1 0 1 1 y = x
1 1 0 0 new->x
1 0 1 1
------------------------------
0 1 1 1
y^=x;
x^=y;
其他
,分隔表达式
= 赋值 int i = 20;
三目运算符
条件?条件真运行:条件假运行
a>b?a:b
条件为真,返回a,否则为b
sizeof 是运算符 不是函数
int c;
sizeof(c);sizeof(int);
char s[10]={0};
sizeof(s);
char s[10] = "dsf";
sizeof(s);
练习:
1、当用户输入5的时候,使用嵌套循环产生下列图案(5行美元符号,第行递增一个字符)
$
$$
$$$
$$$$
$$$$$
2、编写一个程序,要求用相应的控制语句往屏幕中输出26个小写字母
3、打印下面的图案
| *
| ***
| *****
|*******
| *****
| ***
| *
4、编写一个程序,判断一个整数是否为素数
在gcc下用到数学函数,如sqrt。在gcc时要加上 -lm 参数,这样告诉编译器我要用到数学函数了 。
如:
gcc a.c -o a -lm
5、运用switch-case 输入的年份月份及日,计算这为这一年的第几天
一月31天 二月28 29天(平年28 闰年29 ) 三月31天 四月30天 5月31天 6月30天 七月31天 八月31天 九月30 十月31天 十一月30 十二月31天
char a = 0xa,b=0xb,c=0xc,d = 0xd;
int i=0xabcd;
6、定义四个符号char类型,然后通过左移,拼接成一个无符号的int类型
7、通过位运算进行置1或者清零操作
1000 1101 置第四位为1,对第二位清零(要求操作过程不能修改其他位)
对x位置1 k = k | 1<<x
对X位清零 k = k & ~(1<<x)
printf("0x%08x"); 以八位的格式 显示16进制