一.流程结构
包括:
* 顺序结构 : 默认的流程结构.按照代码编写顺序执行语句
* 分支结构 : 对给定的条件进行判断,再根据判断结果执行相应的代码
* 循环结构 : 在给定条件成立的条件下,反复执行某段代码
1) 顺序结构:
代码默认的执行顺序,按照代码由上到下的顺序执行;
2) 分支结构:
if语句:
1.if语句的三种形式
*1
if (conditon) {
statements;
}
*2
if (condition) {
statements;
} else {
statements;
}
*3
if (condition) {
statements;
} else if (conditon) {
statements;
} else {
statements;
}
注意: 这里的conditon是相当于一个bool类型的变量;
2.switch..case 语句
switch (expression){
case 1:
statements;
case 2:
statements;
...
default:
break;
}
这里分享一个if 和 switch相结合解决实际问题的小例子:
1 #define adultAge 18 // 18周岁 2 #define entranceFee 100 // 网吧最低消费金额,即入场费 3 int isVip = 0; //vip 至尊码是999 4 int isCafeOwner = 0; // boss 验证码是888 5 6 printf("Please choose the number of your ID information \n"); 7 printf("0:Nomal 1:Vip 2:Super \n"); 8 9 int c = 0; 10 scanf("%d" , &c); 11 12 int i = 0; 13 // 输入合理性判断 14 while(c < 0 || c >2) 15 { 16 printf("Error,please enter again \n"); 17 printf("%d \n" , i); 18 scanf("%d" , &c); 19 i++; 20 } 21 //printf("%d %d" , c , i); 22 23 int age = 0; // 年龄 24 int money = 0; // 金额 25 26 switch (c){ 27 case 0: 28 29 printf("Please enter your age and money, and divided with a blank \n"); 30 scanf("%d %d" , &age, &money); 31 break; 32 33 case 1: 34 35 printf("Please enter your vip card number \n"); 36 scanf("%d" , &isVip); // 是vip 37 break; 38 39 case 2: 40 41 printf("Please enter your super number \n"); 42 scanf("%d" , &isCafeOwner); // 是网吧的所有者 43 break; 44 45 default: 46 break; 47 } 48 49 50 // 判断是否有资格进入网吧消费 51 if (age >= adultAge && money >= entranceFee){ 52 printf("Welcome to our Internet cafe \n"); 53 }else if (isVip == 999) { // Vip至尊码是999 54 printf("Welcome back, our Vip \n"); 55 }else if (isCafeOwner == 888) {// Super boss码是888 56 printf("Welcome back, our boss \n"); 57 }else { 58 printf("Sorry,we can not provide the service \n"); 59 } 60 61 62 63 } 64 65 return 0;
这段代码,对网吧消费的问题进行了一定的定义解释。
3)循环结构
// 循环 :在满足某种特定的条件下,重复的做某件事情。
1 while (条件表达式) { 2 循环体 3 }
当条件表达式为真时,就执行循环体,一旦条件表达式为假,循环停止。
这里提下两个常用的小知识:
1.关于计算取位的问题
解决c简单函数算法问题时,我们常会遇到关于取出一个数十位、个位、百位,甚至是千位等这样的问题,那么小伙伴们不禁会好奇了,这该怎么办呢?
so here ,we could get it!
for axample :
对于 m = 12345,怎么取出它的各位数呢?
// 先看比较容易理解的2个 // single single = m % 10; // mol 10得到个位数 // 最高位max max = m / 10000; // 最高位 decade = m / 10 % 10; hundred = m / 100 % 10 ; thound = m / 1000 % 10;
怎么样?有没有发现什么共性?
除了最高位和个位数的提取,其他位的提取都可以写作
x位数 = m / pow(10,x) % 10;
其实,个位数和最高位数只是如上表达式的特殊情况罢了。
2.arc4random问题
for example :how to get a random from [30,50]
ok,let us get it fllowingly:
int temp = arc4random() % (50 - 30 + 1) + 30;
arc4random 函数的实质是取余的函数转换,[30,50]可以看做 [0,20] +30 的函数区间变动;而对于[0,20]这个区间我们通过对21做mol运算得到。那么,它有什么用呢?
首先,我们一起来看下这个,
”用户从控制台 输入一个n ,用while打印n个随机数,范围是[30,70],并找出n的最大值“
printf("please input a random number \n"); int n = 0; scanf("%d" , &n); int max = 0; while (n--) { int temp = arc4random() % (70 - 30 + 1) + 30; printf("%d " , temp); max = max > temp ? max : temp; } printf("\nthe max random number is %d \n" , max);
那么这个功能有什么用呢?做彩票?dream on,彩票站的算法,hehe,中国的故事你懂的,嘎啦,我只是随便说,千万不要当真的说,那么我们看点贴近生活的,如这个:
// 关于上面随机程序的一点联想 ,结合指针数组 char *name[5] = {"Jack" ,"Bob" ,"Lucy" ,"lol" ,"Tom"}; int random = arc4random() % 5; printf("%s \n" , *(name +random));
做个名字的随机抽取功能总还是可以的吧,哈哈~
————————————————
书归正传,继续来看循环结构:
// do{
// // 语句
// } while (条件表达式);
// do while ,先执行一次循环语句,再判断条件是否成立,至少会走一次循环体
// int i = 0;
// do {
// i++;
// printf("%d " , i);
// } while (i < 10);
这个和while语句比较像,也没有什么特别需要强调的,只要注意转换是condition的判断区间就好~
重点还是for循环的使用,
for (initialization; conditon; increment){
statements;
}
执行顺序,
first -> initialization;
second -> conditon judgement;
third -> run statements;
fourth -> increment;
一个例子:
//打印菱形 //思路 : 分析了下,感觉还是要加强点用户的互动性,但是具体开放哪个接口给用户,也没有太好的想法,感觉还是通过 菱形对角线的星星数 来定义一个菱形的形状会好一点吧 // 所以接口数据 选择了星星的个数,如果星星的个数是n,两个*的间距是d,对象线长度是 (n - 1)*d ,则菱形的边长是 (n - 1) * d / sqr(2); ------- 说明 printf("Please input an odd number of the stars on the diagonal \n"); // diagonal 星星 int n = 0; scanf("%d" ,&n); // 对角线行的星星个数是n ,那么对角线所在行数是i = (n + 1) / 2; // 输入上半部分 for (int i = 1; i <= ((n + 1) / 2); i++ ) { // 行数i for (int j = 1; j <= (( (n + 1) /2) - i ); j++) { // 空格 j printf(" "); } for (int k = 1; k <= (2 * i - 1); k++) { // 星星 k printf("*"); } printf("\n"); } //输入下半部分 for (int i = 1; i < ((n + 1) / 2); i++) { for (int j = 1; j <= i; j++) { printf(" "); } for (int k = 1; k <= (n - 2 * i); k++) { printf("*"); } printf("\n"); }
当然,这里还有另一种写法也可以作为推荐:
int i,j,k; // i来控制行数, j控制空格数,k控制星数 scanf("%d", &k); for (i=0; i2+1; i++) { for (j=0; j ) { printf(" "); } for (j=0; j<2*i+1; j++) { printf("*"); } printf("\n"); } // 下半部分 for (i=k/2; i>0; i--) { for (j=k-i+1; j>0; j--) { printf(" "); } for (j=2*i-1; j>0; j--) { printf("*"); } printf("\n");
ok,fighting ,today is today.