第4章数组和字符串
字符数组和字符串
![字符数组和字符串](https://img.taocdn.com/s3/m/48be9e5e03768e9951e79b89680203d8ce2f6ab0.png)
* ** ** ** *
}
main() a
{ char a[5]; int i=0;
b
while(i<=4)
c
{ scanf(“%c”,&a[i]);
c
i
{ char a[5]; int i=0
跳格分隔。因此不要试图利用scanf函数从键盘输入
How are you? 赋给一个字符串。
1.5 字符数组处理函数
1.字符串输入gets()函数 使用形式: gets(字符数组) 功能:从终端输入一个字符串(直到回车键) 到字符数组中。
例如:char str[20]; gets(str); 若从键盘输入:Hello World! 则将字符串“Hello World!”送到字符数组str中。
输出:10 char str[80]={“ab\n\0y\012/\\\””} ; printf(“%d”,strlen(str)) ;
输出:3
4.字符串连接strcat()函数
使用形式: strcat(字符数组1,字符串2)
如:“china” 占内存6个字节,但字符串长度 是5 在C语言中用字符数组来处理字符串,每个 元素存放一个字符型数据。
字符型数组可用一般数组的初始化方式初始化 外,还可以使用字符串常量初始化:
如:char message[]={“Hello”}; √ 或 char message[]=“Hello”; √
说明:字符数组本身并不要求它的最后一个元素一
定是‘\0’,例如:char ch[2]={‘A’, ‘B’};是合法的。 当定义字符数组用字符串常量赋初值时,最后有一 个元素其值为‘\0’。为了使处理方法一致,在字符 数组中也常常人为地加上一个值为‘\0’的元素。
数据结构第4章 串
![数据结构第4章 串](https://img.taocdn.com/s3/m/e8ca512d793e0912a21614791711cc7930b7787c.png)
/*若串s和t相等则返回0;若s>t则返回正数;若s<t则返 回负数*/
{ int i;
for (i=0;i<s.len&&i<t.len;i++)
if (s.ch[i]!=t.ch[i]) return(s.ch[i] - t.ch[i]);
初 始 条 件 : 串 S 存 在 ,1≤pos≤StrLength(S) 且 1≤len≤StrLength(S)-pos+1
操作结果:用Sub返回串S的第pos个字符起长度为len的子串
返回主目录
(11)StrIndex(S,T,pos)
初始条件: 串S和T存在,T是非空串, 1≤pos≤StrLength(S)
return(s.len); }
返回主目录
(7)清空函数
StrClear(SString *s) /*将串s置为空串*/ {
s->len=0; }
返回主目录
(8)连接函数
(1) 连接后串长≤MAXLEN,则直接将B加在A的 后面。 (2) 连接后串长>MAXLEN且LA<MAXLEN,则B 会有部分字符被舍弃。 (3) 连接后串长>MAXLEN且LA=MAXLEN,则B 的全部字符被舍弃(不需连接)。
for (i=s->len + t.len-1;i>=t.len + pos;i--)
s->ch[i]=s->ch[i-t.len];
for (i=0;i<t.len;i++) s->ch[i+pos]=t.ch[i];
s->len=s->len+t.len;
数据结构第4章数组和串
![数据结构第4章数组和串](https://img.taocdn.com/s3/m/340d9a8aa0116c175f0e48db.png)
● 教学目的:理解抽象数据类型数组的概念, 掌握数组的不同存储结构的实现及应用,了 解广义表的相关概念,掌握串的逻辑结构、 存储结构及其基本运算。
● 教学重点:数作在不同 存储结构上的实现。 ● 教学难点:带状矩阵的压缩存储;稀疏矩 阵的三元组表实现及其转置算法,堆结构的 串操作实现;串的模式匹配算法。
矩阵的压缩存储
printf("Array a:\n"); k=0; for(i=0;i<N;i++)//输出矩阵A { for(j=0;j<N;j++) if(i<j)printf("%5d",sa[M-1]); else printf("%5d",sa[i*(i+1)/2+j]); printf("\n"); } printf("Array b:\n"); k=0; for(i=0;i<N;i++)//输出矩阵B { for(j=0;j<N;j++) if(i>j)printf("%5d",sb[M-1]); else printf("%5d",sb[j*(j+1)/2+i]); printf("\n"); }}
矩阵的压缩存储
由此可见,要唯一表示一个稀疏矩阵,在存储三 元组表的同时还需存储该矩阵总的行数、列数及非 零元个数。 练习:写出图4-9(a)所示稀疏矩阵的三元组表。
三元组表(也是线性表)的存储方式主要有两种: 顺序存储和链式存储,从而可引出稀疏矩阵的两种 压缩存储方法:三元组顺序表和十字链表。 3、三元组顺序表
矩阵的压缩存储
Java字符串与数组
![Java字符串与数组](https://img.taocdn.com/s3/m/3a417fdf32d4b14e852458fb770bf78a65293a86.png)
Java字符串与数组问题及答案来源⾃《Java程序员⾯试笔试宝典》第四章 Java基础知识 4.5字符串与数组1、字符串创建与存储的机制是什么?Java中字符串声明与初始化主要有两种情况:(1)String s1 = new String("abc")与String s2 = new String("abc")语句执⾏String s1 = new String("abc")语句,字符串池中不存在"abc",则会创建⼀个字符串常量"abc",并将它添加到字符串常量池中,然后new String()会在堆中创建⼀个新的对象,s1指向堆中的String对象紧接着创建String s2 = new String("abc")语句,因为字符串常量池中已经有了字符串常量"abc",所以不会再创建"abc",直接new String()在堆中创建⼀个新的对象,然后使⽤s2指向这个对象s1与s2指向堆中的不同String对象,地址⾃然也不相同(2)String s1 = "abc"语句与String s2 = "abc"语句在JVM中存在着⼀个字符串常量池,其中保存了着很多String 对象,s1,s2引⽤的是同⼀个常量池中的对象。
当创建⼀个字符串常量时,例如String s1 = "abc",会⾸先在字符串常量池中查找是否已经有相同的字符串被定义,若已经定义,则直接获取对其的引⽤,此时不需要创建字符串常量"abc",如果没有定义,则⾸先创建字符串常量"abc",然后把它加⼊到字符串池中,再将引⽤返回例⼦1:String s1 = new String("abc"); // 先查找常量区有⽆"abc"常量,若⽆则将其"abc"添加到常量区,再在堆中创建对象,将s1指向堆中的对象String s2 = new String("abc"); // 发现在常量区已经有了"abc",在堆中创建对象,将s2指向堆中的对象例⼦2:String s1 = "abc"; // 在常量区⾥⾯创建⼀个"abc"字符串对象,s1获取对其的引⽤String s2 = "abc"; // 发现在常量区已经有了"abc",s2直接获取对其的引⽤引申 - 对于String类型的变量s,赋值语句s=null和赋值语句s=""有什么区别?s=null,是指s不指向任何⼀个字符串;s=""中的s指向空字符串笔试题 - new String("abc")创建了⼏个对象?⼀个或两个,如果常量池中原来就有"abc",那么只创建⼀个对象,否则创建两个对象2、==、equals和hashCode有什么区别?==:是运算符,⽤于⽐较两个变量是否相等。
程序:第04章:数组和字符串
![程序:第04章:数组和字符串](https://img.taocdn.com/s3/m/b709e11559eef8c75fbfb371.png)
第4章数组和字符串程序4.1 一维数组类#include <assert.h>template <class T>class Array1D{public:Array1D(int sz=0); //缺省时长度为0 ~Array1D(){ delete []elements; }T& operator [](int i)const; //取元素值 Array1D<T>&operator=(const Array1D<T> &r); //整体赋值friend istream &operator>>(istream &in, Array1D<T> &r);friend ostream &operator<<(ostream &out, const Array1D<T> &r);private:int size;T *elements; //指向T类型数组的指针};template <class T>Array1D<T>::Array1D(int sz){assert(sz>=0); //越界检查 size=sz;elements=new T[sz];}template <class T>T& Array1D<T>::operator [](int i)const{assert(i>=0&&i<size); //越界检查return elements[i];}template <class T>Array1D<T>& Array1D<T>::operator=(const Array1D<T> &r) //数组r整体赋值给this {if(this!=&r) { //防止自我赋值size=r.size;delete []elements; //释放原空间elements=new T[size]; //重新分配空间for(int i=0; i<size; i++)elements[i]=r.elements[i]; //复制元素}return *this;}template <class T>istream &operator>>(istream &in, Array1D<T> &r){cout<<"Intput array\n";for(int i=0; i<r.size; i++) in>>r.elements[i];return in;}template <class T>ostream &operator<<(ostream &out, const Array1D<T> &r){cout<<"Array=";for(int i=0; i<r.size; i++) out<<r.elements[i]<<' ';out<<endl;return out;}程序4.2应用一维数组类的主程序#include "array1d.h"void main(){Array1D<int> a(5),b(8);Array1D<int> c; //采用缺省长度0 cin>>a; cout<<"a "<<a;cin>>b; cout<<"b "<<b;cout<<"c "<<c;cout<<"a[0]="<<a[0]<<"; "<<"b[5]="<<b[5]<<endl;c=b; cout<<"c=b, c "<<c;b=a; cout<<"b=a, b "<<b;}程序4.3稀疏矩阵类template <class T>class SparseMatrix{public:SparseMatrix(int maxRowSize, int maxColSize){};~SparseMatrix(){};virtual void Add(const SparseMatrix <T> &B, SparseMatrix <T> &C) const;virtual void Mul(const SparseMatrix <T> &B, SparseMatrix <T> &C) const;virtual void Transpose(SparseMatrix <T> &B)const;private:int maxRows, maxCols;};程序4.4 Term结构template <class T>struct Terms{int row,col;T value;};程序4.5行三元组表示的稀疏矩阵的C++类template <class T>class SeqTriple{public:SeqTriple(int mSize);~SeqTriple(){ delete [] trip; };void Add(const SeqTriple<T> &B, SeqTriple<T> &C) const;void Mul(const SeqTriple<T> &B, SeqTriple<T> &C) const;void Transpose(SeqTriple<T> &B)const;friend istream &operator >>(istream &input, const SeqTriple <T> &);friend ostream &operator <<(ostream &output, const SeqTriple <T> &);private:int maxSize; //最大元素个数int m,n,t; //稀疏矩阵的行数、列数和非零元素个数 Term<T> *trip; //动态一维数组的指针};程序4.6稀疏矩阵的快速转置template <class T>void SeqTriple<T>::Transpose(SeqTriple<T>& B)const{ //将this①转置赋给Bint *num=new int[n]; int *k=new int[n]; //为num和k分配空间B.m=n; B.n=m; B.t=t;if (t>0){for (int i=0; i<n; i++) num[i]=0; //初始化numfor (i=0; i<t; i++) num[trip[i].col]++; //计算numk[0]=0;for(i=1; i<n; i++) k[i]=k[i-1]+num[i-1];//计算kfor(i=0; i<t; i++) { //扫描this对象的三元组表int j=k[trip[i].col]++; //求this对象的第i项在B中的位置jB.trip[j].row=trip[i].col; //将this对象的第i项转置到B的位置jB.trip[j].col=trip[i].row;B.trip[j].value=trip[i].value;}}delete [] num; delete [] k;}程序4.7字符串类#include <string.h>class String{public:String();String(const char *p);~String(){ delete [] str; };int Find(int i, String &P);private:int n; //当前串长char *str; //动态一维字符数组的指针};String::String(const char *p){n=strlen(p);str=new char[n+1];strcpy(str, p);}程序4.8 简单匹配算法int String::Find(int i, String &P){if (i<0 || i>n-1) { //越界检查cout<<"Out of bounds!"<<endl;return -1;}char *pp=P.str, //模式串指针pp指向第1个字符char *t=str+i; //主串指针t指向下标i的字符while (*pp!='\x0'&&i<=n-P.n) //pp未到串尾同时剩余字符数超过模式串长,则循环if (*pp++!=*t++) {pp=P.str; //模式串回到第1个字符t=str+(++i); //主串回到i+1的位置}if (*pp=='\0') return i; //若pp已到串尾,则匹配成功return -1;}程序4.9 KMP算法的C++程序(设串P的f值已求得)int String::FindKMP(int i, String &P){if (i<0 || i>n-1) { //越界检查cout<<"Out of bounds!"<<endl;return -1;}int j=0, m=P.n;while (i<n&&j<m)if (j==-1||str[i]==P.str[j]) {i++; j++; //相等或j=-1时,i、j均后移1个位置 }else j=P.f[j]; //到达失配点, j回溯到f[j]return ((j==m)?i-m:-1);}程序 4.10 失败函数的C++程序void String::Fail(){ // 计算失败函数int j=0,k=-1;f[0]=-1;while (j<n)if ((k==-1) || (str[j]==str[k])){j++; k++; //k==-1或str[j]==str[k]时,j,k各扩展1位,j无回溯f[j]=k; //求得的k存入f[j]}else k=f[k]; //str[j]不等于str[k]时,k回溯到f[k] }程序4.11改进的失败函数的C++程序void String::Fail (){int j=0,k=-1;f[0]=-1;while (j<n)if ((k==-1) || (str[j]==str[k])){j++; k++; //当k=-1或str[j]=str[k]时,j,k各扩展1位 if (str[j]==str[k]) f[j]=f[k]; //将字符p k和p j比较,若相等则将f[k]存入f[j] else f[j]=k; //否则求得的k存入f[j]}else k=f[k]; //str[j]不等于str[k]时,k回溯到f[k],j无回溯}。
第4章:数组和字符串
![第4章:数组和字符串](https://img.taocdn.com/s3/m/10fb3f8983d049649b6658f2.png)
4.1.1一维数组
2. 创建一维数组
创建一维数组就是为数组分配存储空间,需指定数组长度。 数组创建后,数组名就标识用于存储数组元素的存储空间(引用)。 创建一维数组的3种方法:
(1) 先声明后创建
数组元素类型 数组名[]; 数组名 = new 数组元素类型[元素个数] ; 如:int intArray []; intArray = new int[5];4.2.3 字符串基本操作
字符串比较的注意事项:
表达式 str1.equals(str2)与表达式 str1==str2 的差异 在于:
• 前者表示所引用的两个字符串的内容是否相同, • 后者表示str1 与 str2是否引用同一个对象。 【实战编程技巧:如何避免潜在的空指针异常】
练习题
4.1 数组
4.2 字符串
4.1 数组
数组是将一组相同类型的数据顺序存储,组成的一 种复合数据类型。 数组的特点:
数组中的所有元素的数据类型相同。 数组中的元素连续顺序存储。 数组中每个元素按存储顺序对应一个下标,下标从0开始顺序编号 ,引用数组元素通过数组名和它的下标确定。 数组有一维数组和多维数组之分,数组元素的下标个数确定数组的 维数。
练习题
【真题练习】设有数组a和b的定义如下: int[]a={1,2,3}; int[]b={4,5,6} …… 执行以下代码“a=b;”,除了完成赋值操作之外,引起 系统额外要做的工作是_________。
第四章 labview数组字符串和簇
![第四章 labview数组字符串和簇](https://img.taocdn.com/s3/m/814993d033d4b14e852468c6.png)
第3页
《虚拟仪器》 虚拟仪器》
4.1 数组
数组是同一类型数据的集合。 数组是同一类型数据的集合。 LabVIEW中的数组可以为任何数值类型、布尔型、字符串。 LabVIEW中的数组可以为任何数值类型、布尔型、字符串。 一个数组可以是一维的,在内存允许的情况下,也可以是多维的, 每维最多可以包含2 每维最多可以包含231个元素。 可以通过数组指针(索引index)访问数组元素,指针在0 可以通过数组指针(索引index)访问数组元素,指针在0到N-1的范 围内变化,而N就是数组元素的个数。 例:10 例:10元素的一维数组 10元素的一维数组
数组函数举例
求数组的大小 检索数组,得到指定位置的元素或子数组 检索数组,
第25页
《虚拟仪器》 虚拟仪器》
替换数组一个元素或行、列 替换数组一个元素或行、
第26页
《虚拟仪器》 虚拟仪器》
例:设计一个VI,产生9 例:设计一个VI,产生9个随机数组成的数组,先倒序排列,按从小到大 排列,并且求出最大值、最小值。
第38页
《虚拟仪器》 虚拟仪器》
不可显示字符代码表
代 码 \b \s \r \n \t 含 义 Backspace (ASCII BS, equivalent to \08) Space Return (ASCII SP, equivalent to \20) (ASCII CR, equivalent to \0D)
《虚拟仪器》 虚拟仪器》
《虚拟仪器》 虚拟仪器》
内蒙古科技大学信息学院 测控技术教研室 xjs2007@
《c++程序设计》第4章 数组
![《c++程序设计》第4章 数组](https://img.taocdn.com/s3/m/be6f2e1ca1c7aa00b52acbe1.png)
赋给另一个字符数组,只能用字符串复制函数来处理。例如下面操作是非法的: str2="C++ program"; str1=str2;
4.1 数组的定义与使用
4.1.1 一维数组的定义和使用
1.一维数组的定义与初始化赋值 (1)一维数组的定义
定义格式为:
〔存储类型〕 <类型> <数组名>[<常量表达式>]; 例:int a[10];
表示定义一个名为a的整型数组,有10个元素,分别为a[0]、a[1]、 a[2]、a[3]、a[4]、a[5]、a[6]、a[7]、a[8]、a[9] 。
int a[ ][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; 或: int a[ ][4]={1,2,3,4,5,6,7,8,9,10,11,12};
二维数组的初始化赋值
② 给数组的部分元素赋初值 给数组的部分元素赋初值的方法与给数组的所有元素赋初值的方法 类似。
3.字符串连接函数strcat()
格式:strcat(<字符数组1>,<字符串2>) 功能:将字符串2连接到字符数组1中的字符串后,其结果存放在字符数组1中。 例如:
char str1[30]="I am a "; char str2[]="student."; strcat(str1,str2); 则字符数组1的内容为"I am a student."。 说明: (1)字符数组1必须是字符数组名,字符串2可以是字符数组名,也可以是字符串常量; (2)字符数组1必须足够大,以便容纳连接后的新字符串; (3)连接时字符串1之后的'\0'取消,只在新字符串最后保留一个'\0'。
C语言数组试题
![C语言数组试题](https://img.taocdn.com/s3/m/3f09da7df242336c1eb95e2a.png)
第4章 数组4.1内容概述本章主要介绍了数值数组和字符数组的定义、初始化、元素引用和数组数据的输入与输出,字符数组实现字符串、字符串函数的实现与调用。
指针数组与数组指针定义、元素引用。
利用一维数组实现如挑数、排序、求和等实际应用问题。
利用二维数组实现矩阵的应用问题。
利用字符数组实现字符串的各种操作。
本章知识结构如图4.1所示。
图4.1 第4章知识结构图考核要求:掌握一维数组、二维数组、字符数组和指针数组的定义和初始化;掌握数组元素存储地址计算;掌握数组元素的下标法、指针法引用;掌握字符数组与字符串的区别与联系;掌握有关字符串处理函数的使用方法;能利用一维数组、二维数组解决向量、矩阵等实际应用问题。
重点难点:本章的重点是一维数组、二维数组和字符数组的定义、初始化、元素引用,字符串处理函数的使用。
本章的难点是字符串与字符数组的区别,指针数组和数组元素的指针法引用。
核心考点:数组的定义、初始化和数组元素的引用方法,一维数组、二维数组和字符数组的实际应用,字符串的处理方法。
4.2 典型题解析【例4.1】以下对一维数组a 的定义中正确的是( )。
A. char a(10);B. int a[0..100];C. int a[5];D. int k=10;int a[k];解析:一维数组定义的一般形式为:类型标识符 数组名[常量表达式]其中,常量表达式可以是任意类型,一般为算术表达式,其值表示数组元素的个数,即数组长度。
答案:C【例4.2】以下对一维数组的定义中不正确的是( )。
A. double x[5]={2.0,4.0,6.0,8.0,10.0};数组数值数组 定义 初始化 元素引用 数组元素输入和输出 指针数组 定义初始化 应用字符数组 定义 初始化 元素引用 数组元素输入和输出B. int y[5]={0,1,3,5,7,9};C. char ch1[ ]={'1', '2', '3', '4', '5'};D. char ch2[ ]={'\x10', '\xa', '\x8'};解析:可以对一维数组的全部元素或部分元素赋初值。
《MATLAB程序设计》第4章数组及应用
![《MATLAB程序设计》第4章数组及应用](https://img.taocdn.com/s3/m/81448b38eefdc8d376ee326b.png)
0x0012FF68 a[0] 0x0012FF6C a[1] 0x0012FF70 a[2] 0x0012FF74 a[3]
数组元素
0x0012FF78 a[4]
0x0012FF7C a[5]
8
一维数组在内存中的存储形式
说明:
(1)数组名a表示内存首地址,是地址常量。
(2)数组a中每个数组元素占的内存空间根据 数组类型确定,整个数组占的内存为:数组元 素个数乘以每个元素所占内存空间如: int a[10]; 4×10=40 float b[20]; 4×20=80 double c[5]; 8×5=40 char d[8]; 1×8=8
第4章 数组
教学内容
数组的定义及应用
字符串处理函数
几个常用算法:排序算法(选择排序、
冒泡排序)
1
第4章 数组
重点、难点
数组的定义及应用
常用算法的设计(选择排序、
冒泡排序)
2
第4章 数组
教学目标
熟练掌握数组的定义及应用
掌握字符数组的定义及应用
掌握常用的字符串处理函数
熟练掌握几个常用算法:排序
算法(选择排序、冒泡排序)
分析:所谓转置就是将矩阵的行列互换,即将 a矩阵 的a[i][j]元素变成b矩阵的b[j][i]。
24
#include <iostream> using namespace std; int main() { int a[3][4] ={{1,2,3,4},{3,4,5,6},{5,6,7,8}}; int b[4][3],i,j; for(i=0;i<3;i++) //输出二维数组a[3][4] { for(j=0;j<4;j++) cout<<a[i][j]<<" "; cout<<endl; } for(i=0;i<4;i++) //将矩阵a转置给矩阵b for(j=0;j<3;j++) b[i][j]=a[j][i]; for(i=0;i<4;i++) //输出二维数组b[4][3] { for(j=0;j<3;j++) cout<<b[i][j]<<" "; cout<<endl; } return 0;}
第四章_数组
![第四章_数组](https://img.taocdn.com/s3/m/b0b4ae46cf84b9d528ea7abc.png)
4.2
多维数组
下列程序段实现对数组 int s[3][5]的动态赋值: 4.2.3 二维数组元素的引用 for(i=0; i<=2; i++) /* 行标i从0开始变化到2*/ 二维数组的元素也称为双下标变量,其表示的形式为: for(j=0; j<=4; j++) /* 列标j从0开始变化到4*/ 数组名 ][ 列下标 ] scanf( “%d”[ , 行下标 &s[i][j]) ; /*二维数组元素如同普通 其中下标应为整型常量或整型表达式,其取值范围从 整型变量操作*/ 0开始,分别到行数 -1和列数-1。 例如: a[3][4] 通过前面的学习,对数组也可以这样理解:单个变量描述 了空间中‚点‛的概念,一维数组是对单个变量的扩展,它描 表示a数组中行标为3,列标为4的元素。 述了空间中‚线‛的概念,而二维数组又对一维数组做了扩展, 如果要引用数组中的全部元素,只要利用循环语句即 描述了空间中‚平面‛的概念。人们可以模仿二维数组的使用 可实现,这是对数组中元素进行操作的基本算法。对于一 方法来实现多维数组等各种数据容器。例如,可用如下方法定 维数组,只需用单重循环就可完成;而对于二维数组则需 义三维数组: int a[2][3][4]; 要使用两重循环来完成,外循环控制行标变化,内循环控 多维数组元素在内存中的排列顺序为:第一维的下标变化 制列标变化。 最慢,最右边的下标变化最快。
20
s[0][3]
s[1][1] s[1][2]
……
4.2
多维数组
4.2.2 二维数组的初始化 二维数组初始化也是在类型说明时给各下标变量赋以初值。 二维数组可按行分段赋值,也可按行连续赋值。 例如对数组int s[3][5]: (1)按行分段赋值可写为: int s[3][5]={{80,75,92,61,65},{71,59,63,70,85},{87,90,76, 77,85}}; (2)按行连续赋值可写为: int s[3][5]={ 80,75,92,61,65,71,59,63,70,85,87,90,76,77, 85}; 这两种赋初值的结果是完全相同的。
递归的基本概念与递归程序设计_数据结构(C语言版)(第3版)_[共2页]
![递归的基本概念与递归程序设计_数据结构(C语言版)(第3版)_[共2页]](https://img.taocdn.com/s3/m/b15eca426bec0975f465e2f1.png)
return(0);}算法4.19 稀疏矩阵十字链表的查找算法4.1 稀疏矩阵常用的压缩存储方法有( )和( )两种。
4.2 设有一个10 × 10的对称矩阵A采用压缩方式进行存储,存储时以按行优先的顺序存储其下三角阵,假设其起始元素a00的地址为1,每个数据元素占2个字节,则a65的地址为( )。
4.3 若串S =“software”,其子串的数目为( )。
4.4 常对数组进行的两种基本操作为( )和( )。
4.5 要计算一个数组所占空间的大小,必须已知( )和( )。
4.6 对于半带宽为b的带状矩阵,它的特点是:对于矩阵元素a ij,若它满足( ),则a ij = 0。
4.7 字符串是一种特殊的线性表,其特殊性体现在( )。
4.8 试编写一个函数,实现在顺序存储方式下字符串的strcompare(S1,S2)运算。
4.9 试编写一个函数,实现在顺序存储方式下字符串的replace(S,T1,T2)运算。
4.10 试编写一个函数,实现在链式存储方式下字符串的strcompare(S1,S2)运算。
4.11 试编写一个函数,实现在链式存储方式下字符串的replace(S,T1,T2)运算。
4.12 已知如下字符串,求它们的next数组值。
(1)“bbdcfbbdac”。
(2)“aaaaaaa”。
(3)“babbabab”。
4.13 已知正文t =“ababbaabaa”,模式p =“aab”,试使用KMP快速模式匹配算法寻找p在t中首次出现的起始位置,给出具体的匹配过程分析。
4.14 已知三维数组A[3][2][4],数组首地址为100,每个元素占用1个存储单元,分别计算数组元素A[0][1][2]在按行优先和按列优先存储方式下的地址。
4.15 已知两个稀疏矩阵A和B,其行数和列数均对应相等,编写一个函数,计算A和B之和,假设稀疏矩阵采用三元组表示。
4.16 写出两个稀疏矩阵相乘的算法,计算:C pn= A pm∗B mn其中,A、B和C都采用三元组表示法存储。
第4章:串与数组 数据结构C语言第三版
![第4章:串与数组 数据结构C语言第三版](https://img.taocdn.com/s3/m/e9dc9a3d5727a5e9856a6196.png)
又由于C语言采用行序为主序的存储方式,则有:
LOC(a3,2)=LOC(a0,0)+(i*n+j)*k=2000+(3*4+2)*4=2056
4.2.3稀疏矩阵
特殊矩阵是指非零元素或零元素的分布有一定规律的矩阵。
为了节省存储空间, 可以利用特殊矩阵的规律,对它们进行压缩存储。
/*继续匹配下一个字符*/
{ i++; j++; }
/*主串和子串依次匹配下一个字符*/
else
/*主串、子串指针回溯重新开始下一次匹配*/
{ i=i-j+1;j=0; } /*主串从下一个位置开始匹配,子串从头开始匹配*/
}
if (t[j]>=‘\0’) return i-j; /*返回匹配的第一个字符的下标*/
例如,“a”、“ab”、“abc”和“abcd”等都是“abcde”的子串。
4.1.2串的基本运算
(1)求串长StrLength(s):返回串s中字符个数。 (2)串赋值StrAssign(s1,s2):将一个字符串常量s2赋给串变量s1。 (3)串连接StrConcat(s1,s2):返回由两个串s1和s2连接在一起形成的新串。 (4)求子串SubStr(s,i,len):返回串s中从第i个字符开始的、由连续len个字符组成的子串。 (5)串比较StrComp(s1,s2):若s1=s2,返回值为0;若s1<s2,返回值<0;若s1>s2,返回值>0; (6)串定位StrIndex(s,t):返回子串t在主串s中首次出现的位置,找不到返回-1。 (7)串插入操作StrInsert(s,i,t):将串t插入到串s的第i个字符上,并返回产生的新串。 (8)串删除操作StrDel(s,i,len):从串s中删去从第i个字符开始的长度为len的子串,并返 回产生的新串。 (9)串替换操作StrRep(s,t,r):将串s中所有与t相等且不重叠的子串用串r替换,并返回产 生的新串。 (10)串相等StrEqual(s,t):若两个串s与t相等则返回真;否则返回假。 (11)串输出DispStr(s):输出串s的所有元素值。
电大C语言程序设计 第4章 数组和字符串
![电大C语言程序设计 第4章 数组和字符串](https://img.taocdn.com/s3/m/b5a81cf57c1cfad6195fa741.png)
Байду номын сангаас
第4章 数组和字符串 4.4 使用typedef语句定义数组类型 2. 二维数组类型的定义语句 格式: typedef <元素类型关键字> <数组类型名> [<常量表达式1>] [<常 量表达式2>]; 格式举例: (1) typedef int Matrix[5][5]; (2) typedef char nameTable[10][NN]; (3) typedef double DataType[M+1][N+1]; 定义对象: (1) Matrix mx={{0}}; (2) nameTable nt={""}; (3) DataType dd={{0.0}};
第4章 数组和字符串 4.2 一维数组 3. 数组元素访问 数组元素可以象普通变量一样使用。如: (1) int a[5]={0,1,2,3,8}; (2) a[0]=4; (3) a[1]+=a[0]; (4) a[3]=3*a[2]+1; (5) printf("%d",a[a[0]]);
第4章 数组和字符串 4.1 数组的概念 一维数组可以表示和存储和一维相关的数据。 二维数组可以表示和存储和二维相关的数据。 三维数组可以表示和存储和三维相关的数据。 假定一个数列为a1,a2,…,an,可以用一维数组来 存储。一个矩阵可以用二维数组来存储。
第4章 数组和字符串 4.2 一维数组 1. 定义格式 <类型关键字><数组名>[<常量表达式>][={<初 值表>}] <类型关键字>:已存在的一种数据类型。 <数组名>:用户定义的标识符。 <常量表达式>只能含有通过#define命令定义的 符号常量,不能含有通过const语句定义的符号 常量,初值表为用逗号分开的一组表达式。
数据结构(CC++语言版)第4章串
![数据结构(CC++语言版)第4章串](https://img.taocdn.com/s3/m/b187463d524de518974b7d39.png)
•
else return -1;
•}
34
4.3 模式匹配
35
4.3 模式匹配
朴素的模式匹配——BF算法分析
为什么BF算法时间性能低?
在每趟匹配不成功时存在大量回溯,没有利用已经 部分匹配的结果。
如何在匹配不成功时主串不回溯?
主串不回溯,模式就需要向右滑动一段距离。
如何确定模式的滑动距离?
36
4.3 模式匹配
T[strLength(S1) +i]=S2[i]; strLength(T) =MAXSTRLEN; return FALSE; } }
CompStr (S, T)
初始条件:串 S 和 T 存在。 操作结果:若S T,则返回值 0;
若S T,则返回值 0; 若S T,则返回值 0
例如:CompStr(data, state) < 0 CompStr(capture, case) > 0
• 由于在计算机科学、生物信息学等许多领域的重要应用, 串模式匹配已经变成了一个非常重要的计算问题
28
4.3 模式匹配
常用的模式匹配算法: • 朴素的模式匹配(BF算法) • 无回溯的模式匹配(KMP算法) 其他模式匹配算法
29
4.3 模式匹配
朴素的模式匹配——BF算法
基本思想:从主串S的第一个字符开始和模式T 的第 一个字符进行比较,若相等,则继续比较两者的后 续字符;否则,从主串S的第二个字符开始和模式T 的第一个字符进行比较,重复上述过程,直到T 中的 字符全部比较完毕,则说明本趟匹配成功;或S中字 符全部比较完,则说明匹配失败。
S1="ab12 cd " S2="ab12" S3=“cd"
c语言大一1至6章知识点
![c语言大一1至6章知识点](https://img.taocdn.com/s3/m/302b7a7b68eae009581b6bd97f1922791688be35.png)
c语言大一1至6章知识点C语言是一种程序设计语言,被广泛应用于计算机科学和软件开发领域。
在大一的学习过程中,学生通常需要学习C语言的基础知识。
本文将介绍C语言大一1至6章的知识点,帮助读者全面理解并掌握这些内容。
第一章:概述C语言的概述部分主要介绍了C语言的发展历程、特点以及应用领域。
同时,还简要介绍了C语言程序的结构和运行过程。
第二章:数据类型与运算符在C语言中,数据类型和运算符是基础的概念和工具。
这一章节主要包括以下几个方面的知识点:1. C语言的基本数据类型,如整型、浮点型、字符型等;2. 数据类型的声明和定义方式;3. C语言的运算符,包括算术运算符、关系运算符、逻辑运算符等;4. 运算符的优先级和结合性规则。
第三章:控制语句控制语句是程序设计中用于控制程序执行流程的关键部分。
在C语言中,常用的控制语句包括:1. 条件语句(if语句和switch语句),用于根据条件执行相应的代码块;2. 循环语句(while语句、do-while语句和for语句),用于重复执行一段代码块;3. 跳转语句(break语句、continue语句和goto语句),用于改变程序的执行顺序。
第四章:数组与字符串数组和字符串是C语言中常用的数据结构和数据类型。
该章节主要包括:1. 数组的概念和基本操作,包括数组的声明、初始化和访问;2. 多维数组的定义和使用;3. 字符串的概念和表示方法,以及常用的字符串函数。
第五章:函数函数是C语言中组织代码的重要工具。
在这一章节中,主要介绍:1. 函数的定义和声明,以及函数的调用过程;2. 函数参数传递的方式,包括按值传递和按引用传递;3. 递归函数的概念和使用方法。
第六章:指针与动态内存管理指针是C语言中的重要特性,也是较难理解和掌握的部分。
该章节主要涵盖:1. 指针的概念和基本操作,包括指针的声明、初始化和使用;2. 指针和数组之间的关系,指针的运算和指针的比较;3. 动态内存管理,包括动态内存的分配和释放。
第四章 数组
![第四章 数组](https://img.taocdn.com/s3/m/c6ffa2820722192e4436f68b.png)
4.1一维数组
数组元素在内存中是顺序存储的。对于 一维数组,就是简单地按下标顺序存储。 例如,对上面定义的整型数组a,在内存 中的存放顺序如图4-1所示:
4.1 一维数组
3 数组的赋值
1) 用“=”赋值 与数组的初始化不同,在给数组元素进行赋值
时,若必要须在逐数一组赋之值间。进行赋值,也只能一个 例如一:个对元于素下地述赋的值数组。初始化: 其等例样价如大的:小ii赋nn将 的tt值上 数aa形[[述 组式33]]数b如;=,{下组1可:,a2的以,3值利};赋用给下另面一的个循同环
的存储单元。 根据数组的维数,分为一维数组、二维数组
和多维数组,常用的是一维和二维数组。
4.1一维数组
1.一维数组的定义格式为: 类型 数组名[常量表达式]; 其中,类型是数组类型,即数组中各元素的数据
类型,可以是整型、浮点型、字符型等基本类型。
数组名是一个标识符,代表着数组元素在内存中 的起始地址,它的命名规则与变量名的命名一样。
→对a于[1二][维0]数→a组[1,][可1]以→把a[它1]看[2成]→是a由[1多][3个] 一 →维a数[2组][构0]成→的a[。2]例[1如]→上a例[2:][i2n]t →a[a2[]2[]3[]3;] 就 可以看成是由两个形如int a[3];的一维数 组构成的。
4.2 二维数组
常量表达式又称下标表达式,表示一维数组中元 素的个数,即数组长度(也称为数组大小),用 一对
方括号“[ ]”括起来。方括号“[ ]”的个数代表数 组
4.1一维数组
C语言讲义第04章-数组
![C语言讲义第04章-数组](https://img.taocdn.com/s3/m/ce68a71cfad6195f312ba69a.png)
数组
《C语言程序设计》
主要内容
• • • • • 数组的概念 一维数组 多维数组 字符数组 小结
4.1
• •
数组的概念
4.1.1 数组的一般概念: 数组是有序数据的集合,数组中的每一个数据都具有 相同的数据类型。每个数组都用一个统一的标识符来 标识,称为数组名。数组中的每一个数据称为数组元 素,数组元素由数组名和下标(数组元素在数组中的 序号)唯一确定。数组元素也可称为下标变量。
4.3 多维数组
• 实现在一维存储器中存放二维数组,可有两种方式: 一种是按行优先存储,另一种是按列优先存储。 • 在C语言中,二维数组是按行存储的。 • 上面的二维数组的存储情况如图所示 :
4.3 多维数组
• 多维数组的定义:
类型说明符 数组名[常量表达式1][常量表达式2] …
• 多维数组在内存中的存放顺序为:按第一维的下标变 化最慢,最后一维的下标变化最快的规则存储
•
注意:
两个字符串比较大小时,只能用strcmp函数,而不能用条件 语句。
4.4 字符数组
6. 测字符串长度函数strlen(strlen为STRing LENgth 的缩写)
1. “下标”可以是非负的整型常量或其值为非负整型数据 的表达式,取值范围是0~(元素个数 - 1)。 2. 一个数组元素,实质上就是一个变量,它具有和相同类 型单个变量一样的属性,可以对它进行赋值和参与各种 运算 3. 在C语言中,数组不能作为一个整体参加数据运算,只 能对单个的元素进行处理
4.2
4.2
一维数组
– 对全部数组元素赋初值。例如:
float fscore [10] = { 85 , 76.5 , 92 , 65 , 82.5 , 76 , 58 , 46 , 69 , 83 } ;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*错误
*/
…
}
10
一组red整数
11
定义整型数组red
16位
数组red有13个元素,下标为0~12 注意:没有red[13]。
12
4.2.2一维数组的初始化
初始化是指在数组定义时给数组元素赋予初值。 格式:
类型说明符 数组名[常量表达式]={数据值1, 数据值2,…,数据值n};
注意:
分析: 本题要使用三个平行的一维数组。 两个数组的第i个元素分别记录了一个学生的期中成绩 和期末成绩。 第三个数组的第i个元素由另两个数组的第i个元素计算 得到。
31
score1
80 70 80 ……
score2
90 80 60 ……
final-Score
87 77 66 ……
期中成绩
期末成绩
/*
sum of 5 interger
*/
#include "stdio.h"
void main()
{ int i,data[5],sum=0;
printf("\nPlease enter 5 integer:");
for (i=0;i<5;i++)
scanf("%d", &data[i] );
for (i=0;i<5;i++)
printf(“the sorted numbers:\n”);
for(i=0;i<10;i++) printf(“%4d”,a[i]);
printf(“\n”);}
29
思考
用冒泡法和选择法如何解决第一个问题:输 入100个学生的“C程序设计”课程的成绩, 将这100个分数从小到大输出?
30
用一维数组解决第二个问题:输入100 个学生的“C程序设计”课程的期中和 期末成绩,算出总评成绩,总评成绩为 “30%×期中成绩+70%×期末成 绩”,计算总评成绩的分数段情况。
数组初始化是在编译阶段进行的,由可执行语句完成 的,因此不能将初始化的“=”与赋值号混淆。
规定:
可以只给部分元素赋初值。没有赋初值的元素:对于 数值型数组,自动赋初值为0;对字符型数组,自动赋 初值为空字符。 例如:
13
int red[13]={1,2,3,4};
则red[4]~red[12]的初值都为0。
如int、float、double、char、long等 。
还可以是:
指针型 结构体型 共用体型 枚举型 (以上类型后续章节介绍)
同一数组中的所有元素必须是相同类型的。
5
3.数组的维数
一维数组
元素有一个下标,如a[1]
二维数组
元素有两个下标,如a[1][1]
三维数组
三个下标,如a[1][1][1]
int data[5];
/*整型数组data,有5个元素。*/
char string[20]; /*字符型数组string,有20个元素 */
(2)“数组名” 命名规则和变量命名规则相同。
(3)数组名后的“数组长度”表示数组中数据元 素的个数,数组长度只能是一个整型常量。
8
(4)一个数组定义语句中可以只定义一个 数组,也可以定义多个数组,还可以同时 定义数组和变量。例如:
步
•……
•第k步、在m-k+1个数中找出最小
数,然后和第k个数交换,前k个
数已经排好序。
•这样一直到第m-1步结束。
000 0 0 822 2 2 554 4 4 445 5 5 288 8 8 999 9 9
第第 第 第 结
23 步步
4 步
5 步
果
交换过程
28
选择法程序:
作业:请画出选择排序法 的流程图。并分析两种
第4章数组和字符串
1
第4章 数组和字符串
4.1 数组的概念 4.2 一维数组 4.3 二维数组 4.4 字符串与字符函数
2
4.1 数组的概念
问题的提出:
第一个问题:输入100个学生的“C程序设 计”课程的成绩,将这100个分数从小到大 输出。
第二个问题:输入100个学生的“C程序设 计”课程的期中和期末成绩,算出总评成绩, 总评成绩为“30%×期中成绩+70%×期 末成绩”,计算总评成绩的分数段情况。
只能给元素逐个赋值,不能给数组整体赋值。
例如:给数组red中的13个元素全部赋值“2”只能用以下形式来 表示: int red[13]={2,2,2,2,2,2,2,2,2,2,2,2,2};
而不能为了方便写成如下的形式: int red[13]=2;
初始化数组时,允许省略数组的长度。
例如: int red[13]={1,2,3,4,5,6,7,8,9,10,11,12,13}; 可写为: int red[ ]={1,2,3,4,5,6,7,8,9,10,11,12,13};
#include<stdio.h>
main()
{
int i,m[8];
for(i=0;i<=7;i++)
m[i]=i;
for(i=7;i>=0;i--)
printf("%d ",m[i]);
}
程序的运行结果如下:
76543210
16
➢ 允许用表达式表示下标。
【例4.2】在数组m[8]中存储偶数并输出。
总评=
期中成绩×30%+期末成绩×70%
剪不断,理还乱!有没有更好的方法?请看二维数组!
32
4.3 二维数组
4.3.1 二维数组的定义 4.3.2 二维数组的初始化 4.3.3 二维数组的引用
33
4.3.1二维数组的定义
语法:
类型说明符 数组名[行数][列数]
其中
“行数”表示第一维下标的长度 “列数”表示第二维下标的长度。
3
1.数组的定义
按序排列的同类数据元素的集合就称为数组。 从概念上来说,数组是一组变量,这组变量应该满
足下列条件:
具有有相同的名字 具有相同的数据类型 在存储器中连续存放。
按数组元素类型的不同,数组又可分为
数值型数组 字符型数组 指针型数组 结构体型数组
4
2.数组的数据类型
数组的数据类型可以是各种基本数据类型
/*初始化 */
printf("\n"); for (i=2;i<20;i++)
fib[i]=fib[i-1]+fib[i-2] ;
for (i=1;i<=20;i++)
{ printf("%10d",fib[i-1]); if (i%5==0) printf(“\n”);
个*/
/*每行输出5
} }
21
例3: 输入100个整数,求出最小的数以及第一 个最小的数在数组中的下标。
分析: 用一个变量min_allo记住最小元素的下标 开始时,假设第0的元素最小,min_allo=0 循环从第一个元素开始,到第99个元素结束 判断该元素是否比下标为min_allo的元素还要
小,如果是,就让min_allo记住这个新的最小 元素的位置。
a=1;b=1; printf("%10d%10d",a,b); for( j=3;j<=20; j++) {
f=a+b; a=b; b=f; printf("%10d",f); if (j%5==0) printf("\n"); } }
20
#include "stdio.h" void main() { int i, fib[20]={1,1} ;
14
4.2.3一维数组的引用
格式:
数组名[下标表达式]
其中:
数组下标可以是整型变量或整型表达式, 任何一个数组元素的引用都可以看成是一个变量的使用。 下标从0开始,不能大于[数组长度-1]
例如: data[4]、data[i+j]、data[i++]
都是合法的引用方式。
15
【例4.1】数组m[8]存储其下标值,反向输出m的值。
C语言的数组可以是多维的,但一般常用的是一维数 组和二维数组。
6
4.2一维数组
4.2.1一维数组的定义 4.2.2一维数组的初始化 4.2.3一维数组的引用
7
4.2.1一维数组的定义
一维数组定义的语法格式如下:
类型说明符 数组名 [数组长度];
其中:
(1)“类型说明符”可以是任何一种基本数据类型或构 造数据类型。例如:
float b[10],c[20],f; 定义了:
单精度浮点型数组b,有10个元素; 单精度浮点型数组c,有20个元素; 浮点型变量f。
9
例如:
程序段一:
#define Size 5
main()
{ int a[Size],b[Size+10]; /*正确
*/
…
} 程序段二:
main()
{
int n=5; int data[n];
25
26
冒泡法程序 main() {int a[11], i,j,t;
printf(“input 10 number:\n”); for(i=1;i<11;i++)
scanf(“%d”,&a[i]); printf(“\n”); for(j=1;j<=9;j++)
for(i=1;i<=10-j;i++) if(a[i]>a[i+1]) {t=a[i];a[i]=a[i+1]; a[i+1]=t;}