中国大学MOOC_C语言程序设计(翁恺)笔记

来源:互联网 发布:网站关键字优化工具 编辑:程序博客网 时间:2024/05/10 04:12
1.3 第一个程序
语句以分号(;)结束
命令行输入输出语句scanf、printf(描述在头文件#include "stdio.h" 
scanf("%d",&i);     //完整的格式修饰%[flag]type
printf("%d\n",i);    //完整的格式修饰%[flags][width][.prec][hlL]type
 
2.1 变量
变量的定义、初始化赋值(即变量在等号左边)、使用(即变量在等号右边)
ANSI变量定义只能在代码开头;C99变量定义可以在代码中
变量的类型:
整数:char、short、int、long、long long  (整数还可用unsiged修饰)
浮点数:float、double、long double
逻辑:bool (需要引入头文件#include ,bool的值true、false)
指针:
自定义类型:
sizeof()函数用来显示类型或变量占用内存的字节数,如sizeof(int),sizeof(i),一般char为1字节,short为2字节,而int的大小就是CPU总线的字长,即1个寄存器的大小,如32位处理器,字长为4字节
自动类型转换和强制类型转换
C语言的自动类型转换过多,往往会产生一些非预期的错误;后续的C++和Java对类型匹配较为严格
在C99中可以用const来声明常量

3.1 判断和3.2分支
if (<表达式>) {<语句组>}
   else if  (<表达式>) {<语句组>}
   else (<表达式>) {<语句组>}
switch (<变量或表达式>) {
case <变量值1>: <语句或语句组>;
case <变量值2>: <语句或语句组>;
...
default:<语句或语句组>;
}
switch为入口跳转,找到入口后一直往下执行,用break语句可跳出当前switch块;switch和case后面的变量或变量值必须是整型的;
运算符(按优先级排)
单目取正+  单目取负-
②强制类型转换
③算术运算符:加+ 减- 乘* 除/ 取余%
④关系运算符:大于>  小于<  大于等于>=  小于等于<=  等于==  不等于!= 
                        关系运算的结果为整型数非0或1(True)或0(False)
⑤逻辑运算符:!、&&、||,短路规则:如果&&左边为假值或||左边为真值,则其右边的表达式将不再去做运算
条件运算符  ?
count=(count>20)? count-10:count+10,等号右边为一个条件运算表达式,即问号成立,则执行第一个式子,否则运算第二个式子
赋值运算
复合赋值:+=  -=  *=  /=  %=
自增:i++(先用再加) ++i(先加再用)
逗号运算符
<表达式1>,<表达式2>
先运算表达式1,再运算表达式2,整个表达式的值是表达式2的值

4、5 循环
★while (<表达式>) 
{<语句或语句组>}
do {<语句或语句组>} 
while (<表达式>);
for (<表达式1>;<表达式2>;<表达式3>) 
{<语句或语句组>}
for可以改写为一个while循环,即
<表达式1>;
while (<表达式2>)
{<语句或语句组>
<表达式3>} 
循环控制
contiue结束本次循环;break结束整个循环
跳转goto
goto <标号标识符>
...
<标号标识符>:
 
//4-1求n位数的水仙花数
#include "stdio.h"
int main(){
 int power(int n,int p);
 int n,num,m,sum,i=1;
 scanf("%d",&n);
 for (num=power(10,n-1);num<=power(10,n)-1;num++) {  
  for (i=1,m=num,sum=0;i<=n;i++) {
  m%=10;
   sum+=power(m,n);
   m/=10;
  }
  if (sum==num) printf("%d\n",num);
 }
return 0;
}
int power(int n,int p){
 int i,result=1;
 for (i=1;i<=p;i++){
 result*=n;
 }
return result;
}

//4-2输出下三角N*N部分口诀表,其中等号右边数字占4位、左对齐。
#include "stdio.h"
int main(){
int N,i,j;
scanf("%d",&N);
for (i=1;i<=N;i++) {
for (j=1;j<=i;j++) {
printf("%d*%d=%-4d",j,i,i*j);
}
printf("\n");
}
return 0;
}

//4-3素数算法
for(i=Min;i<=Max;i++){
if (i==1) continue;
for(j=2;j*j<=i;j++) if(i%j==0)break;
if(j*j>i) printf("%d",i);
}

6.1 数据类型
整数的内部表达、整数的范围、整数的格式化
浮点类型:
浮点数不能表示靠近零的很小的正负数,实际上浮点数表达的小数都是数轴上的离散点,所以浮点数的计算不准确,只是在浮点精度上的近似。
浮点数还可表示正负无穷大(±inf,如1.0/0.0为+inf,-1.0/0.0为-inf)、非有效数(nan,如0.0/0.0);
字符类型
 
//6-2字符串大小写转换
#include "stdio.h"
int main()
{
 char ch;
 do{
  scanf("%c",&ch);
  if (ch>='a'&&ch<='z')
   {printf("%c",ch-32);}
  else if (ch>='A'&&ch<='Z')
   {printf("%c",ch+32);}
  else
   {printf("%c",ch);}
 }
 while (ch!='\n');
return 0;
}
 
7.1 函数的定义和使用
定义:
<函数类型> <函数名>(<形参类型、形参列表>) ;
声明:
标准C函数的原型声明写在main里面的最前面位置;C99则要求写在预编译之后,main函数之前
<函数类型> <函数名>(<形参类型[、形参列表]>) 
7.2 函数的参数和变量
使用:值传递给形参 。定义在函数内部的变量是本地变量,参数也是本地变量(local)
 
8.1 数组变量
定义:
<类型> <数组变量> [<一维数组个数>][<二维数组个数>][...]
数组的个数必须是自然数。
标准C,数组个数必须是确定的常量;C99之后,数组个数可以用变量来确定,但同样地,一旦确定数组个数之后就不能再改变(不能动态改变数组大小)
初始化和赋值
int a[10],其中元素从a[0]到a[9]
数组的集成初始化int a[]={1,2,3,4,5},数组个数sizeof(a)/sizeof(a[0]);int a[5]={1},表示第一个元素为1,其后缺省为0
二维数组的初始化int a[2][3]={{1,2,3},{4,5,6}};
使用和遍历
 
9.1 指针(址与值)
9.1.1 取址运算符 & 和指针运算符 *
指针变量是用于存放地址的变量,不如叫“址”变量。如果int a;int *p;,且p=&a;,那么&*p==&a;*&a==a
相邻的整数变量地址差一个sizeof(int);数组的地址:a==&a==a[0],每两个数组元素的址间隔一个sizeof(type)
9.1.2 指针(指针变量就是记录地址的变量)
指针既然也是变量,那么也需要先定义,再赋初值,然后才能使用。
9.1.4 指针与数组:为什么数组传进函数后的sizeof不对了
数组名本身就是指针:int a[10];int *p=a; //无需用&取地址
但是数组的单元表达的是变量,需要用&取地址:a==&a[0]
实际上其中方括号[],可以看作运算符,它可以对数组做,那么也可以对指针做:p[0]<==>a[0]
反过来。*运算符可以对指针做,也可以对数组做:*a==a[0]
数组变量是const的指针,所以不能被赋值:int a[]<==>int *const a

9.2指针运算

9.2.1指针运算

指针+1,实际上是加上一个sizeof(type),减1也是类似的

*p++,就是*(p++),即取出p所指的那个数据,完成后把p向后推一个sizeof(type);常用于数组类的连续地址操作

0地址:通常用于存放一些重要内容,编程是一般应避免;NULL常数即代表0地址

9.2.2动态内存分配

//通过指针和malloc函数,可以动态初始化数组的大小
#include   //malloc对应的头文件
int i,number,*a;
scanf("%d",&number);
a=(int*)malloc(number*sizeof(int)); //向系统申请一定number的整型空间内存块,并返回指向这个内存块的指针,并将指针转换为整型
for (i=o;i
 scanf("%d",&a[i]);
}
//放入使用数组的代码
free(a);//用完以后要释放a
return(0);

 

10.1 字符串
字符串以\0结尾
char s[]={'H','e','l','l','l','o','\0'};
char s[]="Hello";  //和上面的表示方法等价,这个字符数组长度(sizeof)为6

 

scanf("%s",string); //读入一个单词,到空格、Tab、回车为止
printf("%s",string);

10.2 字符串函数
getchar()
putchar(<字符变量>)

 

#include "string.h"
strlen(<字符串变量>)  字符串长度(不包括\0)
strcmp(<字符串变量1>,(<字符串变量2>)  比较字符串,输出它们的ASCII码差值
strcpy(<目标字符串变量>,(<源字符串变量>)   字符串拷贝

       char *dst = (char*)malloc(strlen(src)+1);
       strcpy(dst,src);
strcat(<目标字符串变量>,(<源字符串变量>)   字符串连接
strchr(<字符串变量>,<字符>)  字符串中找字符
strstr

 

11.1 枚举

11.2 结构体

定义:

struct [<结构体名>] {
<结构体声明>
}<结构体变量列表>;

和数组不同的,结构体的成员可以是不同类型的

★赋值

struct date {
  int month;
  int day;
  int year;
};
struct date today={07,31,2014};
struct date thismonth={.month=7,.year=2014};  //制定赋值,未被赋值的为0

★运算

与数组不同的是,结构体之间可以赋值运算
<结构体变量1>=<结构体变量2>

此外,结构体变量名并不是它的地址

11.3 联合

 

12.1 全局变量

定义在函数体内的变量叫局部变量(本地变量);定义在函数体外的变量叫全局变量(外部变量)。局部变量的生存周期和作用域是一致的,即在函数体内部。

局部变量不会自动初始化,但全局变量未初始化的整型会得到0值,指针变量默认初值NULL

若有局部变量和全局变量重名,则全局变量将被隐藏。(小范围变量覆盖大范围变量)

12.1-2 静态本地变量

static

用来保存离开函数后的局部变量

静态本地变量本质上是一种特殊的全局变量,具有全局生存期、本地作用域。

 

12.2 编译预处理和宏

12.2-1 宏定义

编译预处理(把include后面的文件内容原封不动地放在代码处)
#include “studio.h"  //双引号表示在当前目录和系统指定位置查找头文件,用尖括号表示只在指定位置查找头文件
定义宏,用来字符替换。宏定义超过一行时,可用反斜杠\作续行符
#define PI 3.1415 

一些预定义宏
__LINE__  //源代码文件当前行号
__FILE__  //源代码文件名
__DATE__  //源代码编译时间
__TIME__  //源代码编译日期
__STDC__  //
__func__  //当前函数名 

12.2-2 带参数的宏
一切都要有括号(整个值要括号、参数出现的每个地方都要有括号)
例如 #define RADTODEG(x) ((x)*57.29578)

部分宏可以用inline函数代替

 

12.3 大程序结构

12.3-1 多个源代码文件

新建一个项目,将几个源代码文件添加到这个项目

12.3-2 头文件

函数原型可以单独放在一个头文件中(并添加到同一个项目)

同样可以把全局变量的声明放在这个头文件中,但注意全局变量声明前面要补全external

除了函数原型、变量声明外,还可以防在头文件里的有结构体声明、枚举声明、另一个宏声明等

为避免inclue多个头文件时产生重复声明,所以标准头文件结构中用ifndef来加以避免,如下

#ifndef __M_HEAD__
#define __M_HEAD__

[宏定义体]

#endif

 

13.1 文件

文本文件的操作

FILE *fp=fopen("file","r"); 

//r  打开只读
//r+ 从头开始读写
//w  打开只写,若文件不存在则新建,若存在则清空
//w+ 打开读写,若文件不存在则新建,若存在则清空
//a  打开追加,若不存在则新建,若存在则从尾部追加
//..x 上述修饰符后加x表示只新建,若文件已存在则不能打开
if (fp) {
 fscanf(fp,"%d",$num);  //读取文件
 printf(%d\n,num);
 flose(fp);   //关闭文件
}
else {
 printf("无法打开文件\n");
}

 

13.2 位运算

& 位与
  | 位或
  ~ 按位取反  //补码是按位取反再加1

逻辑运算相当于把所有非0值都变成1,然后做按位运算
 5&4->4 而5&&4->1 1&1->1
 5|4->5 而5||4->1 1|1->1
 ~4->3 而 !4->!1->0
^ 位异或  //位相等结果为0,位不相等结果为1
<< 左移
   >> 右移

所有小于int的类型,以为以int方式来做,结果是int;对于unsigned的类型,左边填入0;对于signed的类型,左边填入原来的最高位(即保持符号位不变)
x>>=1 等价于x/=2
x>>=n 等价于x/=2n

0 0
原创粉丝点击