嵌入式开发第三天(输入字符类型的判断、控制流、常量与变量、运算符)

输入字符类型的判断

#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'));  //清缓冲区

}


if(year%4||(year%100==0&&year%400==0))
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 标签;


标签:

不建议使用,容易破坏栈

如果goto里面有 初始化内存,那么每一次GOTO都会初始化一次,这样对内存的存储会产生破坏;while里面也一样;
通常用于跳转错误处理;



常量与变量

变量命名规则:由字母,数字,下划线,变量只能是字母及下划线开始 (变量不能是系统的关键字、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 

                             10 11 12 13 14  15
 
浮点常量  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


x^=y;
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进制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

交叉编译之王 hahaha

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值