第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > [黑马IOS自学第四篇]C语言函数 进制 Unix命令 函数学习

[黑马IOS自学第四篇]C语言函数 进制 Unix命令 函数学习

时间:2021-03-31 00:45:11

相关推荐

[黑马IOS自学第四篇]C语言函数 进制 Unix命令 函数学习

一、函数

分为库函数和用户定义函数

面向过程是若干个函数组成

面向对象是由若干个对象组成

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>

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。