c语言实验数组的应用(共8篇)
1.c语言实验数组的应用 篇一
试验目的 1、掌握一维数组和二维数组的定义、赋值和输入输出的方法; 2、掌握字符数组和字符串函数的使用; 3、掌握与数组有关的算法特别是排序算法。 二、实验内容 教材习题P1527.2 三、算法流程图 四、程序清单 include void main {inti,j,min,s,a[11]; printf“请输入数组
“; fori1;i10;i {printf“a[d]“,i; scanf“d“, } printf“
“; printf“原数据为
“; fori1;i10;i printf“5d“,a[i]; printf“
“; fori1;i9;i {mini; forji1;ja[j] minj; sa[i]; a[i]a[min]; a[min]s; }printf“排好序的数组为
“; fori1;i10;i printf“5d“,a[i]; printf“
“; } 五、运行结果 六、实验总结(调试分析和体会)这个星期我对使用数组进行程序设计的学习,在之前的基础上,我更加努力,课前先预习,上课认真听,经过我的努力我进步了很多,虽然有了很大的进步,但在学习上还是存在很多问题。但这次的作业比上周的条件结构程序好多了。经过自己的努力,我已经掌握一维数组和二维数组的定义、赋值和输入输出的方法;掌握字符数组和字符串函数的使用;掌握与数组有关的算法特别是排序算法。这一单元数组跟以前的选择结构程序设计和循环控制相比,内容要繁琐得多,程序语句没有以前那么明了,要经过认真的思考,在经过自己思考后,即使是自己懂得算法的原理后,要来调程序又困难重重,一个程序要经过认真思考和反复的调试程序,才能完成。在多次的练习下,我基本上能结合程序掌握一些算法。通过多次的实验操作,我的操作能力有了很大的进步,但在学习的过程中并非一帆风顺,特别是在对程序的语句上,问题特别多。但我经过耐心地操作和虚心地请教终于掌握了正确的操作方法
2.c语言实验数组的应用 篇二
关键词:指针,数组,C语言
对于C语言编程新手来说, 经常认为"数组和指针是相同的"。其实这种说法是不完全正确的, 他们是有区别的。ANSIC标准6.542里建议:
注意下列声明的区别:
extern int*x;
extern int y[];
第一条语句声明x是一个int型的指针, 第二条语句声明y是int型, 数组长度尚未确定, 其存储在别处定义。
标准里并没有做更细的规定, 许多C语言书籍对数组和指针何时相同、何时不同也是含糊其辞一带而过。为了更好地理解指着与数组, 在这里我们谈谈他们之间的区别。
一、数组和指针的不同之处
我们来看以下代码:
程序编译时出错, 在这里, 数组a[100]与*a是两种不同的概念, 以上的错误相当于把浮点型数据和整型数据混为一谈, 如:
从上面, 我们可以很明显地看出int和char类型不匹配, 同理指针和数组两种不同类型也是不匹配。下面我们来谈谈是数组与指针的区别:
1. 指针和数组保存数据的内容不同
在C语言中, 我把地址形象地称为"指针", 把存放地址的变量称为指针变量, 通常我们把指针变量简称为指针, 所以指针里存放的是数据的地址, 而数组里存放的是数据的值。
2. 数组和指针的访问方式不同
数组采用的是直接访问方式, 而指针采用的是间接访问方式。
如:char a[6]="China"; c=a[3];
程序编译时, 给数组分配内存, 如图:
假设编译器符号表给的一个地址是2000程序运行时, 取3的值, 将它与2000相加, 取得 (2000+3) 的内容。在这里, 每个符号的地址在编译时可知。因此, 如果编译器需要一个地址来执行某个操作得花, 它就可以直接地进行操作, 并不需要增加指令取得具体的地址。相反, 对于指针, 它必须首先在运行时取得它的当前值, 然后才能对它进行解除操作。
如:char*p="China"; c=p[3];
编译器编译时, 编译器符号表给了一个p, 其地址假设为3000, 如图:
运行时, 取得地址3000的内容, 即5000, 后与3相加, 最后取 (5000+3) 的内容。
数组和指针的不同点还在于:指针通常由于动态数据结构, 而数组通常用于存储固定数目且数据类型相同的元素;指针用malloc () 、free () 函数来动态分配空间或释放空间, 而数组则隐式分配和删除;指针通常指向匿名数据, 而数组自身即为数据名;等。
二、数组和指针的相同之处
数组和指针什么时候相同呢?
1."作为函数参数的数组名"等同于指针
The C Programming Language, 第二版, Kernighan&Ritchie, 第99页里指出:
意思是:作为函数参数定义的形式参数, char s[]和char*s是一样的。
在函数形参定义这个特殊的情况下, 编译器必须把数组形式改写成指向数组第一个元素的指针形式。在这里, 编译器只向函数传递数组的地址, 而不是整个数组的拷贝。因此以下几种:
是一样的。
所以主函数的参数中char**argv和char argv[][]可以相互替换。
2."表达式中的数组名"就是指针, 数组下标作为指针的偏移量
假设我们声明:
int a[10], *p, i=1;
就可以通过以下任何一种方式访问a[i];
p=a;p[i];
或p=a;* (p+i) ;
或p=a+I;*p;
实际上, 我们还可以采用其它更多的方法。对于数组的引用如a[i]在编译时总是被编译器改写成* (a+i) 的形式。C语言标准要求编译器必须具备这个概念性的行为。我们可以这么记着:方括号[]表示一个取下标操作符, 就像减号表示一个减法运算符一样。取下标操作符就像取一个整数和一个指向类型X的指针, 所产生的结果类型是X, 一个在表达式中的数组名于是就成了指针。
在表达式中, 指针和数组是可以相互替换的, 因为他们在编译器里的最终形式都是指针, 并且都可以进行取下标操作。编译器可以自动把下标值的步长调整到数组的大小, 如:long型数据的长度是4个字节, 那么m[i]和m[i+1]在内存中的距离就是4, 而不是1。在对起始地址执行加法操作之前, 编译器会自动负责计算机每次增加的步长。这就是为什么指针总有类型限制的原因, 每个指针只能指向一种类型的原因是:因为编译器需要知道对指针进行解除引用操作时应该取多少个字节, 和每个下标的步长应取多少个字节。
三、总结
总而言之, 当声明时 (除作为函数参数除外) , 指针和数组是不能替换的, 如:"int a[10];", 只能用"extern a[10];", 而不能使用"extern*a;", 又如"int a[10];"和"in*a;"意义也是不同的;当作为函数参数或应用时, 两者是相同的, 如:"a[i]=5;"等同于"* (a+i) =5;", 又如, 主函数的参数中char**argv和char argv[][]可以相互替换。
参考文献
[1]谭浩强, C程序设计 (第三版) [M], 北京:清华大学出版社, 2005
[2]E.Balagurusamy, 标准C程序设计 (第4版) [M], 北京:清华大学出版社, 2008
3.C语言指向结构体数组的指针 篇三
指针变量可以指向一个结构数组,这时结构指针变量的值是整个结构数组的首地址。结构指针变量也可指向结构数组的一个元素,这时结构指针变量的值是该结构数组元素的首地址。
设ps为指向结构数组的指针变量,则ps也指向该结构数组的0号元素,ps+1指向1号元素,ps+i则指向i号元素。这与普通数组的情况现金网96y.org是一致的。
用指针变量输出结构数组。
struct stu{
int num;
char *name;
char sex;
float score;
}boy[5]={
{101,Zhou ping,M,45},{102,Zhang ping,M,62.5},{103,Liou fang,F,92.5},{104,Cheng ling,F,87},{105,Wang ming,M,58}
};
main(){
struct stu *ps;
printf(NotNametttSextScoretn);
for(ps=boy;psboy+5;ps++)
printf(%dt%stt%ct%ftn,ps-num,ps-name,ps-sex,ps-score);
}
在程序中,定义了stu结构类型的外部数组boy并作了初始化赋值。在main函数内定义ps为指向stu类型的指针。在循环语句for的表达式1中,ps被赋予boy的首地址,然后循环5次,输出boy数组中各成员值。
应该注意的是,一个结构指针变量虽然可以用来访问结构变量或结构数组元素的成员,但是,不能博彩公司排名q07i5.org使它指向一个成员。也就是说不允许取一个成员的地址来赋予它。因此,下面的赋值是错误的。
ps=boy[1].sex;
而只能是:
ps=boy;(赋予数组首地址)
或者是:
4.c语言实验数组的应用 篇四
**********一维数组**********
#include
#define n 10
int main()
{
}
int a[n]={1,1},i,j;printf(“%5dn%5d%5dn”,1,a[0],a[1]);for(i=1;i **********二维数组********** #include int main() { int a[30][30]={0},i,j,n=10; for(i=0;i<=n-1;i++) a[i][0]=1; for(i=1;i<=n-1;i++) for(j=1;j<=i;j++) a[i][j]=a[i-1][j-1]+a[i-1][j]; for(i=0;i<=n-1;i++) { for(j=0;j<=i;j++) printf(“%5d”,a[i][j]); printf(“n”); } return 0; 今天在看代码中遇到一个结构中包含char data[0],第一次见到时感觉很奇怪,数组的长度怎么可以为零呢?于是上网搜索一下这样的用法的目的,发现在linux内核中,结构体中经常用到data[0].这样设计的目的是让数组长度是可变的,根据需要进行分配,方便操作,节省空间。 2、data[0]结构 经常遇到的结构形状如下: struct buffer { int data_len; //长度 char data[0]; //起始地址 }; 在这个结构中,data是一个数组名;但该数组没有元素;该数组的真实地址紧随结构体buffer之后,而这个地址就是结构体后面数据的地址(如果给这个结构体分配的内容大于这个结构体实际大小,后面多余的部分就是这个data的内容);这种声明方法可以巧妙的实现C语言里的数组扩展。 写个程序对比char data[0],char *data, char data[],如下所示: 1 #include 2 #include 3 #include 4 #include 5 6 typedef struct 7 { 8 int data_len; 9 char data[0]; 10 }buff_st_1; 11 12 typedef struct 13 { 14 int data_len; 15 char *data; 16 }buff_st_2; 17 18 typedef struct 19 { 20 int data_len; 21 char data[]; 22 }buff_st_3; 23 24 int main 25 { 26 printf(“sizeof(buff_st_1)=%u ”, sizeof(buff_st_1)); 27 printf(“sizeof(buff_st_2)=%u ”, sizeof(buff_st_2)); 28 printf(“sizeof(buff_st_3)=%u ”, sizeof(buff_st_3)); 29 30 buff_st_1 buff1; 31 buff_st_2 buff2; 32 buff_st_3 buff3; 33 34 printf(“buff1 address:%p,buff1.data_len address:%p,buff1.data address:%p ”, 35 &buff1, &(buff1.data_len), buff1.data); 36 37 printf(“buff2 address:%p,buff2.data_len address:%p,buff2.data address:%p ”, 38 &buff2, &(buff2.data_len), buff2.data); 39 40 printf(“buff3 address:%p,buff3.data_len address:%p,buff3.data address:%p ”, 41 &buff3, &(buff3.data_len), buff3.data); 42 43 return 0; 44 } 从结果可以看出data[0]和data[]不占用空间,且地址紧跟在结构后面,而char *data作为指针,占用4个字节,地址不在结构之后。 3、实际当中的用法 在实际程序中,数据的长度很多是未知的,这样通过变长的数组可以方便的节省空间。对指针操作,方便数据类型的转换。测试程序如下: 1 #include 2 #include 3 #include 4 #include 5 6 typedef struct 7 { 8 int data_len; 9 char data[0]; 10 }buff_st_1; 11 12 typedef struct 13 { 14 int data_len; 15 char *data; 16 }buff_st_2; 17 18 typedef struct 19 { 20 int data_len; 21 char data[]; 22 }buff_st_3; 23 24 typedef struct 25 { 26 uint32_t id; 27 uint32_t age; 28 }student_st; 29 30 31 void print_stu(const student_st *stu) 32 { 33 printf(“id:%u,age:%u ”, stu->id, stu->age); 34 } 35 36 int main() 37 { 38 student_st *stu = (student_st *)malloc(sizeof(student_st)); 39 stu->id = 100; 40 stu->age = 23; 41 42 student_st *tmp = NULL; 43 44 buff_st_1 *buff1 = (buff_st_1 *)malloc(sizeof(buff_st_1) + sizeof(student_st)); 45 buff1->data_len = sizeof(student_st); 46 memcpy(buff1->data, stu, buff1->data_len); 47 printf(“buff1 address:%p,buff1->data_len address:%p,buff1->data address:%p ”, 48 buff1, &(buff1->data_len), buff1->data); 49 50 tmp = (student_st*)buff1->data; 51 print_stu(tmp); 52 53 buff_st_2 *buff2 = (buff_st_2 *)malloc(sizeof(buff_st_2)); 54 buff2->data_len = sizeof(student_st); 55 buff2->data = (char *)malloc(buff2->data_len); 56 memcpy(buff2->data, stu, buff2->data_len); 57 printf(“buff2 address:%p,buff2->data_len address:%p,buff2->data address:%p ”, 58 buff2, &(buff2->data_len), buff2->data); 59 60 tmp = (student_st *)buff2->data; 61 print_stu(tmp); 62 63 buff_st_3 *buff3 = (buff_st_3 *)malloc(sizeof(buff_st_3) + sizeof(student_st)); 64 buff3->data_len = sizeof(student_st); 65 memcpy(buff3->data, stu, buff3->data_len); 66 printf(“buff3 address:%p,buff3->data_len address:%p,buff3->data address:%p ”, 67 buff3, &(buff3->data_len), buff3->data); 68 69 tmp = (student_st*)buff1->data; 70 print_stu(tmp); 71 72 free(buff1); 73 74 free(buff2->data); 关键词:分组合作学习,C语言,实验课 C语言程序设计是大多数高校计算机专业和理工科专业开设的一门公共基础课, 也是学生接触的第一门编程课。学生通过学习C语言, 主要是掌握程序设计的一些基本方法和技巧。但是, 因为此课程是学生接触的第一门参加程序设计课程, 没有任何编成基础, 普遍反映“难”。因此, 在重视理论教学的同时, 必须加强实验环节。因为只有在上机实践中, 学生才能正真学会如何编写程序和调试程序, 也只有通过上机实践, 才能更好地掌握程序设计的理论知识。在C语言的教学过程中, 应注重培养学生自己动手动脑、分析问题, 解决问题以及合作学习的能力。因此, 本学期在实验课教学中应用分组合作教学理念, 取得了很好的教学效果。 所谓分组合作教学, 就是要教师充分考虑到学生的个体差异, 遵循因材施教的原则, 有针对性地将不同层次的学生编成合作组, 利用小组的集体优势, 使每个学生在原有基础上得到发展。现从c语言实验课教学来谈谈分组合作教学在合作学习方面的应用。 一、学生分组实验的方法 (一) 了解差异, 合理分组 要保证同一个合作学习小组包含有学习成绩为好、中、差等不同层次的学生, 从而保证小组成员的多样性, 这样能够保证每位学生都可以从合作学习中受益。 (二) 设置任务, 合作学习 小组是合作学习的小团体。在完成实验任务的同时, 让每一位组员参与其中, 各尽其能, 各显神通。同时, 各小组之间进行竞赛, 看那各小组能更快更好的完成老师布置的实验任务。其中, 每个小组都有小组长, 小组长是小组的负责人, 按教师的要求合理安排本组的讨论和学习活动, 检查学习的情况, 及时向老师反映本组完成学习任务的情况。由于小组长得到老师的高度信任, 他们的学习积极性很高, 其组织工作的积极性也很高。其他组员参与讨论, 解决疑难, 在这个过程中有学习的成就感, 感受到学习的乐趣, 学习劲头越来越高, 形成了良性循环。 (三) 交流检测, 及时反馈 在分组合作学习的过程中, 教师要找出学生在合作过程中出现的问题, 提供必要的帮助。同时, 对课堂进行全面的组织, 及时给予学生科学的评估, 使他们体验到成功的快乐。 (四) 合理评价, 共同进步 在实验的最后, 教师要合理客观的给出各个小组的评价, 表扬优秀小组, 鼓励相对差一些的小组。并对实验中出现的问题进行讲解, 每个组出现的问题都应该指出, 避免别的小组以后犯类似的错误;对实验中的闪光点给与充分的肯定, 从而达到共同进步的目的。 二、学生分组实验应注意的问题 (一) 确保小组人数的均衡性 (数量和质量) 要保证同一个合作学习小组包含有学习成绩为好、中、差等不同层次的学生, 从而保证小组成员的多样性。另外, 分组时也要注意学生性别的搭配, 心理学的大量研究表明, 不同性别的个体在认知、风格、能力和性格特征等方面都存在着差异。在小组合作中混合男女生可以丰富小组认知问题、分析问题和解决问题的视角。 (二) 精心准备, 严格设计, 服从教学的目的性 C语言的实验课就是编写程序, 解决实际问题。对于每一个问题的解决办法, 每个人都是不同的, 编写的程序也是不同的。这就要求教师在实验内容上精心准备, 严格设计。选择的问题既要能练习学过的知识, 又可以锻炼学生们的思维能力, 让学生们大显身, 各显其能。 (三) 认真预习, 有备无患 充分的课前准备是分组实验成功的保证。每节分组实验前都应让学生提前预习实验, 最好实验课之前都编写好程序, 上机直接调试就可以了。这样, 可以做到心中有数, 从而快速、有效地完成实验。 (四) 细心指导, 增强学生的理解记忆力 每次分组实验, 教师都应细心指导。语言要有启发性、指导性, 可以使得学生动手时减少盲目性。但是又要点到为止, 不能大包大揽, 甚至程序都写好了抄给学生, 让学生直接敲打。C语言锻炼的是学生的逻辑思维能力, 分析问题和解决问题的能力。如果问题呈现给学生后, 不让学生对问题进行独立思考, 不给他们一定的思考探究的时间和空间, 就匆忙进行合作学习, 肯定欲速则不达。因为学生还没来得及对问题进行任何思考, 往往难以开口, 不知道讨论什么, 交流什么, 达不到合作学习的目的。 三、分组合作教学的意义及效果 #include 方法二: 1.一维数组的定义方式为: 类型说明符数组名[常量表达式] (1)数组名的命名方法与变量名相同,遵循标识符命名规则; (2)数组是用方括号括起来的常量表达式,不能用圆括号; (3)常量表达式表示数组元素的个数,即数组的长度,数组的下标从0开始,下标的最大值为:常量表达式-1; (4)常量表达式中可以包括常量和符号常量,不能包括变量。 可以用赋值语句或输入语句使数组中的元素得到值,但要占用运行时间。可以使数组在运行之前初始化,即在编译阶段使之得到初值。 2.对数组初始化可以用以下方法实现: (1)在定义数组时对数组元素赋以初值。如: staticinta[10]={0,1,2,3,4,5,6,7,8,9}; 经过上面的定义和初始化后,a[0]=0,a[1]=1,…,a[9]=9。 (2)初始化时可以只对一部分元素赋初值。例如: staticinta[10]={0,1,2,3,4}; 定义的数组有10个元素,但只对其中前5个元素赋了初值,后5个元素初值为0。 (3)如果想使一个数组的元素值全部为0,可以用下面的方法: staticinta[10]={0,0,0,0,0,0,0,0,0,0}; 不能用: staticinta[10]={0*10}; 如果对static型数组不赋初值,系统会对定义的所有数组元素自动赋以0值。 (4)在对全部数组元素赋初值时,可以不指定数组长度。 3.一维数组的引用方法是: C语言规定不能一次引用整个数组,引用时只能逐个元素引用,数组元素的表示形式为: 数组名[下标] 下标可以是整型常量或整型表达式。如: a[0]=a[5]+a[7]-a[2*3]; 二维数组的定义、初始化和引用 1.二维数组定义的一般形式为 类型说明符数组名[常量表达式][常量表达式] C语言采用上述定义方法,我们可以把二维数组看做是一种特殊的一维数组:它的元素又是一维数组。在C语言中,二维数组中元素的排列顺序是:先按行存放,再按列存放,即在内存中先顺序存放第一行的元素,再存放第二行的元素。 2.二维数组的初始化:二维数组可以用下面的方法初始化: (1)分行给二维数组赋初值。如: staticinta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; 以上赋值把第一个花括号内的数据赋给第一行元素,第二个花括号内数据赋给第二元素…,即按行赋值。 (2)可以将所有的数据写在一个花括号内,按数组排列的顺序对各元素赋值。 (3)可以对数组的部分元素赋初值。如: staticinta[3][4]={{1},{5},{9}}; 以上赋值的结果是:数组第一列的元素分别赋了初值1,5,9,其余元素的值都是0。 (4)如果对二维数组的全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。 3.二维数组的引用:二维数组的元素可以表示为: 数组[下标][下标] 在引用二维数组时,必须是单个元素,不能是整个数组名。下标可以是一个表达式,但不能是变量。如果下标是一个表达式,注意表达式的值不能超出数组定义的上、下限。 1.计算机二级C语言程序设计考点:函数 2.计算机二级C语言程序设计考点:指针 3.计算机二级C语言考点:字符型数据 4.计算机二级c语言试题 5.计算机二级office考点 6.计算机考试二级C++语言程序设计考试大纲 7.全国计算机二级考试C++语言程序设计大纲 8.计算机等级考试二级C语言程序设计考试大纲 9.2017计算机考试二级C语言程序设计考试大纲 【c语言实验数组的应用】推荐阅读: c语言函数指针数组10-15 c语言第三次实验报告08-21 C语言程序设计实验指导及报告07-26 电子科技大学 C语言第一次上机实验报告11-02 微课在C语言程序设计教学中的应用论文08-18 项目驱动教学法在C语言课程中的应用的论文10-10 C语言的读书心得10-26 dsp的c语言编程10-13 C语言默认参数值的实现07-175.C语言变长数组data[0] 篇五
6.c语言实验数组的应用 篇六
7.c语言实验数组的应用 篇七
8.c语言实验数组的应用 篇八