1. C语言中对字符串进行操作的标准库函数有哪些
1)字符串操作
strcpy(p, p1) 复制字符串
strncpy(p, p1, n) 复制指定长度字符串
strcat(p, p1) 附加字符串
strncat(p, p1, n) 附加指定长度字符串
strlen(p) 取字符串长度
strcmp(p, p1) 比较字符串
strcasecmp忽略大小写比较字符串
strncmp(p, p1, n) 比较指定长度字符串
strchr(p, c) 在字符串中查找指定字符
strrchr(p, c) 在字符串中反向查找
strstr(p, p1) 查找字符串
strpbrk(p, p1) 以目芦迅标字符串的所有字符作为集合,在当前字符串查找该集合的任一元素
strspn(p, p1) 以目标字符串的所有字符作为集合,在当前字符串查找不属于该集合的任一元素的偏移
strcspn(p, p1) 以目标字符串的所有字符作为集合,在当前字符串查找属于该集合的任一元素的偏移
* 具有指定长度的字符串处理函数在已处理的字符串之后填姿哗祥补零结尾符
2)字符串到数值类型的转换
strtod(p, ppend) 从字符串 p 中转换 double 类型数值,并将后续的字符串指针存储到 ppend 指向的 char* 类型存储。
strtol(p, ppend, base) 从字符串 p 中转换 long 类型整型数值,base 显式设置转换的整型进制,设置为 0 以根据特定格式判断所用进制,0x, 0X 前缀以解释为十六进制格式整型,0 前缀以解释为八进制格式整型
atoi(p) 字符串转换到 int 整型
atof(p) 字符串转换到 double 符点数
atol(p) 字符串转换到 long 整型
3)字符检查
isalpha() 检查是否为字母字符
isupper() 检查是否为大写字母字符
islower() 检查是否为小写字母字符
isdigit() 检查是否为数字
isxdigit() 检查是否为十六进制数字表示的有效字符
isspace() 检查是否为空格类型字符
iscntrl() 检查是否为控制字符
ispunct() 检查是否为标点符号
isalnum() 检查是否为字母和数字
isprint() 检查迹搏是否是可打印字符
isgraph() 检查是否是图形字符,等效于 isalnum() | ispunct()
2. 在C中,什么是标准库函数
在C语言程序设计里,C 标准函数库(C Standard library) 是所有符合标准的头文件(head file)的集合,以及常用的函数库实现程序,例如I/O 输入输出和字符串昌裂姿控制。不像COBOL、Fortran和PL/I等编程语言,在 C 语言的工作任务里不会包含嵌入的关键字,所以几乎所有的 C 语言程序都是由标准函数库的函数来创建的。
每一个函数的名称与特源搏性会被写成一个电脑文件,这个文件就称为头文件,但是实际的函数实现是被分存到函数库文件里。头文件的命名和领域是很常见的,但是函数库的组织架构也会因为不同的编译器而有所不同。标准函数库通常会随附在编译器上。因为 C 编译器常会耐绝提供一些额外的非ANSI C函数功能,所以某个随附在特定编译器上的标准函数库,对其他不同的编译器来说,是不兼容的。
3. C++库和C库的区别
C++标准库非常大。在C++标准中,关于标准库的规格说明占了密密麻麻300多页,这还不包括标准C库,后者只是 "作为参考"包含在C++库中。
当然,并非总是越大越好,但在现在的情况下,确实越大越好,因为大的库会包含大量的功能。标准库中的功能越多,开发自己的应用程序时能借助的功能就越多。C++库并非提供了一切(没有提供并发和图形用户接口的支持),但确实提供了很多。几乎任何事都可以求助于它。
因
为标准库中东西如此之多,你所选择的类名或函数名就很有可能和标准库中的某个名字相同。为了避免这种情况所造成的名字冲突,实际上标准库中的一切都被放在
名字空间std中。但这带来了一个新问题。无数现有的C++代码都依赖于使用了多年的伪标准库中的功能,例如,声明
在<iostream.h>,<complex.h>,<limits.h>等头文件中的功能。现有软件没有针对使
用名字空间而进行设计,如果用std来包装标准库导致现有代码不能用,将是一种可耻行为。
慑
于被激怒的程序员会产生的破坏力,标准委员会决定为包装了std的那部分标准库构件创建新的头文件名。生成新头文件的方法仅仅是将现有C++头文件名中的
.h 去掉,方法本樱此身不重要,正如最后产生的结果不一致也并不重要一样。所以<iostream.h>变成
了<iostream>,<complex.h>变成了<complex>,等等。对于C头文件,采用同样的方法,
但在每个名字前还要添加一个c。所以C的<string.h>变成了<cstring>,<stdio.h>变成
了<cstdio>,等等。最后一点是,旧的C++头文件是官方所反对使用的(即明确列出不再支持),但旧的C头文件则没有(以保持对C的兼
容性)。实际上,编译器制造商不会停止对客户现有软件提供支持,所以可以预计,旧的C++头文件在未来几年内还是会被支持。
所以,实际来说,下面是C++头文件的现状:
· 旧的C++头文件名如<iostream.h>将会继续被支持,尽管它们不在官方标准中。这些头文件的内容不在名字空间std中。
· 新的C++头文件如<iostream>包含的基本功能和对应的旧头文件相同,但头文件的内容在名字空间std中。(在标准化的过程中,库中有些部分的细节被修改了,所以旧头文件和新头文件中的实体不一定完全对应。)
· 标准C头文件如<stdio.h>继续被支持。头文件的内容不在std中。
· 具有C库功能的新C++头文件具有如<cstdio>这样的名字。它们提供的内容和相应的旧C头文件相同,只是内容在std中。
所
有这些初看有点怪,但不难习惯它。最大的挑战是把字符串头文件理清楚:<string.h>是旧的C头文件,对应的是基于char*的字符串
处理函数;<string>是包装了std的C++头文件,对应的是新的string类;<cstring>是对应于旧C头文件
的std版本。如果能掌握这些,其余的也就容易了。
关
于标准库,需要知道的第二点是,库中的一切几乎都是模板。iostream帮助你操作字符流,但什么是字符?是char吗?是wchar_t?是
Unicode字符?一些其它的多字节字符?没有明显正确的答案,所以标准库让脊返迅你去选。所有的流类(stream
class)实际上是类模板,在实例化流类的时候指定字符类型。例如,标准库将cout类型定义为ostream,但ostream实际上是一个
basic_ostream<char>类型定义(typedef
)。
类
似的考虑适用于标准库中其它大部分类。string不是类,它是类模板:类型参数限定了每个string类中的字符类型。complex不是类,它是类模
板:类型参数限定世悉了每个complex类中实数部分和虚数部分的类型。vector不是类,它是类模板。如此不停地进行下去。
在
标准库中无法避开模板,但如果只是习惯于和char类型的流和字符串打交道,通常可以忽略它们。这是因为,对这些组件的char实例,标准库都为它们定义
了typedef,这样就可以在编程时继续使用cin,cout,cerr等对象,以及istream,ostream,string等类型,不必担心
cin的真实类型是basic_istream<char>以及string的真实类型是
basic_string<char>。
标
准库中很多组件的模板化和上面所建议的大不相同。再看看那个概念上似乎很直观的string。当然,可以基于 "它所包含的字符类型"
确定它的参数,但不同的字符集在细节上有不同,例如,特殊的文件结束字符,拷贝它们的数组的最有效方式,等等。这些特征在标准中被称为traits,它们
在string实例中通过另外一个模板参数指定。此外,string对象要执行动态内存分配和释放,但完成这一任务有很多不同的方法。哪一个最好?选
择:string模板有一个Allocator参数,Allocator类型的对象被用来分配和释放string对象所使用的内存。
这里有一个basic_string模板的完整声明,以及建立在它之上的string类型定义(typedef);可以在<string>头文件中找到它(或与之相当的什么东西):
namespace std {
template<class charT,
class traits = char_traits<charT>,
class Allocator = allocator<charT> >
class basic_string;
typedef basic_string<char> string;
}
注意,basic_string的traits
和Allocator参数有缺省值。这在标准库中是很典型的做法。它为使用者提供了灵活性,但对于这种灵活性所带来的复杂性,那些只想做 "正常"
操作的"典型" 用户却又可以避开。换句话说,如果只想使用象C字符串那样的字符串对象,就可以使用string对象,而不用在意实际上是在用
basic_string<char, char_traits<char>,
allocator<char> >类型的对象。
通常可以这么做,但有时还是得稍稍看看底层。例如,声明一个类而不提供定义具有优点;它还指出,下面是一种声明string类型的错误方法:
class string; // 会通过编译,
先不要考虑名字空间,这里真正的问题在于:string不是一个类,而是一个typedef。如果可以通过下面的方法解决问题就太好了:
typedef basic_string<char> string;
但这又不能通过编译。"所说的basic_string是什么东西?" 编译器会奇怪 ---- 当然,它可能会用不同的语句来问你。所以,为了声明string,首先得声明它所依赖的所有模板。如果可以这么做的话,就会象下面这样:
template<class charT> struct char_traits;
template<class T> class allocator;
template<class charT, class traits = char_traits<charT>,
class Allocator = allocator<charT> >
class basic_string;
typedef basic_string<char> string;
然
而,你不能声明string。至少不应该。这是因为,标准库的实现者声明的stirng(或std名字空间中任何其它东西)可以和标准中所指定的有所不
同,只要最终提供的行为符合标准就行。例如,basic_string的实现可以增加第四个模板参数,但这个参数的缺省值所产生的代码的行为要和标准中所
说的原始的basic_string一致。那到底该怎么办?不要手工声明string(或标准库中其它任何部分)。相反,只用包含一个适当的头文件,
如<string>。
有了头文件和模板的这些知识,现在可以看看标准C++库中有哪些主要组件:
· 标准C库。它还在,还可以用它。虽然有些地方有点小的修修补补,但无论怎么说,还是那个用了多年的C库。
· Iostream。和
"传统"
Iostream的实现相比,它已经被模板化了,继承层次结构也做了修改,增强了抛出异常的能力,可以支持string(通过stringstream
类)和国际化(通过locales)。当然,你期望Iostream库所具有的东西几乎全都继续存在。也就是说,它还是支持流缓冲区,格式化标识符,操作
子和文件,还有cin,cout,cerr和clog对象。这意味着可以把string和文件当做流,还可以对流的行为进行更广泛的控制,包括缓冲和格式
化。
·
String。string对象在大多数应用中被用来消除对char*指针的使用。它们支持你所期望的那些操作(例如,字符串连接,通过
operator[]对单个字符进行常量时间级的访问,等等),它们可以转换成char*,以保持和现有代码的兼容性,它们还自动处理内存管理。一些
string的实现采用了引用计数,这会带来比基于char*的字符串更佳的性能(时间和空间上)。
·
容器。标准库提供了高效的容器实现:vector(就象动态可扩充的数组),list(双链表),queue,
stack,deque,map,set和bitset。但多少可以作为补偿的一点是,
string是容器。这很重要,因为它意味着对容器所做的任何操作对string也适用。
标准库规定了每个类的接口,而且每条接口规范中的一部分是一套性能保证。所以,举例来说,无论vector是如何实现的,仅仅提供对它的元素的访问是不够的,还必须提供 "常量时间" 内的访问。如果不这样,就不是一个有效的vector实现。
很
多C++程序中,动态分配字符串和数组导致大量使用new和delete,new/delete错误 ----
尤其是没有delete掉new出来的内存而导致的泄漏 ----
时常发生。如果使用string和vector对象(二者都执行自身的内存管理)而不使用char*和动态分配的数组的指针,很多new和delete就
可以免于使用,使用它们所带来的问题也会随之消失。
· 算法。标准库就提供了大量简易的方法(即,预定义函数,官方称为算法(algorithm) ---- 实际上是函数模板),其中的大多数适用于库中所有的容器 ---- 以及内建数组(built-in arrays)。
算
法将容器的内容当作序列(sequence),每个算法可以应用于一个容器中所有值所对应的序列,或者一个子序列(subsequence)。标准算法有
for_each(为序列中的每个元素调用某个函数),find(在序列中查找包含某个值的第一个位置,count_if(计算序列中使得某个判定为真的
所有元素的数量),equal(确定两个序列包含的元素的值是否完全相同),search(在一个序列中找出某个子序列的起始位置),(拷贝一个
序列到另一个),unique(在序列中删除重复值),rotate(旋转序列中的值),sort(对序列中的值排序)。注意这里只是抽取了所有算法中的
几个;标准库中还包括其它很多算法。
和容器操作一样,算法也有性能保证。例如,stable_sort算法执行时要求不超过0比较级(N log N) 。(stable_sort提供的性能必须和最高效的通用排序算法在同一个级别。)
· 对国际化的支持。不同的文化以不同的方式行事。和C库一样,C++库提供了很多特性有助于开发出国际化的软件。但虽然从概念上来说和C类似,其实C++的方法还是有所不同。例如,C++为支持国际化广泛使用了模板,还利用了继承和虚函数,这些一定不会让你感到奇怪。
支
持国际化最主要的构件是facets和locales。facets描述的是对一种文化要处理哪些特性,包括排序规则(即,某地区字符集中的字符应该如何
排序),日期和时间应该如何表示,数字和货币值应该如何表示,怎样将信息标识符映射成(自然的)明确的语言信息,等等。locales将多组facets
捆绑在一起。例如,一个关于美国的locale将包括很多facets,描述如何对美国英语字符串排序,如何以适合美国人的方式读写日期和时间,读写货币
和数字值,等等。而对于一个关于法国的locales来说,它描述的是怎么以法国人所习惯的方式完成这些任务。C++允许单个程序中同时存在多个
locales,所以一个应用中的不同部分可能采用的是不同的规范。
·
对数字处理的支持。C++库为复数类(实数和虚数部分的精度可以是float,double或long
double)和专门针对数值编程而设计的特殊数组提供了模板。例如,valarray类型的对象可用来保存可以任意混叠(aliasing)的元素。这
使得编译器可以更充分地进行优化,尤其是对矢量计算机来说。标准库还对两种不同类型的数组片提供了支持,并提供了算法计算内积(inner
proct),部分和(partial
sum),临差(adjacent difference)等。
· 诊断支持。标准库支持三种报错方式:C的断言,错误号,例外。为了有助于为例外类型提供某种结构,标准库定义了下面的例外类(exception class)层次结构:
|---domain_error
|----- logic_error<---- |---invalid_argument
| |---length_error
| |---out_of_range
exception<--|
| |--- range_error
|-----runtime_error<--|---underflow_error
|---overflow_error
logic_error(或它的子类)类型的例外表示的是软件中的逻辑错误。理论上来说,这样的错误可以通过更仔细的程序设计来防止。runtime_error(或它的子类)类型的例外表示的是只有在运行时才能发现的错误。
可以就这样使用它们,可以通过继承它们来创建自己的例外类,或者可以不去管它。没有人强迫你使用它。
上面列出的内容并没有涵盖标准库中的一切。
标准库中容器和算法这部分一般称为标准模板库。STL中实际上还有第三个构件 ---- 迭代子(Iterator)。迭代子是指针似的对象,它让STL算法和容器共同工作。
STL
是标准库中最具创新的部分,这并不是因为它提供了容器和算法(虽然它们非常有用),而是因为它的体系结构。简单来说,它的体系结构具有扩展性:可以对
STL进行添加。当然,标准库中的组件本身是固定的,但如果遵循STL构建的规范,可以写出自己的容器,算法和迭代子,使它们可以和标准STL组件一起工
作,就象标准组件自身之间相互工作一样。还可以利用别人所写的符合STL规范的容器,算法和迭代子,就象别人利用你的一样。使得STL具有创新意义的原因
在于它实际上不是软件,而是一套规范(convention)。标准库中的STL组件只是具体体现了遵循这种规范所能带来的好处。
通过使用标准库中的组件,通常可以避免从头到尾来设计自己的IO流,string,容器,国际化,数值数据结构以及诊断等机制。这就有更多的时间和精力去关注软件开发中真正重要的部分:实现软件的其他功能。
4. C++问题,如何使用标准库
C++标准库的内容基本可以分以下为10类。
C1. 标准库中与语言支持功能相关的头文件
头文件
描 述
<cstddef>
定义宏NULL和offsetof,以及其他标准类型size_t和ptrdiff_t。与对应的标准C头文件的区别是,NULL是C++空指针常量的补充定义,宏offsetof接受结构或者联合类型参数,只要他们没有成员指针类型的非静态成员即可。
<limits>
提供与基本数据类型相关的定义。例如,对于每个数值数据类型,它定义了可以表示出来的最大值和最小值以及二进制数字的位数。
<climits>
提供与基本整数数据类型相关的C样式定义。这些信息的C++样式定义在<limits>中
<cfloat>
提供与基本浮点型数据类型相关的C样式定义。这些信息的C++样式定义在<limits>中
<cstdlib>
提供支持程序启动和终止的宏和函数。这个头文件还声明了许多其他杂项函数,例如搜索和排序函数,从字符串转换为数值等函数。它与对应的标准C头文件stdlib.h不同,定义了abort(void)。abort()函数还有额外的功能,它不为静态或自动对象调用析构函数,也不调用传给atexit()函数的函数。它还定义了exit()函数的额外功能,可以释放静态对象,以注册的逆序调用用atexit()注册的函数。清除并关闭所有打开的C流,把控制权返回给主机环境。
<new>
支持动态内存分配
<typeinfo>
支持变量在运行期间的类型标识
<exception>
支持异常处理,这是处理程序中可能发生的错误的一种方式
<cstdarg>
支持接受数量可变的参数的函数。即在调用函数时,可以给函数传送数量不等的数据项。它定义了宏va_arg、va_end、va_start以及va_list类型
<csetjmp>
为C样式的非本地跳跃提供函数。这些函数在C++中不常用
<csignal>
为中断处理提供C样式支持
C2. 支持流输入/输出的头文件
头文件
描 述
<iostream>
支持标准流cin、cout、cerr和clog的输入和输出,它还支持多字节字符标准流wcin、wcout、wcerr和wclog。
<iomanip>
提供操纵程序,允许改变流的状态,从而改变输出的格式。
<ios>
定义iostream的基类
<istream>
为管理输出流缓存区的输入定义模板类
<ostream>
为管理输出流缓存区的输出定义模板类
<sstream>
支持字符串的流输入输出
<fstream>
支持文件的流输入输出
<iosfwd>
为输入输出对象提供向前的声明
<streambuf>
支持流输入和输出的缓存
<cstdio>
为标准流提供C样式的输入和输出
<cwchar>
支持多字节字符的C样式输入输出
C3. 与诊断功能相关的头文件
头文件
描 述
<stdexcept>
定义标准异常。异常是处理错误的方式
<cassert>
定义断言宏,用于检查运行期间的情形
<cerrno>
支持C样式的错误信息
C4. 定义工具函数的头文件
头文件
描 述
<utility>
定义重载的关系运算符,简化关系运算符的写入,它还定义了pair类型,该类型是一种模板类型,可以存储一对值。这些功能在库的其他地方使用
<functional>
定义了许多函数对象类型和支持函数对象的功能,函数对象是支持operator()()函数调用运算符的任意对象
<memory>
给容器、管理内存的函数和auto_ptr模板类定义标准内存分配器
<ctime>
支持系统时钟函数
C5. 支持字符串处理的头文件
头文件
描 述
<string>
为字符串类型提供支持和定义,包括单字节字符串(由char组成)的string和多字节字符串(由wchar_t组成)
<cctype>
单字节字符类别
<cwctype>
多字节字符类别
<cstring>
为处理非空字节序列和内存块提供函数。这不同于对应的标准C库头文件,几个C样式字符串的一般C库函数被返回值为const和非const的函数对替代了
<cwchar>
为处理、执行I/O和转换多字节字符序列提供函数,这不同于对应的标准C库头文件,几个多字节C样式字符串操作的一般C库函数纳肆被返回值为const和非const的函数对替代了。
<仿庆cstdlib>
为把单字节字符串转换为数值、洞大轿在多字节字符和多字节字符串之间转换提供函数
C6. 定义容器类的模板的头文件
头文件
描 述
<vector>
定义vector序列模板,这是一个大小可以重新设置的数组类型,比普通数组更安全、更灵活
<list>
定义list序列模板,这是一个序列的链表,常常在任意位置插入和删除元素
<deque>
定义deque序列模板,支持在开始和结尾的高效插入和删除操作
<queue>
为队列(先进先出)数据结构定义序列适配器queue和priority_queue
<stack>
为堆栈(后进先出)数据结构定义序列适配器stack
<map>
map是一个关联容器类型,允许根据键值是唯一的,且按照升序存储。multimap类似于map,但键不是唯一的。
<set>
set是一个关联容器类型,用于以升序方式存储唯一值。multiset类似于set,但是值不必是唯一的。
<bitset>
为固定长度的位序列定义bitset模板,它可以看作固定长度的紧凑型bool数组
C7. 支持迭代器的头文件
头文件
描 述
<iterator>
给迭代器提供定义和支持
C8. 有关算法的头文件
头文件
描 述
<algorithm>
提供一组基于算法的函数,包括置换、排序、合并和搜索
<cstdlib>
声明C标准库函数bsearch()和qsort(),进行搜索和排序
<ciso646>
允许在代码中使用and代替&&
C9. 有关数值操作的头文件
头文件
描 述
<complex>
支持复杂数值的定义和操作
<valarray>
支持数值矢量的操作
<numeric>
在数值序列上定义一组一般数学操作,例如accumulate和inner_proct
<cmath>
这是C数学库,其中还附加了重载函数,以支持C++约定
<cstdlib>
提供的函数可以提取整数的绝对值,对整数进行取余数操作
C10. 有关本地化的头文件
头文件
描 述
<locale>
提供的本地化包括字符类别、排序序列以及货币和日期表示。
<clocale>
对本地化提供C样式支持
5. 你们怎么看C标准库和各种操作系统API的关系
c标准库是c标准里规族棚定的c语言要求的函数库,这是为了让标准的c语言具有移植性而规定的,可以由于不同的操作系统的实现方式不同,c标准没有规定其实现,对于不同的编程系统,根据其情况实现全部或部分标准库,迟穗碰有些系统还码谈增加了一些自定义函数。 api是操作系统提供给应用程序的编程接口,他是应用程序实现其它功能的基础,c标准库在特定的操作系统就用这个操作系统来实现一些功能,当然,有些标准库函数可以不用api来实现,这时这种函数在不同系统的实现方式就大致一致,比如strcpy,可有些函数就与api有关,比如绘图函数,这些函数会用系统的绘图api来实现标准的绘图函数,对于这种功能我们可以用c标准库也可以用api。 总的来说,c标准库是个标准,目的是实现程序代码级可移植,api是系统的接口,与操作系统有关,对于不用的系统,c标准库实现是不一样的,有些还需要系统api来实现。用api是为了与系统衔接,实现一些特定的功能,用c标准库是为了代码级可移植。
6. 参考C++标准库中的泛型算法(如find等)设计并实现求最大值的泛型算法max,该算法返回容器中数据的最大值
#include/*算法概要:a1, a2a2取第一个数a1作为组合的第一个数,然后从剩下的数a2an中取r-1个数进行剩下的组合,完成一次循环然后取第二个数a2作为组合的第一个数,然后从剩下的数a3an中取r-2个数进行剩下的组合,完成一次循环依此类推,得到全部的组合。庆茄迅*//* 进行排列输出的主函数 a: n个数据的数组 n: 数据个数 r: 组合的r result: 缓存本次组合的数组 aindex: 当前组合的a下标 resultindex: 当前组合的结果下标*/ void C(int a[], int n, int r, int result[], int aindex, int resultindex){// 如果已经组合够r个数据,输出if (resultindex >= r){for (int x=0; x>n>>誉此r; // 输入组合的n,r值int* a = new int[n];for (int i=0; i>a[i]; // 输入数据}CC(a, n, r); // 组合输出纳游delete[] a;return 0;}
7. [计算机][c语言][编程] 跪求c语言标准库函数的详解(高手请进)!邮箱:[email protected]
推荐:
1.C语言编程宝典
2.C In China
3.网络C语言吧
4.编程中国
5.C语言之家
6.C语言基地
c语言基地 有名校教师 视频 教学
我认为要学好C语言首先必须了解等级考试C语言的大纲和内容,以及各种辅助材料的用途,这是学好C的基础。从以前的经验以及考网上的一些信息可知,要自学C语言必须准备以下资料:
1、 教材:大家现在都公认是清华大学谭浩强主编的那本,当然有其他的也可以,如高校出版社的。
2、 习题集:我认为清华大学的《C语言样题汇编》不错。书后面附有答案。
3、 上机练习:我认为南开大学的那个可以,最好是在考前从头到尾做一遍。答案可以去考网下载区下载。
4、 大纲:这个肯定要的,可以在考网二级版那里去下,然后打印出来。
5、 自学计划:为了做到有计划有目的地学习C语言,大家可以根据自己的学习(或工作)情况,制定一个自学计划,循序渐进地学习。
6、 模拟盘:为了更好地熟悉考场环境,下一个模拟盘是必不可少的,可以在。下载,注意,在下载时要把锁匙盘一起下回来,否则不能进入考试环境。
7、 教学光盘:如果能买到C语言的教学光盘,那当然更好,这样可以更直观地学习C语言了。
下面从微观上针对C语言的几个重点和难点,逐个谈谈具体的自学方法。
二 如何学习C语言的运算符和运算顺序
C语言的运算功能十分丰富,运算种类远多于其它程序设计语言。因此,当多种不同运算组成一个运算表达式,即一个运算式中出现多种运算符时,运算的优先顺序和结合规则显得十分重要。
初学者往往对此感到非常困难,觉得C语言学习太繁杂,其实只要我们对此合理进行分类,找出它们与我们在数学中所学到运算之间的不同点之后,记住这些运算也就不困难了,有些运算符在理解后更会牢记心中,将来用起来得心应手,而有些可暂时放弃不记,等用到时再记不迟。
下面是所有的运算符按优先级不同分类列表:(对不起,因为表格显示不正常,已被我删除大家可以看书上的)
表中列出15种优先级的运算符,从高到低,优先级为1 ~ 15,最后边一栏是结合规则,除第2、3级和第14级为从右至左结合外,其它都是从左至右结合,它决定同级运算符的运算顺序。
下面我们通过几个例子来说明:
(1) 3*20/4%10 这个表达式中出现3种运算符,是同级运算符,运算顺序按从左至右结合,因此先计算3 * 20=60,然后被4除,结果为15,最后是%(求余数)运算,所以表达式的最终结果为15%10 = 5
(2)a = 3;b = 5;c =++ a* b ;d =a + +* b;
例子中的“;”是C语言的语句分隔符,执行顺序为从左到右,第1条语句执行后a的值为3,第2条语句执行后b的值为5,第3条语句中有两个运算符前置+ +和*,按表中所列顺序,+ +先执行,*后执行,所以+ + a执行后,a的值为4,由于+ +为前置运算,所以a的值4参与运算,C的值为20,最后执行第4条语句,由于a + +为后置运算,所以a值为4参与运算,使得d的值仍为20,而a参与运算后其值加1,值为5。
这个例子执行后,a的值为5,b的值为5,c的值为20,d的值也是20。
(3)a = 3,b = 5,b+ = a,c = b* 5
例子中的“,”是逗号结合运算,上式称为逗号表达式,自左向右结合,最后一个表达式的结果值就是逗号表达式的结果,所以上面的逗号表达式结果为40,a的值为3,b的值为8,c的值为40。
三、如何学习C语言的四种程序结构
(1)顺序结构
这种结构的程序比较简单,就是按照语句的排列顺序依次执行的机制。顺序结构的执行顺序是自上而下,依次执行,因此编写程序也必须遵守这一规定,否则你的程序执行结果就不对。
例如;a = 3,b = 5,现交换a,b的值,正确的程序为:
c = a;
a = b;
b = c;
执行结果是a = 5,b = c = 3如果改变其顺序,写成:
a = b;
c = a;
b = c;
则执行结果就变成a = b = c = 5,不能达到预期的目的,这是初学者常犯的错误。
顺序结构可以独立使用构成一个简单的完整程序,常见的输入、计算,输出三步曲的程序就是顺序结构,例如计算圆的面积,其程序的语句顺序就是输入圆的半径R,计算S = 3.14159*R*R,输出圆的面积S。而大多数情况下顺序结构都是作为程序的一部分,与其它结构一起构成一个复杂的程序,例如分支结构中的块体、循环结构中的循环体等。
C语言自学方法(2)
(2) 分支结构
分支结构与顺序结构不同,其执行是依据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序。分支结构的程序设计方法的关键在于构造合适的分支条件和分析程序流程,根据不同的程序流程选择适当的分支语句。
分支结构适合于带有逻辑条件判断的计算,设计这类程序时往往都要先绘制其程序流程图,然后根据程序流程写出源程序,这样做把程序设计分析与语言分开,使得问题简单化,易于理解。程序流程图是根据解题分析所绘制的程序执行流程图。
学习分支结构不要被分支嵌套所迷惑,只要弄清基本的分支结构,嵌套结构也就不难了。嵌套只不过是分支块体中又包括分支语句而已,不是新知识,只要你基础知识扎实,分支嵌套也难不住你,下面我们重点讨论几种基本的分支结构的学习方法。
①If(条件)
{
块
}
这种分支结构中的块可以是一条语句,此时“{
}”可以省略,也可以是多条语句。它有两条分支路径可选,一条是条件为真,执行块,另一条是条件不满足,跳过块。
如,计算x的绝对值,根据绝对值定义,我们知道,当x>=0时,其绝对值不变,而x<0时其绝对值是为x的反号,因此程序段为:if(x<0)
x=-x;
②if(条件)
else
这是典型的分支结构,如果条件成立,执行块1,否则执行块2,块1和块2都有1条或若干条语句构成。
如:求ax^2+bx+c=0的根
分析:因为当b^2-4ac>=0时,方程有两个实根,否则(b^2-4ac<0)有两个共轭复根。其程序段如下:
d=b*b-4*a*c;
if(d>=0)
{x1=(-b+sqrt(d))/2a;
x1=(-b-sqrt(d))/2a;
printf(“x1=%8.4f,x2=%8.4f\n”,x1,x2);
}
else
{r=-b/(2*a);
i =sqrt(-d)/(2*a);
printf(“x1=%8.4f+%8.4fi\n”r, i);
printf(“x2=%8.4f-%8.4fi\n”r,i)
}
③多路分支:其语句格式为:
if(条件1) ;
else if(条件2)
else if(条件3)
……
else if(条件n)
else
④switch语句:
switch
语句也是多分支选择语句,又称为多路开关语句,到底执行哪一块,取决于开关设置,也就是表达式的值与常量表达式相匹配的那一路,它不同if—else 语句,它的所有分支都是并列的,程序执行时,由第一分支开始查找,如果相匹配,执行其后的块,接着执行第2分支,第3分支……的块,直到遇到break语句;如果不匹配,查找下一个分支是否匹配。
(3)循环结构:
循环结构可以减少源程序重复书写的工作量,用来描述重复执行某段算法的问题,这是程序设计中最能发挥计算机特长的程序结构,C语言中提供四种循环,即goto循环、while循环、do –while循环和for循环。
四种循环可以用来处理同一问题,一般情况下它们可以互相代替换,但一般不提昌用goto循环,所以下面我们重点讲解另外的三种循环。
常用的三种循环结构学习的重点在于弄清它们相同与不同之处,以便在不同场合下使用,大家好好看一下书中三种循环的格式和执行顺序,如何替换使用,如把while循环的例题,用for语句重新编写一个程序,这样能更好地理解它们的作用。
注意:在while和do—while循环体内和for
循环中的第3语句中,应包含趋于结束的语句(如I++,I--),否则就可能成了一个死循环,这也是初学者的一个常见错误。
下面我们来讨论下这三种循环的异同之处:
用while和do—while循环时,循环变量的初始化的操作应在循环体之前,而for循环是在语句1中进行的;while
循环和for循环都是先判断表达式,后执行循环体,而do—while循环是先执行循环体后判断表达式,也就是说do—while的循环体最少被执行一次,而while
循环和for就不一定了。这三种循环都可以用break语句跳出循环,用continue语句结束本次循环,而goto语句与if构成的循环,不能用break和
continue语句进行控制。
这三种结构并不是彼此孤立的,在循环中可能出现分支、顺序结构,分支中也可能出现循环、顺序结构而把循环、分支看成一个语句,它又是构成顺序结构的一个元素,因此这三种结构相互结合,就能实现各种算法,设计出解题程序,但若是很大的题目,这样编出的程序往往很长,重复结构多,并且可阅读性差,因此我们常将C程序设计成模块化结构。
(4)模块化程序结构
C语言的模块化程序结构用函数来实现,即将复杂的C程序分为若干模块,每个模块都编写成一个合法的C函数,然后用主函数调用函数及函数调用函数实现一大C程序:C程序=主函(main)+若干个函数。
在程序设计中,常将一些常用的功能模块写成函数,也可以将大程序段分割成若干函数,前者目的在于减少重复编写程序段的工作量,后者目的在于缩短模块长度,以便程序阅读方便。
一个源程序文件由一个或多个函数组成,它是一个编译单位,而一个C程序由一个或多个源程序文件组成。对较大的程序,往往分成多个文件,这样可以分别编写、分别编译,提高高调试效率,一个源程序文件可以被多个C程序公用。
C程序的的执行是从main()函数开始,调用其它函数后流程回到main函数,在main中结束整个函数运行,main函数的称是系统规定的,用户可以修改其内容即函数体,但不能修改其名称和参数,一个C程序必须有一个main函数,也只能有一个main函数。
所有函数都是平行的,即在定义函数时是互相独立的一个函数度不从属于另一个函数,即函数不能嵌套定义,但可以互相调用,但不能调用main函数。
函数分成两类,即标准函数和用户自定义函数,标准函数又称库函数,由系统提供,用户可直接调用,C语言提供了丰富的库函数,请考生在编写C程序时查阅教材后的函数说明,这可节省你的编程工作量;用户自定义函数由编程者自己编写.
回答者:阿拉蕾啊呀 - 试用期 一级 7-23 11:13
提问者对于答案的评价:
太好了,非常感谢!
评价已经被关闭 目前有 1 个人评价
好
100% (1) 不好
0% (0)
对最佳答案的评论
19798802 C语言新手群快加入吧!!!!!!1
评论者: 549045259 - 见习魔法师 二级
浮躁的人容易问:我到底该学什么;----别问,学就对了;浮躁的人容易说:我要中文版!我英文不行!----不行?学呀!浮躁的人分两种:只观望而不学的人;只学而不坚持的人;浮躁的人永远不是一个高手。
评论者: hnytgl - 试用期 一级
其他回答共 4 条
1.读代码!
2.改代码!
3.写代码!
回答者:liuding1213 - 见习魔法师 二级 7-18 21:10
找一本经典教材,例如谭浩强的《C语言陈序设计》。
找一本习题集,要有全部详细解释的那种,最好有实例的代码答案。
花一个月把课本看完,务求理解。不理解的地方也不要死抠,做上标记等以后再解决。然后开始做题,不要因为题目简单就放过,往往简单背后蕴藏大的发现。也可以快速看完书,然后复习,每复习完一章后把习题集上的题目好好做一遍。
做题时最好在计算机上把不明白的地方亲自实践一下,然后在笔记本上写下自己的感想和心得。考试前翻一翻笔记即可。
千里之行始于足下,行动吧!
你的串号我已经记下,采纳后我会帮你制作
8. c++标准库有哪些
C++标准库函数
c++程序通常可以调用标准c++库中的大量函数。这些函数完成一些基本的服务,如输入和输出等,同时也为一些经常使用的操作提供了高效的
实现代码。这些函数中含有大量的函数和类定义,以帮助程序员更好地使用标准c++库。
标准c++库包含以下内容:
,,,,,,,,,,,,<iterat
or>,,,,,,,,,,,,,,<strin
ig>,,,,,,,,,,,,,<cse
tjmp>,,,,,,,,,和
标准c++库的详细消息均在其对应的头文件进行了说明。主要标准c++库头文件如下所示。其中13项为标准模板库(STL),在其说明文字的前面标有(STL)的为标准模板库。
---(STL)用于定义实现常用、实用算法的大量模板
----- 用于定义官位位集合的模板类
-----用于在程序执行时执行断言
-----用于对字符进行分类
-----用于测试有库函数提交的错误代码
------用于测试浮点类型属性
----用于在ISO646变体字符集中编程
-----用于测试整数类型属性
-----用于使程序适应不同的文化风俗
———用于计算常用的数学函数
-----用于定义支持复杂算法的模板类
-----用于执行非局部的goto语句
------用于控制各种异常情况
-----用于访问参数数量文化的函数
-----用于访问参数数量变化的函数
----用于定义实用的类型和宏
-----用于执行输入和输出
----用于执行同一操作的不同版本
-----用于处理几种不同的字符串类型
------用于在几种不同的时间和日期格式间进行转换
----用于处理宽流(wide stream)和字符串
---用于对宽字符(wide character是)分类
---(STL)用于定义实现双向队列容器的模板类
---用于定义控制异常处理的几个函数
-----用于定义处理外部文件的几个iostream模板类
-----(STL)用于定义几个模板,该模板将帮助在和中定义的 模板构造谓词
---- 用于声明一个带有参数的iostreams控制器
-----用于定义用作大量iostreams类的基类的模板类
-----用于定义iostreams模板类(在需要定义之前)
---用于声明处理标准流的iostreams对象
---用于定义执行析取操作的模板类
----(STL)用于定义帮助定义和管理迭代器的模板
---用于测试数字类属性
---(STL)用于定义实现list容器的模板类
----用于定义在iostreams类中控制与特定位置相关的行为的类和模板
------(STL)用于定义实现关联容器的模板类
-----(STL)用于定义对不同容器分配和释放内存的模板
-----(STL)用于定义实现实用数字函数的模板
----用于定义管理字符串容器的iostreamas模板类
----(STL)用于实现队列容器的模板类
-----(STL)用于定义实现只有唯一元素的关联容器的模板类
----用于定义管理字符串容器的iostreams模板类
-----(STL)用于定义实现堆栈容器的模板类
----用于定义提交异常的类
----用于定义为iostreams操作分配缓冲区的模板类
------用于定义是实现字符串容器的模板类
-----用于定义处理非内存(in-memory)字符系列的iostreams类
-----(STL)用于定义通用工具的模板
----用于定义支持值(value-oriented)数组的类和模板类
----(STL)用于定义实现向量容器的模板类
标准c++库还包括18个标准C库中的头文件,但其中有些变化。我们暂时不讨论,这些头文件为:
---用于在程序运行时执行断言
----用于对字符分类
----用于测试用库函数提交的错误代码
----用于测试浮点类型属性
-----用于在IOS646变体字符集中编程
-----用于测试整数类型属性
-----用于适应不同的文化习俗
----用于计算常见的数学函数
----用于执行非局部的goto语句
----用于控制各种异常情况
-----用于访问参数数量变化的函数
-----用于定义类型和宏
------用于执行输入和输出
------用于执行各种操作
-----用于处理字符串
-------用于在不同的时间和日期格式之间转换
-----用于处理宽流(wide stream)和字符类
-----用于对宽字符(wide character)分类
原载地址:http://blog.csdn.net/wh0826/article/details/5380634
分类: C & C++
9. C++标准库主要就指STL吗
关于STL的定义,不同人理解不一。现在有人直接把 STL 定义为“the standard library”,但通常而言, STL 指的是标准库的容器、迭代器、算法这几个部分,而这远不是C++标准库的全部内容。
在C++开始标准化之时,一个名叫SGI STL的库被标准委员会投入极大关注,后来被吸收进C++标准库,主要构成 C++ 标准库的容器库(Containers library)、迭代器库(Iterators library)、算法库(Algorithms library)部分。因此后人有时就直接用 STL 指代标准库的容器、迭代器、算法这几个部分。
但是C++标准库并非只含有容器、迭代器、算法这几个部分,其他的还有每个新手都会用到的输入输出库(Input/output library,iostream、fstream都属于这里),以及字符串库(Strings library)、异常诊断库(Diagnostics library,包括 std::logic_error、std::runtime_error等异常类,assert这样的工具也属于这里)、数值运算库(Numerics library,包括 std::complex 以及相关的复数运算,随机数生成等)、语言支持库(Language support library)、Localization library等,以及C++11加入的正则表达式库(Regular expressions library)、原子操作库(Atomic operations library)、线程支持库(Thread support library),和不好归类的“通用工具库”(General utilities library)等
显然我们不能说“容器、迭代器、算法”就是C++标准库的全部,把“容器、迭代器、算法”说成C++标准库的主要部分恐怕也是有问题的