C语言基础知识总结

知识点的回忆与巩固

一. 条件分支结构

1.if分支语句

2.switch语句

二、循环体部分知识点整理

1.for循环

2.while循环-适合不确定循环次数时使用

三、字符串与数组

数组的操作

memcpy函数(头文件<cstring)
数组不能直接复制,可利用memcpy函数

void *memcpy(void *dest, void *src, unsigned int count);

memcpy 函数用于 把资源内存(src所指向的内存区域) 拷贝到目标内存(dest所指向的内存区域);一个size变量控制拷贝的字节数;
使用方式memcpy(b,a,sizeof(int)*k) 从a中赋值k个元素到b数组。

sizeof(int)*k表示计算int型所占字节数,然后再乘以k。
类比sizeof(int*k),表示计算指向整型的指针变量k所占的字节数。
再浅显讨论sizeof的作用

sizeof(int)*k之所以用sizeof(int)*k而不是用k,因为sizeof(int)*k返回的是字节数,因为数组是int 型的sizeof计算每个元素的字节长度,在乘以k既k个元素的字节,因为memcyp需要知道拷贝内存的字节数。所以拷贝是从开头开始计算,即k个元素是从a[0]开始计算。由此可以推出将a中元素全部拷贝到b数组中,memcpy(b,a,sizeof(a))。

memset函数(头文件<cstring)

void *memset(void *s , int ch , size_t n ) 在一段内存块中填充某一个给定的值,常用于较大的对结构体和数组的清零操作。
memset(结构体/数组名 , "用于替换的字符“ , 前n个字符 );
用法可以参考memcpy,也要用sizeof来计算字节。
总结内存复制需要计算字节。

字符串操作

strcpy(p, p1) 复制字符串
strncpy(p, p1, n) 复制指定长度字符串
strcat(p, p1) 附加字符串
strncat(p, p1, n) 附加指定长度字符串
strlen§ 取字符串长度
strcmp(p, p1) 比较字符串
strcasecmp忽略大小写比较字符串
strncmp(p, p1, n) 比较指定长度字符串
strchr(p, c) 在字符串中查找指定字符
strrchr(p, c) 在字符串中反向查找
strstr(p, p1) 查找字符串
strlwr§将大写字母全部换为小写字母
strupr§将小写字母全部换为大写字母

相对于字符型数组,字符串还可以有以下操作
  1. s.empty(); // s为空串 返回true
  2. s.size(); // 返回s中字符个数 类型应为:string::size_type
  3. s[n]; // 从0开始相当于下标访问
  4. s1+s2; // 把s1和s2连接成新串 返回新串
  5. s1=s2; // 把s1替换为s2的副本
  6. v1==v2; // 比较,相等返回true
  7. !=, <, <=, >, >=

四、函数

概念:组成C语言源程序的基本单位,完成特定功能的代码段.

例如main()为主函数:程序入口

函数定义到使用分三步:

1.声明
2.定义函数
3.调用函数。

一、函数的声明:

在调用函数之前,进行该函数的声明 ,由于程序是由上到下执行,编译器不知道我们是否已经定义了某个函数,为了防止编译器编译的时候报错(函数调用)所以,要告诉编译器,我已经定义了哪些函数。

二、函数的定义:

 返回值类型 函数名(形式参数类型 参数名1,……)


  {

                  函数体;

                  //return (返回值)

	}

目前接触的返回值类型有两种:
有参无返回值:void test(int x,float y){ }
有参有返回值: int max(int x,int y){ return x>y?x:y; }

1.函数的参数
1)形参和实参

形参:在定义函数的时候,函数名后面小括号中的参数 , 格式: 数据类型 变量 如:int x;
形参的作用域:只能在本函数中使用
实参:调用函数的时候传递的参数

2)参数的传递的过程

实参的值拷贝一份放到函数形参中

3)函数传参有三种传参方式:传值、传址、传引用
1°按值传递

(1)形参和实参各占一个独立的存储空间。
(2)形参的存储空间是函数被调用时才分配的,调用开始,系统为形参开辟一个临时的存储区,然后将各实参传递给形参,这是形参就得到了实参的值。

2°地址传递

地址传递与值传递的不同在于,它把实参的存储地址传送给形参,使得形参指针和实参指针指向同一块地址。因此,被调用函数中对形参指针所指向的地址中内容的任何改变都会影响到实参。

3°引用传递

引用传递是以引用为参数,则既可以使得对形参的任何操作都能改变相应数据,又使函数调用方便。引用传递是在形参调用前加入引用运算符“&”。引用为实参的别名,和实参是同一个变量,则他们的值也相同,该引用改变则它的实参也改变。

2、函数的返回值

概念:执行函数体中的程序段,最后获取的值并返回给主调函数,函数的返回值只能通过return 关键字进行返回
格式:return 表达式;/ return (表达式);
返回值类型要与返回值相同。
是否要定义形参看是否有未知内容参与运算,调用时实参必须对应.参数传递的是值。
函数中可以有多个return ,但是只有一个起作用,因为函数会结束后会带回一个值。

三、函数的调用

定义:函数名(实参列表);
1)形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。
2)实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值 。
3)实参和形参在数量上,类型上,顺序上应严格一致,否则会发生类型不匹配的错误。

零碎知识点的总结

头文件

#include <iomanip>   小数点出入输出
#include<algorithm>  STL,主要是用sort
#include <cstdio>     C语言的输入输出及其他c部分

素数的判断

1定义法
除了1与自身外无其他因数。

int main()
{
	int a;
	char b='y';
	cin>>a;
	for(int i=2;i<a;i++)
	{
		if(a%i==0&&a!=i) 
		{
			b='N';
			break;
		}
	}
	if(b=='N') cout<<"不是";
	else cout<<"是";
	return 0;	
}

2.对定义法的改进,若a不是素数则在2到sqrt(a)的范围内一定存在其因数。所以

int main()
{
	int a;
	char b='y';
	cin>>a;
	for(int i=2;i<=sqrt(a);i++)        //等号必须存在
	{
		if(a%i==0) 
		{
			b='N';
			break;
		}
	}
	if(b=='N') cout<<"不是";
	else cout<<"是";
	return 0;	
}

最大公约数最小公倍数

a,b最小公倍数=a*b/最大公约数
最大公约数用辗转相除法

int main()
{
	int a,b;
	int mid;
	int x,y;
	cin>>a>>b;
	x=a,y=b;
	while(b>0)
	{
		mid=a%b;
		a=b;
		b=mid;
	}
	cout<<a<<x*y/a<<endl;

经验教训

一、基础的语法很重要,只有学好了这些语法,才会写程序,看程序,会修改程序,知道自己程序的流程,以及每一项的操做的结果与作用。
二、要多练习敲代码,只有写过足够多的代码才能熟练的运用,纸上谈兵,眼高手低,马马虎虎,到了自己真正要用到的时候才发现有些东西只是看明白了,自己写的时候根本写不出来。
三、自学很重要。不会的尽量自己思考,百度查,从开始到现在我没有去问过别人代码,有时候有思路没能力实现,就回去查这些东西怎么才能办到,就拿上一篇hash那个题来讲,我最早想到的是哈希算法,我想如果将字符转化为数字,根据数字来存储到数组内,就不会爆内存,可是哈希算法太难实现,我就想怎样才能开出比1000000*100的大的数组,无果而终,知道看到容器是随开随用的,看题要看思路,而不是忙目的做,盲目的问,盲目的抄,不是自己的东西,用一次下次就不会了,就再也想不到了。

posted @ 2019-01-03 20:17  风骨散人  阅读(159)  评论(0编辑  收藏  举报