西北农林科技大学 c语言上机 实习7答案(共5篇)(共5篇)
1.西北农林科技大学 c语言上机 实习7答案 篇一
一、实验目的
1.能够描述VC++6.0开发平台的使用过程,学会运行一个C程序的基本步骤,包括编辑、编译、链接和运行。
2.能够使用算术表达式和赋值表达式书写正确的语句。3.能够使用输入/输出函数编写简单的程序。
二、实验环境
(调试程序所使用的软硬件环境)软件环境:VC++6.0 硬件环境:宏基
Intel 奔4 主频 2.8GHz,内存256MB
三、实验内容、结果及分析
1、题目1)求华氏温度150°F对应的摄氏温度。计算公式如下: 55cf32
其中:c表示摄氏温度,f表示华氏温度。源程序清单:(调试好的源程序代码)// work1.cpp : Defines the entry point for the console application.//
#include “stdafx.h” #include
} 主要标识符说明:(源程序中主要标识符含义说明)Double为双精度类型变量名表
实验结果:(程序运行结果)double f,c;cout<<“输入华氏温度,按Enter执行”< 实验中遇到的问题及解决的方法 源代码的粘贴出现乱码 解决:从Cpp文件中粘消除格式。 2、题目 已知某位学生的数学、英语和计算机课程的成绩分别是87分、72分和93分,求该生3门课程的平均分。 源程序清单:(调试好的源程序代码)// work2.cpp : Defines the entry point for the console application.// #include “stdafx.h” #include double a,b,c,average;cout<<“请按顺序输入数学、英语、计算机三科成绩。”< 实验中遇到的问题及解决的方法 3、题目 当n为152时,分别求出n的个位数字(digit1)、十位数字(digit2)和百位数字(digit3)的值。 源程序清单:(调试好的源程序代码)// work3.cpp : Defines the entry point for the console application.// #include “stdafx.h” #include int n,digit1,digit2,digit3;cout<<“请输入一个三位数n(100﹏999)”< //求个位数字 digit2=n/10%10; //求十位数字 digit3=n/100%10; //求百位数字 cout<<“个位数字(digit1)”< 实验中遇到的问题及解决的方法 四、实验体会(心得、收获) C语言对我们来说是一个崭新的学科。我想学习C语言就像学习其他学科一样,需要我们用心的去学习。它也是我们交流的一种新的方式。只不过是人机之间的。随着科学的进步,与社会的发展,计算机显得尤为重要。C语言又是学习计算机的基础,所以我们更应该该好好的学习C语言。通过这节实验课,我们学到了如何运用6.0来编辑代码,运行我自己编写的程序。虽然过程中会有错误,但在这犯错的过程中我学到了我所不知道的。在这纠错的过程中,我来了解到我还有很多的地方不足。如忘记写分号等。其实就错就是个学习的过程。 对于实验上的问题,如粘源代码时,就应先用记事本打开源代码,就可以。而不是在程序中直接粘,这样就不会出现乱码。还有,就是注意小处的错误,如分号和注意换行的使用。 上机实验报告 经过了九周的上机练习,我们算是完成了阶段性的胜利,从书本上枯燥的知识,通过上机练习把他们学以致用,融会贯通;不得不说,上机对于大一不允许带电脑,算得上是对c语言巩固和提高的重要途径了,很多我们不懂得问题,通过敲一下代码就知道可不可以这样了。还有很多格式,看不懂的代码,也都能解决。另外,重要的是通过上机我也拾得了编程的乐趣,链接好的程序就像是我的Baby,一节课生好几个。这是一种莫大的成就感。原来我还可以这样。如果仅是书本上的知识,我很难保证能坚持看下去,因为要把抽象的东西阐述出来,很多时候都是很枯燥的。所以上机便是这样一个辅助的途径。下面是我这九周所积累的一些问题和经验。 1.首先就是书写的问题。到现在我还时不时忘了加分号。这么一个细微的问题有时候会报很多错。其中易犯的便是scanf中&的使用,以及&&逻辑运算符和位运算符不分,==错写=,自定义函数,声明时不加分号,do,while语句while后忘加分号,以及数组不从a[0]开始写,for循环中控制条件用<还是<=,于是就会溢出。 2.printf里格式的问题,想要在数前补0整数可以靠.num而浮点数需要前加0,对于输出无符号16进制数%x,八进制数%o和十进制%u,总是记不住,还有一个比较特别的是可以用*占位,然后在后面的参数中说明精度和宽度,用#让浮点数始终有小数,字符串的5.4s只显示4位。另一个我发现无关紧要的是printf中lf和f没什么区别,scanf却不一样。 3.scanf的另一个问题是当出现空格是,读取的字符串就不完整了,在百度后,我找到了更好的gets函数,便可以读取空格,还有scanf的一一对应特性,不过空格不算。 4.++i和i++的使用问题。很多时候并不在意这些,便会导致数据的溢出,和结果总是偏差1,所以在使用时先得想好用哪个,如int k; while(k--) ;printf(“%d”,k)结果是-1,因为在while判断过程中还要减1。 5.Define 一个表达式时不爱每一层都加括号。导致运算时优先级使运算和目的不符。我记不下那么多的运算符的优先级,所以我解决的方法便是每个运算都加上括号。 6.总是按照自己的思维做事,像是想把一个数组复制给另一个数组就直接用=赋值了,事实证明并不可行,而是需要用for循环一个一个赋值,而字符串则用strcpy,但结构体却可以直接赋值。 7.条件语句if,while,for等加括号和在哪加括号的的问题,常常因为内容少所以不加括号经常导致错误,尤其在嵌套语句和连续多个条件语句时,总是会出错,所以以后我学会了每句话都加上大括号。并且尽量使格式工整。 8.忘记添加头文件。或者忘了头文件的名字,像是stdlib,malloc…… 这样函数就变得没有了意义。这个得靠记忆和多练。 9.函数要求的实参的格式忘记了,这时候总是会报格式不符,比如malloc.calloc.recalloc,对参数的要求的区别,qsort函数里,compare函数指针参数,compare的实际参数需要强制转换。 10.Switch用法,switch只能用于char和int,且不用break就会一直执行下去,我就会忘掉这个,还有给a加引号 11.数组的声明问题,数组是c语言里比较让人头大的问题了。其中,让我不能理解的便是为什么二维数组不能a[][]={},a[][N]={}而必须至少a[N][]={},这就让我栽过跟头,还有字符数组为什么加’’就变成字符串了,当然这都是要求,在声明时需要谨慎再谨慎。 12.指针的运用中,在参数调用和返回也时常出现格式不符,值传递改变不了实参,址传递有时候也改变不了比如返回局部变量的地址,这时就需要static静态变量延长存储时间,而extern在函数中仅是对之前的变量的声明,并不能在其中定义一个外部变量,static也只能定义一次,这类问题时常困扰着我,以为经常不知道错在哪里。另外还有一种方法也能改变指针的地址而改变实参指针的指向,那便是通过双重指针,**p 13.对于指针运用中另外很让人困惑的是二级指针的指向问题,而他们常常又和二维数组结合,例如a,&a[0],a[0],&a[0][0],a[0][0],他们乍一看都分别不出来,需要仔细的考虑,实际上a=&a[0],&*(a[0]+0)=a[0]=&a[0][0],实际上他们都是逐级递增的,例如对*(a[0]+i)就是对确定一行的列的选择,*(a+i)则是对行数的选择,常常用指针指向这一行,然后进行操作,然而经常&a,&a[0]和&a[0][0]却是相同的地址,但他们的跨度却不一样,这样常常在实验的过程中就是对数组格式的写错导致根本不知道哪出的错,也无从修改。所以还是得多理解透彻他们的含义,否则只会在写代码时犯懵。 14.指针运用的另一个问题就是,指针并不具有空间,需要进行空间的开辟,这类问题也常常出现在想要声明一个未知大小的数组,这时候就需要用malloc来开辟了,而malloc还不能放置在main函数体外,经常在scanf后放置。 15.在上机过程中我曾不理解为什么char*p=”ashjkhasljk”可以成功,而已定义的数组a,就不能a=“adfadsad”;char*p,p=”dasaf”可以,但是用scanf输入”dasaf”就不对,查阅资料我才得知,“”表达式的值就是一个地址,p=””,开辟了空间。而scanf直接把址给指针,并没有申请空间。其次程序把字符串放到了常量区,所以不容修改其值,这里的p[0]也不得修改,p开辟了一段常量空间把字符串放进去,其值也不得修改,但可以改变P的指向,所以相当于const char*p 16.关于函数,要记住函数不能嵌套定义,但可以调用。这也是我犯过的错误。 17.结构体的声明和联合还有枚举的声明经常搞混,查书才知道有两种方法来声明结构类型名,一种结构标记,一种typedef,第一种直接可以在其后写变量,另一种需要再换行再声明。还有其后}要加分号会忘,主要是还是对结构名和变量搞不清楚,比如struct student new在实验中出现引用其中的元素不知道是是应该student.new.还是new.除此,不明白Union为什么经常没有标记,直接就是变量。最后便是结构数组的初始化总是掌握的不好,可能因为用的少。 由于没有保留上机报告的原稿,所以以上是我暂时能回忆起来我所遇到的问题和我的想法。 经历了9次的实验我的收获当然不仅仅是这些问题,重要的是编程的思维,不是一上来就立马开始打代码,而是构建一个清晰的流程图就如《上机实验报告》所写,然后逐步实现,有时候有多个函数时需要先写一个大的框架,然后再完善。 另外,还有程序的调试,如果都写在函数里,则,注释部分函数然后进行调试。或者单步调试部分代码,观察值的变化。 (一)关于“******”问题 1、将字符串中的前导*号全部删除,中间和后面的*号不删除。void fun(char *a){ char *p=a;while(*p= =’*’)p++;for(;*p!=’’;p++,a++)*a=*p;*a=’’;} 2、只删中间* int i;for(i=0;a[i]= =’*’;i++)for(;h 3、只删尾* while(*a!=’’)a++;a--;while(*a= =’*’)a--;*(a+1)=’’; 4、只留前* int i , j=0;for(i=0;a=’*’;i++);j=i;for(;a;i++)if(a!=’*’)a[j++]=a[i];a[j]=’’; 5、只留中间* int i,j=0;for(i=h;i 6、只留尾* char *t=a;for(;t<=p;t++)if(*t!=’*’)*(a++)=*t;for(;t!=’’;t++)*(a++)=*t;*a=’’; 7、*个数>n个,删多余的*;*个数<=n个,不做任何处理。int i=0, k=0;char *p,*t;p=t=a;while(*t= =’*’){ k++;t++;} if(k>n){ while(*p){a[i]=*(p+k-n);i++;p++} a[i]=’’;} (二)移动问题 1、若一维数组中有n个整数,要求把下标从p到n-1(p<=n-1)的元素平移到数组前面。int i,j,t;for(i=p;i<=n-1;i++){ t=w[n-1];for(j=n-2;j>=0;j--)w[j+1]=w[j];w[0]=t;} 2、把下标从0到p(p<=n-1)的元素平移到数组最后。int i,j,t;for(i=0;i<=p;i++){ t=w[0];for(j=1;j 3、把字符串str中的字符向前移动,原来第1个字符放串尾,结果仍保存在原串中。ch=str[0];for(i=0;str[i+1];i++)str[i]=str[i+1];str[i]=ch; 4、移动字符串中的内容,把第1到第m个字符平移到串后,把第m+1到后移到前。void fun(char *w, int m){ int i, j;char t;for(i=1,i<=m;i++){ t=w[0];for(j=1;w[j]!=’’;j++)w[j-1]=w[j];w[j-1]=t;} } (三)排序法 1、冒泡法 for(i=1;i 2、选择法 for(i=0;i 3、插入法 for(i=1;i (四)Fibonacci问题 1、求Fibonacci数列中小于t的最大的一个数,结果由函数返回。int fun(int t){ int a=1,b=1,c=0,i;do { c=a+b;a=b;b=c;}while(c 2、用递归算法计算数列中第n项的值。long fun(int g){ swich(g){ case 0:return 0;switch(g)case1:case2:return 1;} return(fun(g-1)+fun(g-2));}(五)素数问题 1、将大于整数m且紧靠m的k个非素数存入所指的数组中。void fun(int m,int k,int xx[]){ int i,j,n;for(i=m+1,n=0;n 2、小于或等于lim的所有素数放在aa数组中,该函数返回所求出的素数个数。int fun(int lim, int aa[MAX]){ int i,j,k=0;for(i=2;i<=lim;i++){ for(j=2;j=i)aa[k++]=i;} return k;} 3、将所有大于1小于整数m的非素数存入xx数组中,个数通过k传回。void fun(int m,int *k,int xx[]){ int i,j,n=0;for(i=4;i {int i, j,t,n=0;for(i=2;i (六)删除相同数 int fun(int a[],int n){ int i, j=1;for(i=1;i { int i,t,j=0;t=a[0];for(i=1;i (七)统计字符个数,单词个数。 1、按‘0’到‘9’统计一个字符串中的奇数数字字符各自出现的次数,结果保存在数组num中。 void fun(char *tt, int num[]){ int i, j;int bb[10];char *p=tt;for(i=0;i<10;i++){ num[i]=0;bb[i]=0;} while(*p){ if(*p>=’0’&&*p<=’9’)bb[*p-‘0’]++;p++;} for(i=1,j=0;i<10;i=i+2,j++)num[j]==bb[i];} 2、str全部由小写字母和空格字符组成的字符串,num传入字符串长度。统计单词个数。void fun(char *s, int *num){ int I, n=0;for(i=0;i<*num;i++){ if(s[i]>=’a’&&ss[i]<=’z’&&(s[i+1]= =’’|| s[i+1]==’0’))n++;} *num=n;} 3、从’a’到’z’统计一个字符串中所有字母字符各自出现的次数,结果存在数组alf中。void fun(char *tt, int alf[]){ int i;char *p=tt;for(i=0;i<26;i++)alf[i]=0;while(*p){ if(*p>=’A’&&*p<=’Z’)*p+=32;if(*p>=’a’&&*p<=’z’)alf[*p-‘a’]++;p++;} } 4、str字符序列由字符0和1组成。查找0字符连续出现的最长长度,若有几个0字符长度相同,只记录最后1个0字符串相关信息,通过m和k返回最长0字符长度和其下标。void fun(char *str, int *m, int *k){ int i, j=0;int bb[N];char *p=str;*m=0;*k=0;for(i=0;i 5、统计在tt字符串中”a”到”z”26个字母各自出现的次数,并依次放在pp所指数组中。void fun(char *tt,int pp[]){ int i;for(i=0;i<26;i++)pp[i]=0;for(;*tt!=’’;tt++)if(;*tt>=’a’&&*tt<=’z’)pp[*tt-’a’]++;} 6、统计一个长度为n的字符串在另一个字符串中出现的次数。int fun(char *str, char *substr){ int n;char *p,*r;n=0;while(*str){ p=str;r=substr;while(*r)if(*r==*p){r++;p++;} else break;if(*r==’’)n++;str++;} return n;} 7、求出ss所指字符串中指定字符的个数,并返回此值。int fun(char *ss, char c){ int i=0;for(;*ss!=’’;ss++)if(*ss==c)i++;return i;} 8、统计一个长度为2的字符串在另一个字符串中出现的次数。int fun(char *str, char *substr){ int i,j=0;for(i=0;str[i+1]!=’’;i++)if(str[i]==substr[0]&&str[i+1]==substr[1])j++;return j;} (八)进制转换 1、把str字符串转换成任意进制的数。int fun(char *str, int x, int y){ int sum;int i=0;char *p=str;for(i=0;i :原进制;y:要转换成的进制。x while(sum!=0){ xx[i]=sum%y;sum=sum/y;i++;} return i;} 注: (1)将x转换成10进制:sum=sum*x+*p-‘0’;(2)将10进制转换成y: sum%y 得到y进制数的最低位。sum/y 得到y进制数的次低位。 2、str字符串由‘0’和‘1’组成。转换成十进制数。int fun(char *str){ int n;char *p=str;n=*p-‘0’;p++;while(*p){ n=n*2+*p-‘0’;p++;} return n;} (九)比较字符串长度 1、比较两个字符串的长度,函数返回较短的字符串。char *fun(char *s, char *t){int i,j;for(i=0;s[i]!=’’;i++);for(j=0;t[j]!=’’;j++);if(i<=j)return s;else return t;} 2、从传入的num个字符中找出最长的一个字符串,通过形参指针max传回该串地址。fun(char(*a)[81], int num,char *max){ int i=0;max=a[0];for(i=0;i (十)最大公约数,最小公倍数 1、int fun(int a, int b){ int r,t;if(a 2、输入两整数m和n,求最大公约数,最小公倍数。while(b!=0){t=a%b;a=b;b=t;} printf(“%d”,”%d”,a, n*m/a);注: 1.基本操作题 在考生文件夹下,“samp1.mdb”数据库文件中已建立表对象“tStud”。试按以下操作要求,完成表的编辑修改: (1)将“编号”字段改名为“学号”,并设置为主键; (2)设置“入校时间”字段的有效性规则为2005年之前的时间(不含2005年); (3)删除表结构中的“照片”字段; (4)删除表中学号为“000003”和“000011”的两条记录; (5)设置“年龄”字段的默认值为23; (6)完成上述操作后,将考生文件夹下文本文件“tStud.txt”中的数据导入并追加保存在表“tStud”中。参考答案: 1.基本操作题 【考点分析】本题考点:设置主键;字段的有效性规则、默认值等字段属性的设置;删除字段;删除记录;导入表。 (1)【解题步骤】 步骤1:打开“samp1.mdb”数据库窗口,选中“表”对象,右键单击“tStud”选择【设计视图】。 步骤2:将“字段名称”列的“编号”改为“学号”。 步骤3:右键单击“学号”行选择【主键】。 (2)【解题步骤】 步骤1:单击“入校时间”字段行任一点。 步骤2:在“有效性规则”行输入“<#2005-1-1#”。 (3)【解题步骤】 步骤1:右键单击“照片”字段选择【删除行】,在弹出的对话框中单击“是”按钮。 步骤2:单击工具栏中“保存”按钮。 (4)【解题步骤】 步骤1:单击菜单栏【视图】|【数据表视图】。 步骤2:选中学号为“000003”的数据行,右键单击该行选择【删除记录】,在弹出对话框中单击“是”按钮。步骤3:选中学号为“000011”的数据行,右键单击该行选择【删除记录】,在弹出对话框中单击“是”按钮。步骤4:单击工具栏中“保存”按钮。 (5)【解题步骤】 步骤1:单击菜单栏【视图】|【设计视图】。 步骤2:单击“年龄”字段行任一点,在“默认值”行输入“23”。 步骤3:单击工具栏中“保存”按钮,关闭设计视图。 (6)【解题步骤】 步骤1:单击菜单栏【文件】|【获取外部数据】|【导入】,找到并打开“考生文件夹”,在“文件类型”下拉列表中选中“文本文件”,选中“tStud.txt”文件,单击“导入”按钮。 步骤2:单击“下一步”按钮,选中“第一行包含字段名称”复选框,单击“下一步”,选中“现有的表中”单选按钮,在右侧下拉列表中选中“tStud”,单击“下一步”按钮,单击“完成”按钮。[page] 2.简单应用题 考生文件夹下存在一个数据库文件“samp2.mdb”,里面已经设计好三个关联表对象“tStud”、“tCourse”和“tScore”。此外,还提供了窗体“fTest”和宏“mTest”,试按以下要求完成设计: (1)在创建一个选择查询,查找年龄大于25的学生的“姓名”、“课程名”和“成绩”三个字段内容,所建查询命名为“qT1”; (2)创建生成表查询,组成字段是没有书法爱好学生的“学号”、“姓名”和“入校年”三列内容(其中“入校年”考试吧:一个神奇的考试网站。 数据由“入校时间”字段计算得到,显示为四位数字年的形式),生成的数据表命名为“tTemp”,所建查询命名为“qT2”; (3)补充窗体“fTest”上“test1”按钮(名为“bt1”)的单击事件代码,实现以下功能: 打开窗体,在文本框“tText”中输入一段文字,然后单击窗体“fTest”上“test1”按钮(名为“bt1”),补充代码设置窗体上标签“bTitle”的标题为文本框“tText”输入内容与文本串“等级考试测试”的连接并消除连接串的前导和尾随空白字符。 注意:不允许修改窗体对象“fTest”中未涉及的控件和属性;只允许在“*****Add1*****”与“*****Add1*****”之间的空行内补充语句、完成设计。 (4)设置窗体“fTest”上“test2”按钮(名为“bt2”)的单击事件为宏对象“mTest”。 参考答案: 2.简单应用题 【考点分析】 本题考点:创建选择查询、生成表查询;窗体中命令按钮控件属性的设置。 (1)【解题步骤】 步骤1:打开“samp2.mdb”数据库窗口,选中“查询”对象,单击“新建”按钮,选中“设计视图”,单击“确定”按钮。在“显示表”对话框中双击表“tStud”、“tCourse”、“tScore”,关闭“显示表”对话框。 步骤2:分别双击“姓名”、“课程名”、“成绩”、“年龄”字段。 步骤3:在“年龄”字段的“条件”行输入“>25”,单击“显示”行取消该字段的显示。 步骤4:单击工具栏中“保存”按钮,另存为“qT1”。关闭设计视图。 (2)【解题步骤】 步骤1:选中“查询”对象,单击“新建”按钮,选中“设计视图”,单击“确定”按钮。在“显示表”对话框双击表“tStud”,关闭“显示表”对话框。 步骤2:单击菜单栏【查询】|【生成表查询】,在弹出的对话框中输入“tTemp”,单击“确定”按钮。步骤3:分别双击“学号”、“姓名”字段将其添加到“字段”行。 步骤4:在“字段”行的下一列输入“入校年:Year([入校时间])”。 步骤5:双击“简历”字段将其添加到“字段”行,在“简历”字段的“条件”行输入“not like “*书法*””,单击“显示”行取消“简历”字段的显示。 步骤6:单击工具栏中“保存”按钮,另存为“qT2”,如图8所示。关闭设计视图。 图8 (3)【解题步骤】 步骤1:选中“窗体”对象,右键单击“fTest”选择【设计视图】。 步骤2:右键单击“test1”选择【事件生成器】,空行内输入代码: *****Add1***** bTitle.Caption=Trim(me!tText+“等级考试测试”) *****Add1***** (4)【解题步骤】 步骤1:右键单击“test2”选择【属性】。 步骤2:单击“事件”选项卡,在“单击”行右侧下拉列表中选中“mTest”,关闭属性界面。 步骤3:单击工具栏中“保存”按钮,关闭设计视图。[page] 3.综合应用题 考生文件夹下存在一个数据库文件“samp3.mdb”,里面已经设计好表对象“tEmployee”和查询对象“qEmployee”,同时还设计出以“qEmployee”为数据源的报表对象“rEmployee”。试在此基础上按照以下要求补充报表设计: (1)在报表的报表页眉节区位置添加一个标签控件,其标题显示为“职员基本信息表”,并命名为“bTitle”; (2)将报表主体节区中名为“tDate”的文本框显示内容设置为“聘用时间”字段值; (3)在报表的页面页脚区添加一个计算控件,以输出页码。计算控件放置在距上边0.25厘米、距左侧14厘米位置,并命名为“tPage”。规定页码显示格式为“当前页/总页数”,如1/20、2/20、…、20/20等。 注意:不允许修改数据库中的表对象“tEmployee”和查询对象“qEmployee”;不允许修改报表对象“rEmployee”中未涉及的控件和属性。 参考答案: 3.综合应用题 【考点分析】 本题考点:在报表中添加标签、文本框控件及其控件属性的设置。 (1)【解题步骤】 步骤1:打开“samp3.mdb”数据库窗口,选中“报表”对象,右键单击“rEmployee”选择【设计视图】。步骤2:选中工具箱中“标签”控件按钮,单击报表页眉节区适当位置,然后输入“职工基本信息表”,单击报表任一点。 步骤3:右键单击“职工基本信息表”标签选择【属性】,在“名称”行输入“bTitle”,关闭属性界面。 (2)【解题步骤】 步骤1:右键单击“tDate”文本框选择【属性】。 步骤2:在“控件来源”行右侧下拉列表中选中“聘用时间”字段,关闭属性界面。 (3)【解题步骤】 步骤1:选中工具箱中“文本框”控件,单击报表页面页脚节区任一点,弹出“Text”标签和“未绑定”文本框,选中“Text”标签,然后按下“Del”键将“Text”标签删除。 步骤2:右键单击“未绑定”文本框选择【属性】,弹出属性对话框。选中“全部”选项卡,在“名称”行输入“tPage”,分别在“上边距”和“左边距”输入“0.25cm”和“14cm”。单击“控件来源”行输入“=[Page]&“/”&[Pages]”,关闭属性界面。 1. 一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如: struct bs { unsigned a:4 unsigned :0 /*空域*/ unsigned b:4 /*从下一单元开始存放*/ unsigned c:4 } 在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。 2. 由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。 3. 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如: struct k { int a:1 int :2 /*该2位不能使用*/ int b:3 int c:2 }; 从以上分析可以看出,位域在本质上就是一种结构类型, 不过其成员是按二进位分配的。 二、位域的使用位域的使用和结构成员的使用相同,其一般形式为: 位域变量名?位域名 位域允许用各种格式输出。 main(){ struct bs { unsigned a:1; unsigned b:3; unsigned c:4; } bit,*pbit; bit.a=1; bit.b=7; bit.c=15; pri 改错: #include int main(void) { int **p; int arr[100]; p = &arr; return 0; } 解答: 搞错了,是指针类型不同, int **p; //二级指针 &arr; //得到的是指向第一维为100的数组的指针 #include int main(void) { int **p, *q; int arr[100]; q = arr; p = &q; return 0; } 下面这个程序执行后会有什么错误或者效果: #define MAX 255 int main() { unsigned char A[MAX],i;//i被定义为unsigned char for (i=0;i<=MAX;i++) A[i]=i; } 解答:死循环加数组越界访问(C/C++不进行数组越界检查) MAX=255 数组A的下标范围为:0..MAX-1,这是其一.. 其二.当i循环到255时,循环内执行: A[255]=255; 这句本身没有问题..但是返回for (i=0;i<=MAX;i++)语句时, 由于unsigned char的取值范围在(0..255),i++以后i又为0了..无限循环下去. struct name1{ char str; short x; int num; } struct name2{ char str; int num; short x; } sizeof(struct name1)=8,sizeof(struct name2)=12 在第二个结构中,为保证num按四个字节对齐,char后必须留出3字节的空间;同时为保证整个结构的自然对齐(这里是4字节对齐),在x后还要补齐2个字节,这样就是12字节。 intel: A.c 和B.c两个c文件中使用了两个相同名字的static变量,编译的时候会不会有问题?这两个static变量会保存到哪里(栈还是堆或者其他的)? static的全局变量,表明这个变量仅在本模块中有意义,不会影响其他模块。 他们都放在数据区,但是编译器对他们的命名是不同的。 如果要使变量在其他模块也有意义的话,需要使用extern关键字。 struct s1 { int i: 8; int j: 4; int a: 3; double b; }; struct s2 { int i: 8; int j: 4; double b; int a:3; }; printf(”sizeof(s1)= %d“, sizeof(s1)); printf(”sizeof(s2)= %d“, sizeof(s2)); result: 16, 24 第一个struct s1 { int i: 8; int j: 4; int a: 3; double b; }; 理论上是这样的,首先是i在相对0的位置,占8位一个字节,然后,j就在相对一个字节的位置,由于一个位置的字节数是4位的倍数,因此不用对齐,就放在那里了,然后是a,要在3位的倍数关系的位置上,因此要移一位,在15位的位置上放下,目前总共是18位,折算过来是2字节2位的样子,由于double是8 字节的,因此要在相对0要是8个字节的位置上放下,因此从18位开始到8个字节之间的位置被忽略,直接放在8字节的位置了,因此,总共是16字节。 第二个最后会对照是不是结构体内最大数据的倍数,不是的话,会补成是最大数据的倍数 1)读文件file1.txt的内容(例如): 12 34 56 输出到file2.txt: 56 34 12 (逆序) 2)输出和为一个给定整数的所有组合 例如n=5 5=1+4;5=2+3(相加的数不能重复) 则输出 1,4;2,3。 望高手赐教!! 第一题,注意可增长数组的应用. #include #include int main(void) { int MAX = 10; int *a = (int *)malloc(MAX * sizeof(int)); int *b; FILE *fp1; FILE *fp2; fp1 = fopen(”a.txt“,”r“); if(fp1 == NULL) {printf(”error1“); exit(-1); } fp2 = fopen(”b.txt“,”w“); if(fp2 == NULL) {printf(”error2“); exit(-1); } int i = 0; int j = 0; while(fscanf(fp1,”%d“,&a[i]) != EOF) { i++; j++; if(i >= MAX) { MAX = 2 * MAX; b = (int*)realloc(a,MAX * sizeof(int)); if(b == NULL) { printf(”error3“); exit(-1); } a = b; } } for(;--j >= 0;) fprintf(fp2,”%d“,a[j]); fclose(fp1); fclose(fp2); return 0; } 第二题. #include int main(void) { unsigned long int i,j,k; printf(”please input the number“); scanf(”%d“,&i); if( i % 2 == 0) j = i / 2; else j = i / 2 + 1; printf(”The result is “); for(k = 0; k < j; k++) printf(”%d = %d + %d“,i,k,i - k); return 0; } #include void main() { unsigned long int a,i=1; scanf(”%d“,&a); if(a%2==0) { for(i=1;i printf(”%d“,a,a-i); } else for(i=1;i<=a/2;i++) printf(” %d, %d“,i,a-i); } 兄弟,这样的题目若是做不出来实在是有些不应该, 给你一个递规反向输出字符串的例子,可谓是反序的经典例程. void inverse(char *p) { if( *p = = ”�“ ) return; inverse( p+1 ); printf( ”%c“, *p ); } int main(int argc, char *argv[]) { inverse(”abc�“); return 0; } 借签了楼上的“递规反向输出” #include void test(FILE *fread, FILE *fwrite) { char buf[1024] = {0}; if (!fgets(buf, sizeof(buf), fread)) return; test( fread, fwrite ); fputs(buf, fwrite); } int main(int argc, char *argv[]) { FILE *fr = NULL; FILE *fw = NULL; fr = fopen(”data“, ”rb“); fw = fopen(”dataout“, ”wb"); test(fr, fw); fclose(fr); fclose(fw); return 0; } 在对齐为4的情况下 struct BBB { long num; char *name; short int data; char ha; short ba[5]; }*p; p=0x1000000; p+0x200=____; (Ulong)p+0x200=____; (char*)p+0x200=____; 希望各位达人给出答案和原因,谢谢拉 解答:假设在32位CPU上, sizeof(long) = 4 bytes sizeof(char *) = 4 bytes sizeof(short int) = sizeof(short) = 2 bytes sizeof(char) = 1 bytes 由于是4字节对齐, sizeof(struct BBB) = sizeof(*p) = 4 + 4 + 2 + 1 + 1/*补齐*/ + 2*5 + 2/*补齐*/ = 24 bytes (经Dev-C++验证) p=0x1000000; p+0x200=____; = 0x1000000 + 0x200*24 (Ulong)p+0x200=____; = 0x1000000 + 0x200 (char*)p+0x200=____; = 0x1000000 + 0x200*4 【西北农林科技大学 c语言上机 实习7答案】推荐阅读: 西北农林科技大学先正达奖学金评定办法10-18 浙江农林大学新增7个专业硕士领域07-01 西北师范大学汉语言文学专业课程教学大纲10-25 农林经济管理专业生产认知实习报告08-22 西北民族大学锅炉房、污水处理厂实习报告06-12 福建农林大学简介06-15 农林牧渔10-17 浙江农林大学金融学10-15 浙江农林大学电子商务11-11 书记农林牧渔06-302.C 语言上机总结报告 篇二
3.计算机二级C语言上机题型总结 篇三
4.西北农林科技大学 c语言上机 实习7答案 篇四
5.C语言面试题大7 篇五