C基础学习

1、switch...case分支语句

1.1 语法格式

switch (表达式)
{
	case 常量表达式1:
		C语句块;
		break;
	case 常量表达式2:
		C语句块;
		break;
	case 常量表达式3:
		C语言块;
		break;
		
	...省略很多case分支...
	
	default:
		C语句块n;
		break;
}

注:
	1> “表达式”的结果是一个常量,可以是一个普通的变量,
		运算结果为常量的表达式
	
	2> "常量表达式1" 是一个常量,可以是一个整型的常量,比如1,2,3,4
		可以是一个字符常量,比如:'A', 'B', 'c', 'd'
	
	3> 每个case分支中都有一个"break;" break的作用退出switch...case语句,
		break可以省略不写,如果省略break,则继续向下指向case分支语句,
		直到遇到下一个break才会退出switch...case语句。
	
	4> default类型与else,是一个托底的,只有以上case分支语句都不满足时,
		才会执行default中对应的C语句块。
		default分支可以省略不写。

执行过程:
	根据“表达式”的结果,直接找到与之匹配的case分支语句,
	然后执行对应的分支语句,遇到break退出switch...case语句,
	如果没有匹配到对应的case分支则会执行default分支中对应的C语句。


在实际的开发过程中能用switch...case实现的尽量使用switch...case,
尽量不要使用if...else if ... else...。
switch...case的执行效率比if...else的效率要高。

1.2 参考案例

案例1:将学生成绩划分的代码使用switch...case实现
#include <stdio.h>
int main(int argc, const char *argv[])
{
 int score;
 printf("请输入你的成绩 > ");
 scanf("%d", &score);

 if (score < 0 || score > 100)
 {
  printf("输入成绩错误\n");
  return -1;
 }

#if 0
 switch (score / 10)
 {
  case 10:
   puts("等级:A");
   break;
  case 9:
   puts("等级:A");
   break;
  case 8:
   puts("等级:B");
   break;
  case 7:
   puts("等级:C");
   break;
  case 6:
   puts("等级:D");
   break;
  default:
   puts("等级:E");
   break;
 }
#endif
 switch (score / 10)
 {
  case 10:
 /*		puts("等级:A");
   break;     // 省略break, 继续向下执行知道遇到break,才会退出
 */
  case 9:
   puts("等级:A");
   break;
  case 8:
   puts("等级:B");
   break;
  case 7:
   puts("等级:C");
   break;
  case 6:
   puts("等级:D");
   break;
  default:
   puts("等级:E");
   break;
 }

 return 0;
}

练习题2:输入一个字符,判断字符
#include <stdio.h>
int main(int argc, const char *argv[])
{
 char ch;
 printf("请输入字符a-d > ");
 scanf("%c", &ch);
 switch(ch)
 {
  case 'a':
   printf("ch = %c\n", ch);
   break;
  case 'b':
   printf("ch = %c\n", ch);
   break;
  case 'c':
   printf("ch = %c\n", ch);
   break;
  case 'd':
   printf("ch = %c\n", ch);
   break;
  default:
   printf("其他的字符\n");
   break;
 }


 return 0;
}

练习题3:从终端输入年份和月份,判断此月份对应的天数。
#include <stdio.h>

int main(int argc, const char *argv[])
{
 int year, mouth;
 printf("请输入年和月份(year mouth) > ");
 scanf("%d%d", &year, &mouth);
 
 // 在实际编写代码带,注意空格的使用,方便代码的阅读
 // 运算符两边可以加空格
 if (year <= 0) {
  printf("输入的年份不合理\n");
  return -1;
 } 
/*
 if (mouth <= 0 || mouth > 12) {
  printf("输入的月份不合理\n");
  return -2;
 }
*/
 switch(mouth)
 {
  case 1:
  case 3:
  case 5:
  case 7:
  case 8:
  case 10:
  case 12:
   printf("%d年%d月份共计31天\n", year, mouth);
   break;
  case 4:
  case 6:
  case 9:
  case 11:
   printf("%d年%d月份共计30天\n",year, mouth);
   break;
  case 2:
   if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
    printf("%d年是闰年%d月份共计29天\n",year,mouth); 
   } else {
    printf("%d年是平年%d月份共计28天\n",year, mouth); 
   }
   break;
  default:
   printf("输入的月份不合理\n");
   break;
 }


 return 0;
}

练习题4:实现一个两个数的简单的计算器,+ - * / %
请从输入一个算数表达式 > 100 + 200

#include <stdio.h>
int main(int argc, const char *argv[])
{
 int lvalue, rvalue;
 char operator;
 int value;

 printf("请输入一个算数表达式(eg:100 + 200) >");
 scanf("%d%*c%c%*c%d", &lvalue, &operator, &rvalue);

 switch(operator)
 {
 case '+':
  value = lvalue + rvalue;
  break;
 case '-':
  value = lvalue - rvalue;
  break;
 case '*':
  value = lvalue * rvalue;
  break;
 case '/':
  value = lvalue / rvalue;
  break;
 case '%':
  value = lvalue % rvalue;
  break;
 default:
  printf("输入的运算符不合理\n");
  break;
 }

 printf("%d %c %d = %d\n", lvalue, operator, rvalue, value);


 return 0;
}

2、while循环

2.1 语法格式

1. 语法格式
	while(表达式1)
	{
		C语句块2;
	}

2. 执行过程:
	"表达式1"成立执行"C语句块2","表达式1"不成立,退出while循环。
	
	[1][2,1][2,1][2,1][2,1].......
	

3. 注意事项:
	1> while循环是先判断后执行,C语句块不一定被执行
	2> 如果C的语句块只有一条C语句,可以省略{},
	3> 死循环的用法:
		while(1) { 循环体 }  
		while(1);
		
		
		

2.2 练习题

练习题1:使用while循环实现1+2+3+...100直接的所有的数求和?
#include <stdio.h>

int main(int argc, const char *argv[])
{
 int sum = 0;
 int i = 1;

 while(i <= 100)  // while (!(i > 100))
 {
  sum = sum + i;
  i++;
 }

 printf("sum = %d\n", sum);

 return 0;
}

练习题2:求100-999直接的所有的水仙花数?
 g^3 + s^3 + b^3 = 本身
 
#include <stdio.h>

int main(int argc, const char *argv[])
{
 int i = 100;
 int g,s,b;

 while(i < 1000)
 {
  g = i % 10;
  s = i / 10 % 10;
  b = i / 100;
  if (i == g*g*g + s*s*s + b*b*b) {
   printf("%d ", i);
  }
  i++;
 }
 puts("");  // 换行符

 return 0;
}

练习题3:使用while循环打印以下图形
*
**
***
****
*****
******

#include <stdio.h>
int main(int argc, const char *argv[])
{
 int i, j;
 int line;
 printf("请输入打印三角形的行数 > ");
 scanf("%d", &line);
 
 i = 0;
 while(i < line)  // 三角形的行数
 {
  j = 0;
  while( j <= i)   // 一列打印几个*
  {
   printf("*");
   j++;
  }
  puts("");
  i++;
 }


 return 0;
}

练习题4:
 使用while循环打印九九乘法表,
1 * 1 = 1
1 * 2 = 2  2 * 2 = 4
1 * 3 = 3  2 * 3 = 6  3 * 3 = 9
.........

#include <stdio.h>

int main(int argc, const char *argv[])
{
 int i, j;
 i = 1;
 while(i <= 9)  // 行
 {
  j = 1;
  while(j <= i)  // 列
  {
   printf("%d * %d = %d\t", i, j, i*j);
   j++;
  }
  putchar('\n');
  i++;
 }


 return 0;
}

练习题5:
 由1-9,组合一个3位的数,要求各位,十位,百位的数都不相同,
 将所有的可能的情况进行输出。
#include <stdio.h>
int main(int argc, const char *argv[])
{
 int g,s,b;
 g = 1;
 while(g <= 9)
 {
  s = 1;
  while(s <= 9)
  {
   b = 1;
   while(b <= 9)
   {
    if (g != s && s != b && g != b)
    {
     printf("%d%d%d ", b, s, g);
     // printf("%d ", b*100+s*10+g);
    }
    ++b;
   
   }
   ++s;
  }
  ++g;
 }
 putchar('\n');
 return 0;
}
 
 

3、do...while循环

1. 格式
	do {
		C语句块2;
	}while(表达式);    // 结尾的分号不可以省略

2. 执行过程:
	先执行一次“C语句块2”,在判断“表达式1”是否成立,
	如果成立则继续执行“C语句块2”,如果不成立则退出do...while循环。
	
	[2,1][2,1][2,1][2,1][2,1]......

3. 注:
	1> do...while循环不管条件表达式是否成立很定会被执行一次。
	2> 如果只有一条语句可以省略{},一般不要省略。
	3> do { 循环体; } while(0);   循环体只需要执行1次。
	4> do...while循环经常和宏定义进行配合使用。
案例1:使用do...while循环打印九九乘法表
#include <stdio.h>
int main(int argc, const char *argv[])
{
 int i , j;
 i = 1;
 do{ 
  j = 1;
  do {
   printf("%d * %d = %d\t", i,j,i*j);
  } while(j++ < i);
  putchar('\n');
 } while(i++ < 9);

 return 0;
}

案例:do...while循环和宏定义配合使用的案例。
#include <stdio.h>

// # : 将参数转换为字符串
// ## : 字符串的拼接

#define  PRINT(str,err)  printf("%s\n",#str);return err

// 宏定义默认要求写到1行,如果分多行进行书写,要求加续行符“\”
#define  PRI_ERR(str,err) do {                     \
       printf("%s\n", #str);  \
         return  err;           \
        } while(0)

#define PRI_DEBUG(str,err)  {printf("%s\n", #str); \
        return err;        \
       }

int main(int argc, const char *argv[])
{
 int retValue;
 retValue = putchar('A');
 if (retValue == -1)
 {
#if 0
  printf("put char failed\n");
  return -1;
#endif 
  // 如果if分支只有1条语句可以省略花括号,
  // 但是这里调用的宏定义,展开之后有多条语句,
  // 因此if的{}不可以省略。
  PRINT(put char failed, -1);
 }

 retValue = putchar('B');
 if (retValue == -1)
  PRI_ERR(put char failed, -1);
 

 retValue = putchar('C');
 if (retValue == -1)
  // PRI_DEBUG(send char failed, -1);  // error
  PRI_DEBUG(send char failed, -1)   // OK
 else 
  printf("send char success\n");

 return 0;
}

4、for循环

4.1 for循环的语法格式

1. 语法格式
	for(表达式1; 表达式2; 表达式3)    // 常见
	{
		C语句块4;
	}
	
	表达式1:一般为赋值语句,比如i = 1
	表达式2:循环结束的判断语句,结果为真或假,比如1 <= 9
	表达式3:改变循环的语句,比如i++  j++
	C语句块4:for循环的循环体

2. 执行过程
	先执行表达式1,在执行表达式2,如果表达式2成立,则执行C语句块4,
	如果不成立则退出for循环;执行完C语句块4之后,执行表达式3,
	然后再执行表达式2,如果表达式2成立,再执行C语句块4,
	如果不成立则退出for循环; 依次类推。
	
	[1,2][4,3,2][4,3,2][4,3,2][4,3,2].....

3. for循环的表达式可以省略
	for(;;)     // 常见
	{
		循环体;
	}   ----> 死循环
	
	for(;表达式2;表达式3)    // 常见
	{
		循环体;
	}	----> 要求再for循环之前进行赋初值
	for(表达式1;;表达式3)     // 不常见
	{
		循环体;
	} ----> 死循环
	
	for(表达式1;表达式2;)		// 不常见
	{
		循环体;
	} 

4.2 参考案例

前边使用while循环完成的案例,都可以使用for循环实现。(自己课下完成)
案例1: 将一个无符号的整数,使用二进制的形式进行打印。
 unsigned int num = 0x12345678;

#include <stdio.h>

int main(int argc, const char *argv[])
{
 unsigned int num =0x12345678;

 int i;
 printf("0b");
 for (i = 0; i < 32; i++)
 {

  if (num & (0x1 << (31 - i))) // num最高位与1,其他为与0
  {
   printf("%d", 1);
  }
  else 
  {
   printf("%d", 0);
  }
  if ((i + 1) % 4 == 0)
  {
   printf(" ");
  }
  // num <<= 1;
 }

 printf("\n");
 return 0;
}

案例2:for循环嵌套的
    *
   **
  ***
 ****
*****
#include <stdio.h>
int main(int argc, const char *argv[])
{
 int i,j;
 int line;
 printf("请输入打印的行数 > " );
 scanf("%d", &line);
 for(i = 1; i <= line; i++)  // 打印行数
 {
  for(j = 1; j <= line - i; j++)  // 打印一行有几个空格
  {
   printf(" ");
  }
  for(j = 1; j <= i; j++)  // 打印一行有几个*
  {
   printf("*");
  }
  printf("\n");

 }


 return 0;
}

案例3:从终端输入一个大于0整数,求出阶乘的之和结果。
 比如输入5, 1! + 2! + 3! + 4! + 5! = 
    1 + 1*2 + 1*2*3 + 1*2*3*4 + 1*2*3*4*5 = 
 外层循环求和;
 内存循环求阶乘;
#include <stdio.h>
int main(int argc, const char *argv[])
{
 int i,j, num;
 long mul_val = 1;
 long sum_val = 0;
 
 printf("请输入一个整数 > ");
 scanf("%d", &num);
 for (i = 1; i <= num; i++)
 {
  for (mul_val = 1, j = 1; j <= i; j++)
  {
   mul_val *= j;
  }
  sum_val += mul_val;
 }
 printf("%ld\n", sum_val);

 return 0;
}
 
 
 
案例4:
求出用50元, 20元, 10元, 可以组合成100元的所有的情况?
50元  20元  10元
0   0        0
0   0        1
0   0        2
0   0        3
......
0   1        0
0   1        1
0   1        2
0   1        3
.....

#include <stdio.h>
int main(int argc, const char *argv[])
{
 int i,j,k;
 int sum = 0;

 for (i = 0; i <= 2; i++)
 {
  for(j = 0; j <= 5; j++)
  {
   for(k = 0; k <= 10; k++)
   {
    if (i*50+j*20 + k*10 == 100)
     printf("50元%d张,20元%d张,10元%d张\n", i,j,k);
   }
  }
 }


 return 0;
}

案例5:使用for循环嵌套,打印以下图形。
    FEDCBA
    +FEDCB
    ++FEDC
    +++FED
    ++++FE
    +++++F
    
#include <stdio.h>
int main(int argc, const char *argv[])
{
 int i,j;

 for(i = 0; i < 6; i++)  // 打印行数
 {
  for(j = 0; j < i; j++) // 打印+字符, 一列打印几个+
  {
   putchar('+');
  }

  for(j = 0; j < 6 - i; j++) // 打印F-A字母
  {
   putchar('F'-j);
  }
  putchar('\n');
 }


 return 0;
}
  
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值