C语言回顾(三、选择循环,数组及Fibonacci)——iOS开发基础


说明:
在学习UI高级知识之前,将利用最近十来天的时间回顾一下C语言,主要按照《C程序设计(谭浩强版)》来回顾。
整理一些知识点(不是细节,知识个人觉得较重要或易忘的)以及挑一些课后题目或经典习题编写代码练习。


第4章 选择结构程序设计
第5章 循环结构程序设计
第6章 利用数组处理批量数据


1、在BASIC和Pascal等语言中可以直接在程序中用AND,OR,NOT作为逻辑运算符。在C语言中不能在程序中直接用AND,OR,NOT作为逻辑运算符,而用其他符号代替。

2、逻辑型变量 _Bool
同时在stdbool.h中,将bool定义为 _Bool 的同义词,定义了两个符号常量true和false,对应1和0,这是C新标准增加的,提高了程序的可读性,但有些编译系统还不能用。
类似于OC中得bool类型的使用
验证例子如下:

#include <stdio.h>
#include <stdbool.h>

int main(int argc, const char * argv[]) {
    bool a = true;
    _Bool b = false;
    if (a) {
        printf("True!\n");
    }
    if (!b) {
        printf("false!\n");
    }
    return 0;
}

3、利用条件表达式处理简单地选择结构使程序更简洁!要记住。
例如输入大写转小写,简单代码如下:

    char ch;
    scanf("%c",&ch);
    ch = (ch >= 'A' && ch <= 'Z')?(ch+32):(ch);
    printf("%c\n",ch);

4、switch语句的注意点(非所有,只是易忘点)
(1)可以没有default语句,此时如果没有雨switch表达式相匹配的case常量,则不执行任何语句,流程转到switch语句的下一个语句;
(2)每个case常量必须互不相同;否则会互相矛盾;
(3)switch后面括号内的“表达式”,其值类型应为整数类型(包括字符型)。区别于swift语句

5、while与for的等价

    表达式1;
    while 表达式2 {
        语句;
        表达式3;
    }

改写为

    for (表达式1; 表达式2; 表达式3) {
        语句;
    }

明显for语句更加简单,方便;
for语句中表达式1可省略;表达式2也可省略,循环无终止进行下去;表达式3也可省略,但程序设计时要另外设法保证循环能正常结束,比如将表达式3放在语句中进行;
若三者都省略,死循环,没什么实用价值。在利用这一特点时,要注意考虑语句的可读性

5、break和continue
break:使流程跳刀循环体之外,接着执行循环体下面的语句。只用能用于循环语句和switch语句中,而不能单独实用
continue:提前结束本次循环,接着执行下次循环

6、数组
本质: 连续的内存
数组的赋值:必须一个元素一个元素赋值
数组初始化方式:用下列程序来说明

#include <stdio.h>

int main(int argc, const char * argv[]) {
    //数组初始化
    int b[5]={1,2,3,4,5};          //数组只有在初始化的时候才能使用大括号{}赋值,不可以以下形式。int a[];a[]={0,1,2};是错误的,只能逐个赋值。
    int c[5]={1,2};
    //未赋值的部分元素自动设为0
    //  int d[];                      此种定义方法语法错误 ,数组的定义必须指定长度
    int e[]={1,2,3,4};
    printf("%lu %lu %lu\n",sizeof(b),sizeof(c),sizeof(e));
    return 0;
}

output:20 20 16
注意:
(1)数组的定义必须指定长度
(2)int a[3+5]合法;int a[n]不合法;C语言中数组大小不能作动态定义

7、数组名的含义(已涉及指针)

#include <stdio.h>

int main(int argc, const char * argv[]) {
    //数组名的不同含义
    int m[5] = {1,2,3,4,5};
    int n=0;
    int *p3=NULL;
    int *p4=NULL;
    p3=&m[0];
    p4=m;                     //数组名代表 第一个元素的地址 &m[0]
    /*数组的名字在不同的场合有不同的意思
     此句运行没有语法错误,说明此处数组名的类型与p4类型一致
     均为int*  */
    n=sizeof(m);             //数组名代表 整个数组
    /*此处运行结果为整个数组的长度,
     而不是代表m[0],因此数组名还可代表整个数组*/
    printf("%d\n",n);
    printf("%p,%p\n",p3,p4);   //运行结果一致,说明p4=m中数组名代表 第一个元素的地址 &m[0]
    printf("\n");
    return 0;
}

output:

20
0x7fff5fbff820,0x7fff5fbff820

8、二维数组
float a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
float a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};//按内存排列顺序赋初值
float a[3][4] = {{1},{5},{9}};//只对部分元素赋值,各行第一列元素赋值
float a[][4] = {1,2,3,4,5,7,8,9,10,11,12};
float a[][4] = {{1},{5},{9}}; //一维长度可以省,二维长度不能省
表示a为3*4(3行4列)的数组
二维数组可以看做一种特殊的一维数组,包含3个元素a[0],a[1],a[2]:
a[0]————>a[0][0] a[0][1] a[0][2] a[0][3];
a[1],a[2]类似,在内存中存放时先顺序存放第1行的元素,接着再存放第2行的元素,线性存放的。

9、关于字符串,内容较重要另起一篇章,专门写字符串,及处理函数


10、练习1:输出所有的“水仙花数”,所谓的“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。

#include <stdio.h>

int main(int argc, const char * argv[]) {
//    水仙花数
    int i,a,b,c;
    for (i = 100; i < 1000; i++) {
        a = i/100;
        b = i/10%10;
        c = i%10;
        if (i == a*a*a+b*b*b+c*c*c) {
            printf("%d\n",i);
        }
    }
    return 0;
}

output:

153
370
371
407

11、练习2:求Fibonacci数列的前40个数字,每行4个
Fibonacci问题来源:一对兔子, 出生后第3个月起每个月都生一对兔子。长到三个月后每个月又生一对兔子。假设兔子不死,每个月的兔子总数为多少?
——普通方法

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int monthFommer = 1,monthLatter = 1,i = 1;
    for (i = 1; i <= 20; i++) {
        printf("%12d%12d",monthFommer,monthLatter);
        if (i%2 == 0) {
            printf("\n");
        }
        monthFommer = monthFommer + monthLatter;
        monthLatter = monthLatter + monthFommer;
    }
    return 0;
}

——利用数组处理

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int a[40] = {1,1};
    int i = 0;
    for (i = 2; i < 40; i++) {
        a[i] = a[i-1] + a[i-2];
    }
    for (i = 0; i < 40; i++) {
        if (i % 4 == 0) {
            printf("\n");
        }
        printf("%12d",a[i]);
    }
    printf("\n");
    return 0;
}

output:(上述两种方法结果是一样的)

           1           1           2           3
           5           8          13          21
          34          55          89         144
         233         377         610         987
        1597        2584        4181        6765
       10946       17711       28657       46368
       75025      121393      196418      317811
      514229      832040     1346269     2178309
     3524578     5702887     9227465    14930352
    24157817    39088169    63245986   102334155
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值