04 - 字符和循环分支

1.标准数据类型

#include<stdio.h>
#include<stdint.h>//标准数据类型头文化

//标准数据类型非库里面的,所有的平台都可以使用的
int main()
{
	typedef signed char        int8_t;
	typedef short              int16_t;
	typedef int                int32_t;
	typedef long long          int64_t;
	typedef unsigned char      uint8_t;
	typedef unsigned short     uint16_t;
	typedef unsigned int       uint32_t;
	typedef unsigned long long uint64_t;

	typedef signed char        int_least8_t;
	typedef short              int_least16_t;
	typedef int                int_least32_t;
	typedef long long          int_least64_t;
	typedef unsigned char      uint_least8_t;
	typedef unsigned short     uint_least16_t;
	typedef unsigned int       uint_least32_t;
	typedef unsigned long long uint_least64_t;
	return 0;
}

2.ASCLL字符码

ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准ISO/IEC 646。ASCII第一次以规范标准的类型发表是在1967年,最后一次更新则是在1986年,到目前为止共定义了128个字符

img

备注:需要记住常见的ASCLL码 值

0 ~ 9   0X30 ~ 0X39
A ~ Z   0X41 ~ 0x5A
a ~ z   0x61 ~ 0x7A
空格:0X20
回车:0X0d
换行:0x0a

3.字符

3.1 字符和宽字符

char ch1 = 'a';		//一个字符占一个字节大小
short ch2 = 'b';	//一个字符占2个字节
printf("%C",&ch1)	//char
printf("%C",&ch2)	//short 大写的C
    
wchar_t ch1 = L'中';		//一个字符占两个字节大小
wprint(L"%c",ch1);		//加上L,小写c
print("%C",ch1);		//不加L,大写C

3.2 设置不同国家的语言的设置

#include<locale.h>			//	包含头文件
setlocale(LC_ALL, "zh-CN"); //  设置区域 实现宽字符的显示

  setlocale(LC_ALL, "zh-CN");

  //wchar_t wch1 = L'中'; //width
  wchar_t wch1 = 0x4e2d; //width  0~65535
  printf("%C %hx\n", wch1, wch1);

4.表达式

4.1运算符

4.1.1一元运算符:

符号“属性”备注
- ~ -求反和补数运算符
\* &间接寻址运算符和 address-of 运算符
sizeofSize 运算符计算数据类型字节数
+一元加运算符
++ 一元递增和减量运算符

代码示例:

#include<stdio.h>
#include<stdint.h>

int main()
{
    //sizeof
	int a=10;
    printf("sizeof int =%d",sizeof(a));	//int数据是4字节
    
    //++ 
    //前置++  
    int n1=1;
    int n2=1;
    n2=n1++;
    printf("n1 = %d, n2 = %d ",n1,n2);//n2=1,n1=2  前置++先赋值+1
    
    //后置++
    int n3=1;
    int n4=1;
    n3=n4++;
    printf("n4 = %d, n3 = %d ",n4,n3);//n2=2,n1=2  后置++ 先计算后+1
	return 0;
}

4.1.2二元运算符

C 提供了以下二进制运算符:

符号“属性”
\* / %乘法运算符
+ -相加运算符
<< >>移位运算符
<><>==<关系运算符
& | ^位运算符
&& ||逻辑运算符
,有序评估运算符

4.1.3逻辑运算符

逻辑运算符不执行常用算术转换。 相反,它们根据其等效性为 0 计算每个操作数。 逻辑运算的结果不是 0 就是 1。 结果的类型为 int

C 逻辑运算符如下所述:

运算符描述
**&& **如果两个操作数具有非零值,则逻辑“与”运算符产生值 1。 如果其中一个操作数等于 0,则结果为 0。 如果逻辑“与”运算的第一个操作数等于 0,则不会计算第二个操作数。
||逻辑“或”运算符对其操作数执行“与或”运算。 如果两个操作数的值均为 0,则结果为 0。 如果其中一个操作数具有非零值,则结果为 1。 如果逻辑“或”运算的第一个操作数具有非零值,则不会计算第二个操作数。
==判断两个是否相等,要和赋值= 区分开来,第一个操作数等于第二个操作数
!=第一个操作数不等于第二个操作数
取反 真(非0)取反就是假(0),假(0)区分就是真(非0)

4.1.4 C 运算符的优先级和关联性

符号 1操作类型结合性
[ ] ( ) . -> ++``--(后缀)表达式从左到右
sizeof & * + - ~ ! ++``--(前缀)一元从右到左
typecasts一元从右到左
* / %乘法从左到右
+ -加法从左到右
<< >>按位移动从左到右
< > <= >=关系从左到右
== !=相等从左到右
&按位“与”从左到右
^按位“异或”从左到右
|按位“与或”从左到右
&&逻辑“与”从左到右
||逻辑“或”从左到右
? :条件表达式从右到左
= *= /= %= += -= <<= >>= &= ^= |=简单和复合赋值 2从右到左
,顺序计算从左到右

1 运算符按优先级的降序顺序列出。 如果多个运算符出现在同一行或一个组中,则它们具有相同的优先级。

2 所有简单的和复合的赋值运算符都有相同的优先级。

5.分支

5.1 if语句

	
	//双支if语句
	if(括号内为判定的条件  )                                    
	{         
	   		花括号内为执行的代码
	}  
 	else 
	{       
		花括号内为执行的代码
	} 
	
	//多支if语句
	if(括号内为判定的条件  )                                    
	{         
	   		花括号内为执行的代码
	}  
 	else if 
	{       
		花括号内为执行的代码
	} 
	else
    {
		花括号内为执行的代码
	}

案例:

if ( i > 0 )
    y = x / i;
else 
{
    x = i;
    y = f( x );
}

如果 y = x/i; 大于 0,则执行 i 语句。

如果 i 小于或等于 0,则将 i 赋给 x,并将 f( x ) 赋给 y

请注意,构成 if 子句的语句以分号结尾。

img

if语句多条件(案例如上)

5.2 do……while语句

执行过程如下所示:

  1. 执行语句体。
  2. 接着,计算 expression 。 如果 expression 为 false,则 do-while 语句将终止,控制权将传递到程序中的下一条语句。 如果 expression 为 true(非零),则将从第 1 步开始重复此过程。

当 、gotoreturn 语句在语句主体中执行时,do-while 语句也可以终止。

do
{
    y = f( x );
    x--;
} while ( x > 0 );

在此 do-while 语句中,无论 x 的初始值是什么, 和 x--; 这两个语句都会执行。 然后将计算 x > 0。 如果 x 大于 0,则会再次执行语句体并重新计算 x > 0。 只要 x 保持大于 0,语句主体就会重复执行。 当 变为 0 或负值时,do-while 语句的执行将终止。

将至少执行一次循环体。

在这里插入图片描述

5.3 while语句

执行过程如下所示:

  1. 计算 expression 。

  2. 如果 expression 最初为 false,则绝不执行 语句体,并且控制从 while 语句到程序中下一语句的传递。

    如果 expression 为 true(非零),则执行语句体,并且此过程从第 1 步开始重复。

当语句主体中的 breakgotoreturn 执行时,while 语句也可以终止。 使用 continue 语句可以在不退出 while 循环的情况下终止迭代。 continue 语句将控制权传递给 while 语句的下一个迭代。

while ( i >= 0 )
{
    string1[i] = string2[i];
    i--;
}

此示例将 string2 中的字符复制到 string1。 如果 i 大于或等于 0,则 string2[i] 将赋给 string1[i],并且 i 将递减。 当 i 达到 0 或小于 0 时,while 语句的执行将终止。

while 和 do …… while 的比较

1、do …… while 一定会执行一次在判断

2、while 先判断在执行

img

5.5 for语句

for (表达式1; 表达二2; 表达式3) 
{
	循环代码
}

for 语句的执行将按以下方式继续:

  1. 将计算 init-expression(如果有)。 这将为循环指定初始化。 对表达式1的类型没有限制。
  2. 将计算 表达式二(如果有)。 此表达式必须具有算法或指针类型。 它在每次迭代前计算。 可能有三个结果:
    • 如果 表达式二 为 (非零),则执行语句,然后计算 表达式三(若有)。 在每次迭代之后,将计算表达式三。 对其类型没有限制。 副作用将按顺序执行。 该过程随后从计算 cond-expression 重新开始。
    • 如果省略了 表达式二,则 表达二 被视为 true,执行将完全按上一段中所述方式继续。 只有在执行了语句主体中的 breakreturn 语句时,或只有在执行了 goto(转到 for 语句主体外的带标签的语句)时,没有 cond-expression 参数的 for 语句才会终止。
    • 如果 cond-expression 为 (0),则 for 语句的执行终止,并将控制权传递给程序中的下一个语句。

img

//输入10个数,计算出最大的值  

int nCount = 0;
  printf("input count:\n");
  scanf_s("%d", &nCount);

  int nMax = 0;
  printf("please input number:\n");
  scanf_s("%d", &nMax);

  for (int i = 0; i < nCount - 1; i++) {
    int nInput = 0;
    scanf_s("%d", &nInput);
    if (nInput > nMax) {
      nMax = nInput;
    }
  }

  printf("max is %d\n", nMax);

5.4面向过程编程思想

案例一:

/*
项目需求:
比较输入两个整数的大小

面向过程编程思想:
1.定义两个变量
  1)定义整型变量1,初始化为0
  2)定义整型变量2, 初始化位0
2.提示用户输入
  1)printf
3.接受用户输入两个数
  1)scanf,判断输入合法性
4.判断两数的大小
  1)如果第一个数大于第二个数
    a)显示第一个数大
  2)如果第一个数小于第二个数
    a)显示第二个数大
  3)如果第一个数等于第二个数
    a)显示两数相等
5.程序结束
*/

int main() {
  int nNumber1 = 0;
  int nNumber2 = 0;

  printf("Please Input Numbers:\n");
  int nRet = scanf("%d %d", &nNumber1, &nNumber2);
  if (nRet != 2) {
    printf("Invalid Input\n");
    return 0;
  }
  if (nNumber1 > nNumber2)  
  {
      printf("nNumber1 Is Max\n");
  }
  else if (nNumber1 < nNumber2) 
  {
      printf("nNumber2 Is Max\n");
  }
  else
  {
      printf("nNumber1 Equal nNumber2\n");
  }


  return 0;
}

案例二:

/*
项目需求:
2.比较输入10个整数的大小

面向过程编程思想:
1.定义变量保存最大的数
2.提示用户输入
  1)如果次数大于10,结束程序
  2)printf
3.接受用户输入数
  1)scanf,判断输入合法性
4.判断如果输入的数大于保存的数据
  1)保存的数据 = 输入的数
5.重复第2步骤
6.程序结束

*/

int main() {

  int nCount = 0;
  printf("input count:\n");
  scanf_s("%d", &nCount);

  int nMax = 0;
  printf("please input number:\n");
  scanf_s("%d", &nMax);

  for (int i = 0; i < nCount - 1; i++) 
  {
    int nInput = 0;
    scanf_s("%d", &nInput);
    if (nInput > nMax) 
    {
      nMax = nInput;
    }
  }

  printf("max is %d\n", nMax);
 
  return 0;
}

案例三:

/*
面向过程  =》  分而治之 => 大事化小 小事化了

1.定义变量n = 0, 
2.保存用户输入的值到n
3.j = 0
4.判断j < n
  1).i = 0
  2).判断i < n
    1)输出一个* 
    2)i = i + 1
    3)重复2)
  3).输出换行
5.j = j + 1
6.重复3
7.0程序结束
*/
  unsigned n = 0;
  
  scanf_s("%d", &n);

  
  for(unsigned j = 0; j < n; j = j + 1) 
  {
   for (unsigned i = 0; i < n; i = i + 1)
   {
     printf("* ");
   }
   printf("\n");
  }
  

案例四:

  //闰年:四年一润,百年不润(year % 4 == 0 && year % 100 != 0)   四百年再润(year % 400 ==0)
  /*
  1.定义一个无符号unsigned short变量, 初始化为1
  2.输入年份
  3.判断(year % 4 = 0 && year % 100 != 0)
     1)满足显示闰年
     2)不满足
       a)判断(year % 400 ==0)
           1.满足显示润年
           2.不满足显示不是润年
   */
   
  unsigned short nYear = 1;
  scanf_s("%hd", &nYear);
  if ((nYear % 4 == 0 && nYear % 100 != 0) || (nYear % 400 == 0))
  {
   printf("Is Leap Year\n");
  }
  else 
  {
   printf("Is Not Leap Year\n");
  }

案例五:

//15.输入某年某月某日,判断这一天是这一年的第几天?
  /*
  某月几天 + 日 = 第几天

  某月几天 3 = 1 + 2

  每个月有几天 
    1=31  
    2=润年29 非润年28 
    3 = 31 
    4 = 30
    5 = 31
    6 = 30
    7 = 31
    8 = 31
    9 = 30
    10 = 31
    11 = 30
    12 = 31

   2000 3 1
   1.定义年月日变量
   2.输入年月日
   3.检查年月日
   4.计算前一个月的总天数days
       如果月为1 + 0
       如果月为2 + 31
       4 = 1 + 2 + 3
   5.days + 日
   6.显示days
  */
  
 unsigned nDays = 0;
  for (int i = 1; i <= nMonth - 1; i++)
  {
   if (i == 2)  //如果月份2月份
   {
     if ((nYear % 4 == 0 && nYear % 100 != 0) || (nYear % 400 == 0))
       nDays += 29; //闰年2月份29天
     else
       nDays += 28; //闰年2月份28天
   }
   else if (i < 8) //如果月份大于1~7月份 奇数31天 偶数30天
   {
     if (i % 2 == 0)
     {
       nDays += 30;
     }
     else 
     {
       nDays += 31;
     }
   }
   else if (i >= 8) { //如果月份8~12月份 奇数30天 偶数31天
     if (i % 2 == 0)
     {
       nDays += 31;
     }
     else
     {
       nDays += 30;
     }
   }
  }
  printf("%d", nDays + nDay);

案例六:

//30.编写程序将一个输入的十进制数转换成一个二进制数,并且显示
  /*
  int 32次
  char 8次  0000 0000
  1.定义变量
  2.输入一个数到变量
  3.定义变量i = 0
  4.i < sizeof type
    1).变量除2,显示余数
    2).变量 = 变量 / 2
    3).i++
    3).重复3


    1111 1110

    1000 0000    1   

    0111 1110
    0100 0000
  */
  
   unsigned long long  n = 0;
  scanf_s("%lld", &n);
  unsigned i  = 0;
  unsigned long long nShift = 0x8000000000000000;
  while(i < sizeof(n) * 8)
  {
   printf("%d", n / nShift);
   n = n % nShift;
   nShift = nShift / 2;
   i++;
  }

案例六:

//32.以每行5个数来输出300以内能被7或17整除的偶数,并求出其和。
  /*
    1.0~300
       xxx
    2.每行5个数
       xxx
    3.能被7或17整除的偶数
       xxx
    4.求出其和
       xxx
  */

  int nCount = 0;
  int nSum = 0;
  for (int i = 1; i <= 300; i++) 
  {
    if (i % 2 == 0 && (i % 7 == 0 || i % 17 == 0))
    {
      printf("%-4d ", i);

      nCount++;
      nSum += i;


      if (nCount % 5 == 0) {
        printf(" sum:%d\n", nSum);
        nSum = 0;
      }
    }
  }

  printf(" sum:%d\n", nSum);

  return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值