说明:
在学习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