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

你可能感兴趣的:(数组,fibonacci,C语言,水仙花数,ios开发基础)