一、函数
分为库函数和用户定义函数
面向过程是若干个函数组成
面向对象是由若干个对象组成
1.是否有返回值
2.带参函数和不带参函数
3.库函数
二、库函数介绍
以下库函数转自/candyliuxj/article/details/4793153
1).输入输出函数(<stdio.h>)
文件打开和关闭:
FILE *fopen(const char *filename, const char *mode);
int fclose(FILE * stream);
字符输入输出:
int fgetc(FILE *fp);
int fputc(int c, FILE *fp);
getc和putc与这两个函数类似,但通过宏定义实现。通常有下面定义:
#define getchar()getc(stdin)
#define putchar(c) putc(c, stdout)
int ungetc(int c, FILE* stream);//把字符 c 退回流 stream
格式化输入输出:
int scanf(const char *format, ...);
int printf(const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
int sscanf(char *s, const char *format, ...);
int sprintf(char *s, const char *format, ...);
行式输入输出:
char *fgets(char *buffer, int n, FILE *stream);
int fputs(const char *buffer, FILE *stream);
char *gets(char *s);
int puts(const char *s);
直接输入输出:
size_t fread(void *pointer, size_t size,size_t num, FILE *stream);
size_t fwrite(const void *pointer, size_t size,size_t num, FILE *stream);
2)、数学函数(<math.h>)
三角函数:
指数和对数函数:
其他函数:
注:所有上面未给出类型特征的函数都取一个参数,其参数与返回值都是double类型。
下面函数返回双精度值(包括函数ceil和floor)。在下表里,除其中有特别说明的参数之外,所有函数的其他参数都是double类型。
3)、字符处理函数(<ctype.h>)
见下表:
注:条件成立时这些函数返回非0值。最后两个转换函数对于非字母参数返回原字符。
4、字符串函数()
4.1)字符串函数
所有字符串函数列在下表里,函数描述采用如下约定:s、t表示(char *)类型的参数,cs、ct表示(const char*)类型的参数(它们都应表示字符串)。n表示size_t类型的参数(size_t是一个无符号的整数类型),c是整型参数(在函数里转换到char):
5、字符串处理函数
<string.h>还有一组字符数组操作函数(存储区操作函数),名字都以mem开头,以某种高效方式实现。在下面原型中,参数s和t的类型是(void *),cs和ct的类型是(const void *),n的类型是size_t,c的类型是int(转换为unsigned char)。
6、功能函数<stdlib.h>
随机数函数:
动态存储分配函数:
几个整数函数
几个简单的整数函数见下表,div_t和ldiv_t是两个预定义结构类型,用于存放整除时得到的商和余数。div_t类型的成分是int类型的quot和rem,ldiv_t类型的成分是long类型的quot和rem。
数值转换
比较两者最大值
<span style="font-size:18px;">#include<stdio.h>int compareNum(int num1 ,int num2){//形参//形参只有在调用的时候才会分配空间,调用结束释放内存单元//被调函数return num1>num2?num1:num2;}int main(intargc,const char* argv[]) {// insertcode here...int num1 ,num2;scanf("%d%d",&num1,&num2);int max =compareNum(num1,num2);//实参//此时main主调函数 compare为被调函数printf("%d和 %d中的最大值是 %d!\n",num1,num2,max);return 0;}</span>
三、函数应用代码练习
1). C6函数传递参数不一致的问题
<span style="font-size:18px;">#include<stdio.h>int compareNum(int num1 ,int num2){//形参//形参只有在调用的时候才会分配空间,//被调函数return num1 + num2;}int main(intargc,const char* argv[]) {// insertcode here...int max =compareNum('a','b');//实参// 97 +98//此时main主调函数 compare为被调函数printf("max = %d!\n",max);return 0;}</span>
2).实参可以是表达式,整型变量
函数的嵌套使用
函数名不能与变量名重名
Return(x+y+z)/3.0f;
3).函数使用时
1.定义(实现)
2.再调用之前声明(告诉编译器函数已经存在)
注意间接声明的问题。
四.函数难点:递归函数
递归函数很耗资源,内存,所以尽量少用
调用本身的函数
递推阶段:问题规模缩小
回归迭代:迭代计算得到过程
F(n)=f(n-1)+2;
<span style="font-size:18px;">#include <stdio.h>int countAge (intn){int age =0;if (n == 1) {age = 10;}elseage =countAge(n -1) +2;return age;}int main(intargc, const char* argv[]) {int age =0;age = countAge(5); printf("age = %d \n",age); return 0;}</span>
五.递归原理,堆栈操作
压栈操作
出栈操作 (迭代计算)
递归算阶乘
<span style="font-size:18px;">#include <stdio.h>int fact (intn){int num =0;if (n == 1) {num = 1;}elsenum =fact(n -1)*n;return num;}int main(intargc, const char* argv[]) {printf(" %d! = %d\n",5,fact(5));return 0;}</span>
2).求N次方递归
<span style="font-size:18px;">// main.c// C6求N次方递归//// Created by CHINGWEI_MACPC on 15/10/17.// Copyright © itcast. All rights reserved.//#include <stdio.h>int fact (intx,int y){int result =0;if (y == 1) {result = x;}elseresult =fact(x ,y-1)*x;return result;}int main(intargc, const char* argv[]) {printf(" %d^%d =%d \n",2,7,fact(2,7));return 0;}</span>
六.Xcode运行原理
编译--->.o(目标文件)-->链接->.out执行
Unix命令
根目录 /
---- i表示insert
输入内容后按escshitf + :输入wq!表示保存并退出
2).手动编译的方法
include不一定要卸载第一行
实质是把文件的内容插入该位置取代该命令行
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include
3).清除缓存的方法
七.模块化编程
多文件编程(比如一个.c和一个.h)
头文件名要和.c文件一样
八.进制问题
1010= 10
1011= 11
1).进制练习
<span style="font-size:18px;">#include<stdio.h>int main(intargc,constchar* argv[]) {int num = 10 ;printf(" %d的16进制是 %0x\n",num,num);printf(" %d的八进制是%o\n",num,num);int b = 0b00000000000000000000000000001101;printf("0b00000000000000000000000000001101的十进制数是%d\n",b);//c语言没有提供打印2进制的方法return 0;}</span>
余数倒序得到二进制数
7位然后高位补0刚好一个字节
2进制转换为16进制
二进制数四位并为一位16进制数
1.机器数和真值
机器数:计算机中二进制表示形式,计算机最高位存放符号位,正为0,负数为1
真值:机器数对应的真正数值称为机器数的真值
计算机内部是以补码形式储存
正数最高位为0,负数最高位为1
对于正数反码==补码==补码
对于负数反码==除符号位以外的各位取反补码==反码+1
64位机器
Int类型占用4个字节,每个字节8位
2).进制练习2
// C4计算机存储值的形式
//
//Created by CHINGWEI_MACPC on 15/10/20.
// Copyright © itcast. All rights reserved.
//
#include<stdio.h>
int main(intargc,constchar* argv[]) {
int b1 = 0b11111111111111111111111111111111;
printf("负数b1 = %d\n",b1);
int b2 = 0b00000000000000000000000000000011;
printf("正数b1 = %d\n",b2);
return 0;
}
负数b1 = -1
正数b1 = 3
3).原码补码概念
计算机没有减法,减一个数等于加一个负数
引入补码概念,
计算机能够做减法,减法的电路设计更简单。
1-1
原码进行计算 1 +(-1)
00000000000000000000000000000001
10000000000000000000000000000001
------------------------------------------------------
10000000000000000000000000000010
想加产生 - 2
1-1
反码进行运算
1+(-1)
000000000000000000000000000000001
111111111111111111111111111111110
---------------------------------------------------------
111111111111111111111111111111111反码
反码转换为原码
100000000000000000000000000000000-0数学中没有 -0的概念
1-1
1 +(-1)
补码进行运算
00000000000000000000000000000000(1)
11111111111111111111111111111111 (-1)
------------------------------------------------------
00000000000000000000000000000000相加补码得0
九.位运算
<span style="font-size:18px;">printf("9 & 4 = %d\n",9&4);//有 0 为 0printf("9 | 8 = %d\n",9|8);//有 1 为 1printf("~9 = %d\n",~9);/*~9 ;00000000 00000000 00000000 00001001~-------------------------------------11111111 11111111 11111111 11110110得到补码10000000 00000000 00000000 00001001 去发得到反码10000000 00000000 00000000 00001010 得到原码-10*/printf("9 ^ 8 = %d\n",9^8);//相同为0不同为 1//左移右移运算效率高printf("8 << 2 = %d \n",8<<2);//左移相当于 *2 8乘以2的2次方printf("8 >> 2 = %d \n",8>>2);//右移相当于 /2 8除以2的2次方printf("8 << 2 = %d \n",8>>4);//结果为 0//左移会改变一个数的正负性printf("-1073741823<< 2 = %d\n",-1073741823<<2);int b = 0b10000000000000000000000000000110;/*右移0b10100000000000000000000000000001;取反0b11011111111111111111111111111110;加一0b11011111111111111111111111111111;有点意外呢*/printf(" %d\n",0b11011111111111111111111111111111);//printf("-536870909 >> 2 = %d\n",b >>2);return 0;</span>
int c = 6 ;
int result = c&1;
printf("%d\n",result);
2).进制练习2
// C3二进制转换程序
//
<span style="font-size:18px;">// Created by CHINGWEI_MACPC on 15/10/20.// Copyright © itcast. All rights reserved.//#include<stdio.h>int main(intargc,constchar* argv[]) {int num = 12 , count = 0;int num2 =num;int arr[32];//定义一个数组来存储余数值while (1) {if (num2<1) {break;}else{num = num2%2;num2 =num2/2;arr[count]=num;count++;printf("%d",num);}}printf("\n");for (int i=count-1; i>=0; i--) {printf("%d",arr[i]);}printf("\n");return 0;}</span>
老师思路
#include<stdio.h>
//思路:
/*
1.先将需要转换的数字右移
2.每移动一位与 1相 &
*/
<span style="font-size:18px;">int covertTo2(intn ){int len =sizeof(n)*8;//得到位数for (int i = 0; i < len; i++) {int x = n>>(31-i);printf("%d",x&1);}return 0;}int main(intargc,constchar* argv[]) {covertTo2(13);printf("\n");return 0;}</span>
//main.c
//判断奇偶性
<span style="font-size:18px;">//// Created by CHINGWEI_MACPC on 15/10/23.// Copyright © itcast. All rights reserved.//#include<stdio.h>void parity(intn ){if (n&1) {printf("%d是奇数\n",n);}else{printf("%d是偶数数\n",n);}}int main(intargc,constchar* argv[]) {parity(5);return 0;}</span>
//交互两个数不定义先变量
<span style="font-size:18px;">//// Created by CHINGWEI_MACPC on 15/10/23.// Copyright © itcast. All rights reserved.//#include<stdio.h>int main(intargc,constchar* argv[]) {//如果数比较大,可能溢出int a = 5;int b = 4;printf("a = %d , b =%d\n",a,b);printf("交换后\n");a = a +b;b = a -b;a= a -b;printf("a = %d , b =%d\n",a,b);printf("\n");//方法2异或的方法,相同为0不同为 1int c = 5;int d = 4;printf("c = %d , d =%d\n",c,d);printf("交换后\n");c = c^d;d = c^d;c= c^d;printf("c = %d , d =%d\n",c,d);return 0;}</span>
<span style="font-size:18px;"></span>
<span style="font-size:18px;">// 18-获取变量地址//// Created by CHINGWEI_MACPC on 15/10/23.// Copyright © itcast. All rights reserved.//#include<stdio.h>int main(intargc,constchar* argv[]) {// insertcode here...int a = 2 ,b = 3 ;char ch = 'a';printf("%p\n",&a);//0x7fff5fbff75cprintf("%p\n",&b);//0x7fff5fbff758printf("%p\n",&ch);//0x7fff5fbff757//计算机分配内存原则//1.从高地址向低地址分配,先定义的变量是高地址,//2.变量在内存中占用的存储单元中最小的地址值//2.此地址值为变量的首地址,地址最小的地址15/10/23return 0;}</span>
<span style="font-size:18px;"> // main.c// 查看变量在内存中1每一个字节//// Created by CHINGWEI_MACPC on 15/10/23.// Copyright © itcast. All rights reserved.//#include<stdio.h>int main(intargc,constchar* argv[]) {int num = 266 ;//0000000000000000 00000000 00001010char *p =#printf("第1个字节的地址 :%p, 值 : %d\n",p,*p);printf("第2个字节的地址 :%p, 值 : %d\n",p+1,*(p+1));printf("第3个字节的地址 :%p, 值 : %d\n",p+2,*(p+2));printf("第4个字节的地址 :%p, 值 : %d\n",p+3,*(p+3));return 0;}</span>
<span style="font-size:18px;"></span>
<span style="font-size:18px;"></span>