1. 计算机二级c语言编程实训报告,有会写的学哥学姐帮帮忙,急急急啊!!
如果应付式的就简单了,顺便找个项目或者案例,套进去就可以了,但不提倡
2. c语言实验报告总结怎么写
实验报告总结示例如下:
1、此次设计也让我明白了思路即出路,有什么不懂不明白的地方要及时请教或上网查询,只要认真钻研,动脑思考,动手实践,就没有弄不懂的知识,俗话说的好,读书破万卷下笔如有神,没有学不会只有不肯学!我坚信,只要下一番功夫就能有理想的收获!
2、通过这次实验,让我更加了解到地理信息系统原理与方法的重要性,以及它对我们资源勘查专业发展发挥的重要作用。学习,我觉得结果并不是最重要的,很多结果并不美好。
但是学习这个过程是不可少的。当自己把本课程所有的实验做完后,才领悟到老师所说话的含义,要掌握一种新的软件,得随着实践的演练,通过循序渐进的学习,才能更好的掌握它。这次实验,学到的东西很多。
3、我认为,在这学期的gis实验中,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。更重要的是,在实验课上,我们学会了很多学习的方法。而这也是日后最实用的,真的是受益匪浅。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。这对于我们的将来也有很大的帮助。
4、综上所述,经过这次实习,我了解了很多日后工作所需的基本技能,检验了平时所学习的基础知识,对植物营养这门学科有了更深刻的理解,这于我来说无疑是受益匪浅的。我相信,这次实习让我获得的经验、心得会促进我在以后的学习、工作中寻找到合理的方法和正确的方向。最终感激学校为我们供给这样的实习机会。
5、这次实验虽然仅有短短的xx天,可是实习资料异常丰富,并且经过这个实习我们都得到了知识上的复习和本事上的提高。正是因为这个实习,加深了我对植物营养学这门学科的了解,同时对我们专业的发展方向有了初步认识。这次实习不但巩固了我们平时所学,也为我们日后的专业工作供给了十分实际的便利。
3. C语言实验报告总结
你只需要按那个模版就行,那些内容就改成你的作业
班级: 学号: 姓名:
实验9 指针
一、实验目的
(1)掌握指针概念,并定义与使用它。
(2)使用数组的指针和指向数组的指针变量。
(3)使用字符串的指针和指向字符串的指针变量。
二、实验内容
1. 将一个3*3的矩阵转置,用函数实现。
2. 有n个人围成一圈,顺序排号。从第一个人开始报数(1~3),凡报到3的人退出,问第几号的人能留下。
三、实验环境
硬件:(1)学生用微机
(2)多媒体实验教室
软件:(1)Windows XP 中文操作系统
(2)VC++ 6.0
四、实验结果
程序1:
#include<stdio.h>
void main()
{
void move(int *pointer);
int a[3][3],*p,i;
printf("input marix:\n");
for(i=0;i<3;i++)
scanf("%d %d %d",&a[i][0],&a[i][1],&a[i][2]);
p=&a[0][0];
move(p);
printf("matrix:\n");
for(i=0;i<3;i++)
printf("%d %d %d\n",a[i][0],a[i][1],a[i][2]);
}
void move(int *pointer)
{
int i,j,t;
for(i=0;i<3;i++)
for(j=i;j<3;j++)
{
t=*(pointer+3*i+j);
*(pointer+3*i+j)=*(pointer+3*j+i);
*(pointer+3*j+i)=t;
}
}
程序2:
#include<stdio.h>
void main()
{
int i,k,m,n,num[50],*p;
printf("input num of person:");
scanf("%d",&n);
p=num;
for(i=0;i<n;i++)
*(p+i)=i+1;
i=0;
k=0;
m=0;
while(m<n-1)
{
if(*(p+i)!=0)k++;
if(k==3)
{
*(p+i)=0;
k=0;
m++;
}
i++;
if(i==n)i=0;
}
while(*p==0)p++;
printf("the last num is %d\n",*p);
}
结果1:(就是程序运行之后出现的框,截图后粘贴这里)
结果2:
五、总结:
通过这个实验的学习, 基本掌握了指针的基本用法。
4. c语言实验报告心得
c语言实验心得:
1、只有频繁用到或对运算速度要求很高的变量才放到data区内,如for循环中的计数值。
2、其他不频繁调用到和对运算速度要求不高的变量都放到xdata区。
3、常量放到code区,如字库、修正系数。
4、逻辑标志变量可以定义到bdata中。
在51系列芯片中有16个字节位寻址区bdata,其中可以定义8*16=128个逻辑变量。这样可以大大降低内存占用空间。定义方法是: bdata bit LedState;但位类型不能用在数组和结构体中。
5、data区内最好放局部变量。
因为局部变量的空间是可以覆盖的(某个函数的局部变量空间在退出该函数是就释放,由别的函数的局部变量覆盖),可以提高内存利用率。当然静态局部变量除外,其内存使用方式与全局变量相同;
6、确保程序中没有未调用的函数。
在Keil C里遇到未调用函数,编译器就将其认为可能是中断函数。函数里用的局部变量的空间是不释放,也就是同全局变量一样处理。这一点Keil做得很愚蠢,但也没办法。
7、如果想节省data空间就必须用large模式。
将未定义内存位置的变量全放到xdata区。当然最好对所有变量都要指定内存类型。
8、使用指针时,要指定指针指向的内存类型。
在C51中未定义指向内存类型的通用指针占用3个字节;而指定指向data区的指针只占1个字节;指定指向xdata区的指针占2个字节。如指针p是指向data区,则应定义为: char data *p;。还可指定指针本身的存放内存类型,如:char data * xdata p;。其含义是指针p指向data区变量,而其本身存放在xdata区。
以前没搞过C51,大学时代跟单片机老师的时候也是捣鼓下汇编,现在重新搞单片机,因为手头资料不多,找到一些C51的程序,发现里面有这些关键字,不甚明了,没办法只好找了下,发现如下描述:
从数据存储类型来说,8051系列有片内、片外程序存储器,片内、片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应code、data、xdata、idata以及根据51系列特点而设定的pdata类型,使用不同的存储器,将使程序执行效率不同,在编写C51程序时,最好指定变量的存储类型,这样将有利于提高程序执行效率(此问题将在后面专门讲述)。与ANSI-C稍有不同,它只分SAMLL、COMPACT、LARGE模式,各种不同的模式对应不同的实际硬件系统,也将有不同的编译结果。
在51系列中data,idata,xdata,pdata的区别
data:固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。
idata:固定指前面0x00-0xff的256个RAM,其中前128和data的128完全相同,只是因为访问的方式不同。idata是用类似C中的指针方式访问的。汇编中的语句为:mox ACC,@Rx.(不重要的补充:c中idata做指针式的访问效果很好)
xdata:外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR访问。
pdata:外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movx ACC,@Rx读写。这个比较特殊,而且C51好象有对此BUG,建议少用。但也有他的优点,具体用法属于中级问题,这里不提。
三、有关单片机ALE引脚的问题
"单片机不访问外部锁存器时ALE端有正脉冲信号输出,此频率约为时钟振荡频率的1/6.每当访问
外部数据存储器是,在两个机器周期中ALE只出现一次,即丢失一个ALE脉冲."这句话是不是有毛
病.我觉得按这种说法,应该丢失3个ALE脉冲才对,我一直想不通是怎么回事,希望大虾们帮帮我.
小弟感激涕零.
答:
其他所有指令每6个机器周期发出一个ALE,而MOVX指令占用12个机器周期只发出一个ALE
四、如何将一个INT型数据转换成2个CHAR型数据?
经keil优化后,char1=int1/256,char2=int1%256或char1=int1>>8,char2=int1&0x00ff效率是一样的。
五、在KEIL C51上仿真完了,怎样生成HEX文件去烧写??
右键点项目中Target 1,选第二个,在OUTPUT中选中CREAT HEX
六、typedef 和 #define 有何不同??
typedef 和 #define 有何不同》》》 如
typedef unsigned char UCHAR ;
#define unsigned char UCHAR ;
typedef命名一个新的数据类型,但实际上这个新的数据类型是已经存在的,只不过是定义了
一个新的名字.
#define只是一个标号的定义.
你举的例子两者没有区别,但是#define还可以这样用
#define MAX 100
#define FUN(x) 100-(x)
#define LABEL
等等,这些情况下是不能用typedef定义的
七、请问如何设定KELC51的仿真工作频(时钟)
用右键点击左边的的target 1,然后在xtal一栏输入
八、不同模块怎样共享sbit变量,extern不行?
把SBIT定义单独放到一个.H中,每个模块都包含这个.h文件
九、C51中对于Px.x的访问必须自己定义吗?
是的。
如sbit P17 = 0x97;即可定义对P1.7的访问
十、SWITCH( )语句中表达式不可以是位变量对吗?
可以用位变量:
#include
#include
void main()
{
bit flag;
flag=0;
switch(flag)
{
case '0':{printf("0\n");break;}
case '1':{printf("1\n");break;}
default:break;
}
}
bit 变量只有两种状态,if 语句足够啦,!!!
十一、const常数声明占不占内存???
const 只是用来定义“常量”,所占用空间与你的定义有关,如:
const code cstStr[] = {"abc"};
占用代码空间;而如:
const char data cstStr[] = {"abc"};
当然占用内存空间。
另外,#define 之定义似乎不占用空间。
十二、philips的单片机P89C51RD+的扩展RAM在C51中如何使用?
试一试将auxr.1清0,然后在c语言中直接声明xdata类型的变量
十三、BUG of Keil C51
程序中用如下语句:
const unsigned char strArr[] = {"数学"};
结果发现strArr[] 内容为 {0xCA,0xD1,0xA7},真奇怪!
凡是有0xfd,则会通通不见了,所以只能手工输入内码了,例如 uchar strArr[]=
{0xCA,0xfd,0xd1,0xa7}(用Ultraedit会很方便)。
十四、Keil C51中如何实现代码优化?
菜单Project下Option for target "Simulator"的C51.
看到Code optimization了吗?
十五、请教c的!和 ~ 符号有甚区别??
!是逻辑取反,~是按位取反。
十六、c51编程,读端口,还要不要先输出1?
我怎么看到有的要,有的不要,请高手给讲讲,到底咋回事?谢了
要输出1的,除非你能保证之前已经是1,而中间没有输出过其他值。
十七、当定时器1(T1)用于产生波特率时,P3^5还是否可以用作正常的I/O口呢?
p3.5完全可以当普通的io使用
十八、C51中 INT 转换为 2个CHAR?
各位高手:
C51中 INT 转换为 CHAR 如何转换诸如:
X = LOW(Z);
Y = HIGH(Z);
答:
x=(char)z;
y=(char)(z>>8);
十九、如果我想使2EH的第7位置1的话,用位操作可以吗?
现在对位操作指令我一些不太明白请各位多多指教:
如 SETB 07H 表示的是20H.7置1,对吗?(我在一本书上是这么看到的)
那么如果我想使2EH的第7位置1的话,象我举的这个例子怎么表示呢?谢谢!
SETB 77H
setb (2eh-20h)*8+7
20h-2fh每字节有8个可位操作(00h-7fh),其它RAM不可位直接操作
二十、char *addr=0xc000 和char xdata *addr=0xc000有何区别?
char *addr=0xc000;
char xdata *addr=0xc000;
除了在内存中占用的字节不同外,还有别的区别吗?
char *addr=0xc000; 是通用定义,指针变量 addr 可指向任何内存空间的值;
char xdata *addr=0xc000; 指定该指针变量只能指向 xdata 中的值;
后一种定义中该指针变量(addr)将少占用一个存储字节。
uchar xdata *addr=0xc000;指针指向外ram;
如果:data uchar xdata *addr=0xc000;指针指向外ram但指针本身存在于内ram(data)
中
以此类推可以idata uchar xdata *addr=0xc000;pdata uchar xdata *addr=0xc000;
data uchar idata *addr=0xa0;.........
二十一、while(p1_0)的执行时间?
假设,P1_0为单片机P1口的第一脚,请问,
while(P1_0)
{
P1_0=0;
}
while(!P1_0)
{
P1_0=1;
}
以上代码,在KEIL C中,需要多长时间,执行完。能具体说明while(P1_0)的执行时间吗?
仿真运行看看就知道了,
我仿真了试了一下,约14个周期
二十二、怎样编写C51的watchdog程序?
各位大虾,我用KEIL C51 编写了一个带外部开门狗的程序,可程序无法运行起来,经过查
找,发现程序在经过C51编译后,在MAIN()函数的前部增加了一端初始化程序,等到进入
主程序设置开门狗时,开门狗已经时间到,将我的程序复位了,请问我怎样才能修改这一端
初始花程序,使他一运行,就设置开门狗?
可以在startup.a51中加入看门狗刷新指令,当然用汇编,然后重新编译startup.a51
,将他和你的程序连接即可。新的startup.a51会自动代替系统默认的启动模块。
二十三、keil C51 怎样把修改的startup.a51 加到工程文件中
直接加入即可
注意不要改动?STACK,?C_START,?C_STARTUP等符号。startup.a51直接加入项目,不用修改也可。可在内面自己修改汇编的一些限制或堆栈指针。
二十四、关于波特率的设置
我在设定串口波特率时发现一个问题:在晶体震荡器为11.0592MHz时,若设9600BPS的话,
TH1=0XFD,TL1=0XFD,而要设19200BPS的话,TH1、TL1有否变化,如果没变,为什么?
如果变了,又为什么?(因为我看书上俩个是一样的),希望大家点拨。
答:
当电源控制寄存器(PCON)第BIT7(SMOD)为1时波特率加倍。
TH1和TL1的值不变.
二十五、如何在C中声明保留这部分RAM区不被C使用?
我不知道在C源程序中怎么控制这个,但在汇编程序中加入下面一段就行:
DSEG AT 20H
AA: DS 10
这样C51就不会占用20H--29H了
或者在c51里这样定义:
uchar data asm_buff[10] _at_ 0x20;
二十六、问浮点运算问题
我在用C51时发现它对传递浮点参数的个数有限制,请问:
1)参数是以全局变量的形式传递的,请问以全局变量的形式传递的参数也有限制吗?
2)这种传递浮点参数的限制有多少呢?
3)float*float的结果是float类型还是double类型?能否直接赋值给float类型的变量?
答:
由于KEIL C51的参数传递是通过R0-R7来传递的,所以会有限制。
不过KEIL提供了一个编译参数,可以支持更多参数的传递。具体
的内容见KEIL的PDF文档。
我建议你把多个要传递的参数定义到指针或结构体中去,传递参
数通过指针或结构进行,这样好一些。
第3个问题回答是YES,你自己试试不就知道了。
二十七、如何在某一个地址定义ram
用_at_ 命令,这样可以定位灵活一点的地址
uchar xdata dis_buff[16] _at_ 0x6020 ;//定位RAM
将dis_buff[16]定位在0x6020开始的16个字节
二十八、keil c中,用什么函数可以得到奇偶校验位?
例如32位数据,将四个字节相互异或后检查P即可,若耽心P被改变,可用内嵌汇编。
#include
unsigned char parity(unsigned char x){
x^=x;
if(P)return(1);
else return(0);
}
unsigned char parity2(unsigned int x){
#pragma asm
mov a,r7
xrl ar6,a
#pragma endasm
if(P)return(1);
else return(0);
}
5. C语言实验报告怎么写实验步骤高手最好给个样板啊!
.实验报告规范
实验报告内容包括:
1.实验目的:说明实验所验证的知识点。
2.需求分析:以无歧义的陈述说明程序设计的任务、约束条件、输入输出要求、对功能的规定及模型。
3.逻辑设计:说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次调用关系。
4.详细设计:逻辑设计中定义的所有数据类型的实现,核心算法的设计描述、人机界面设计、函数之间调用关系的描述,主要功能的算法框架,测试数据设计。
5.测试分析:测试结果的分析与讨论,测试过程中遇到的主要问题及采取的解决措施。
6.心得:软件设计与实现过程中的经验与体会,进一步改进的设想。
7.程序清单:源程序中应有足够的注释。如果提交源程序软盘,列出程序文件名。
6. C语言实训报告!急!!!!!
1.#include<stdio.h>
void main()
{
float sum=0;//总分
float max=0;//最高分
float min=100;//最低分
int i=0;//统计输入个数
float score;
while(1)
{
printf("请输入第%d个评委的分数:",i+1);
scanf("%f",&score);
if(score==-1) break;//输入-1退出循环
else
{
if(score>max) max=score;
if(score<min) min=score;
sum+=score;
i++;
}
}
2.#include <stdio.h>
int main( )
{ int i,n=10,a[10],av=0;//英文下分号,av 初始化
for(i=0;i<n;i++) //英文下分号,n要有值
scanf("%d",&a[i]); //少了&
for(i=0;i<n;i++)
{ printf("%d",a[i]);
if((i+1)%3==0)
printf("\n");
}
for(i=0;i!=n;i++)
av+=a[i];
printf("av=%f\n",(float)av/n);
}
3.
#include <stdio.h>
#define N 5
int main(int argc, char *argv[])
{
int num[N]={0},i=0,k=0;
float score[N]={0.0};
for(i=0; i<N; i++)
scanf("%d%f",&num[i],&score[i]);
for(i=1; i<N; i++)
if(score[k]<score[i]) k=i;
for(i=0; i<N; i++)
printf("%8d",num[i]);
printf("\n");
for(i=0; i<N; i++)
printf("%8.2f",score[i]);
printf("\n");
printf("number=%d,score=%.2f\n",num[k],score[k]);
return 0;
}
4.
(1)
#include <stdio.h>
int main(int argc, char *argv[])
{
int a[8]= {34,56,45,57,69,48,79,61},i=0,j=0,k=0,t=0;
for(i=0; i<7; i++) {
k=i;
for(j=i+1; j<8; j++)
if(a[k]<a[j]) k=j;
t=a[i]; a[i]=a[k]; a[k]=t;
}
for(i=0; i<8; i++)
printf("%5d",a[i]);
printf("\n");
return 0;
}
(2)
#include <stdio.h>
int main(int argc, char *argv[])
{
int a[8]= {34,56,45,57,69,48,79,61},i=0,j=0,t=0;
for(i=0; i<7; i++)
for(j=i+1; j<8; j++)
if(a[i]<a[j]) {
t=a[i]; a[i]=a[j]; a[j]=t;
}
for(i=0; i<8; i++)
printf("%5d",a[i]);
printf("\n");
return 0;
}
5.#include <stdio.h>
void main()
{ int n[11],i,j,m,f;
for(i=0;i<10;i++)
scanf("%d",&n[i]);
for(i=0;i<10;i++)
for(j=i+1;j<10;j++)
{
f=n[i];
n[i]=n[i]>n[j]?n[i]:n[j];
if(n[j]>f)n[j]=f;
}
for(i=0;i<10;i++)
printf("%7d",n[i]);
printf("\nplease enter the 11th number:\n");
scanf("%d",&m);
for(i=0;i<10;i++)
if(m>n[i])
{
for(j=10;j>i;j--)
n[j]=n[j-1];
n[i]=m;
break;
}
else
if(i==9 && m<=n[9])
n[10]=m;
for(i=0;i<11;i++)
printf("%7d",n[i]);
getch();
}
6.#include <stdio.h>
int main(int argc, char *argv[])
{ int i,j,a[4][4],sum=0,p=1,max,maxi;
for (i=0;i<4;i++)
for (j=0;j<4;j++)
scanf("%d",&a[i][j]);
max=a[0][0];
for (i=0;i<4;i++)
{ sum+=a[i][i];
if (i%2==0)
p*=a[i][i];
if(a[i][i]>max)
{ max=a[i][i];
maxi=i;
}
}
printf("对角线上各元素的和:%d\n",sum);
printf("对角线上行、列下标均为偶数的各元素的积:%d\n",p);
printf("对角线上其值最大的元素:%d,它在数组中的位置:第%d行第%d列\n",max,maxi,maxi);
return 0;
}
7. 求一份C语言实训报告
1)程序结构是三种:顺序结构,循环结构(三个循环结构),选择结构(if 和 switch)
2)读程序都要从main()入口, 然后从最上面顺序往下读(碰到循环做循环,碰到选择做选择)。
3)计算机的数据在电脑中保存是以 二进制的形式. 数据存放的位置就是 他的地址.
4)bit是位 是指为0 或者1。 byte 是指字节, 一个字节 = 八个位.
5)一定要记住 二进制 如何划成 十进制。
概念常考到的:
1、编译预处理不是C语言的一部分,不再运行时间。C语言编译的程序称为源程序,它以ASCII数值存放在文本文件中。
2、每个C语言程序中main函数是有且只有一个。
3、在函数中不可以再定义函数。
4、算法的是一定要有输出的,他可以没有输入。
5、break可用于循环结构和switch语句。
6、逗号运算符的级别最低。
第一章
1)合法的用户标识符考查:
合法的要求是由字母,数字,下划线组成。有其它元素就错了。
并且第一个必须为字母或则是下划线。第一个为数字就错了。
关键字不可以作为用户标识符号。main define scanf printf 都不是关键字。迷惑你的地方If是可以做为用户标识符。因为If中的第一个字母大写了,所以不是关键字。
2)实型数据的合法形式:
2.333e-1 就是合法的,且数据是2.333×10-1。
考试口诀:e前e后必有数,e后必为整数。.
3)字符数据的合法形式::
'1' 是字符占一个字节,"1"是字符串占两个字节(含有一个结束符号)。
'0' 的ASCII数值表示为48,'a' 的ASCII数值是97,'A'的ASCII数值是65。
4) 整型一般是两个字节, 字符型是一个字节,双精度一般是4个字节:
考试时候一般会说,在16位编译系统,或者是32位系统。碰到这种情况,不要去管,一样做题。掌握整型一般是两个字节, 字符型是一个字节,双精度一般是4个字节就可以了。
5)转义字符的考查:
在程序中 int a = 0x6d,是把一个十六进制的数给变量a 注意这里的0x必须存在。
在程序中 int a = 06d, 是一个八进制的形式。
在转义字符中,’\x6d’ 才是合法的,0不能写,并且x是小写。
‘\141’ 是合法的, 0是不能写的。
‘\108’是非法的,因为不可以出现8。
6)算术运算符号的优先级别:
同级别的有的是从左到右,有的是从右到左。
7)强制类型转换:
一定是 (int)a 不是 int(a),注意类型上一定有括号的。
注意(int)(a+b)和(int)a+b 的区别。 前是把a+b转型,后是把a转型再加b。
8)表达式的考查:
是表达式就一定有数值。
赋值表达式:表达式数值是最左边的数值,a=b=5;该表达式为5,常量不可以赋值。
自加、自减表达式:假设a=5,++a(是为6), a++(为5);
运行的机理:++a 是先把变量的数值加上1,然后把得到的数值放到变量a中,然后再用这
个++a表达式的数值为6,而a++是先用该表达式的数值为5,然后再把a的数值加上1为6,
再放到变量a中。 进行了++a和a++后在下面的程序中再用到a的话都是变量a中的6了。
考试口诀:++在前先加后用,++在后先用后加。
逗号表达式:优先级别最低 ;表达式的数值逗号最右边的那个表达式的数值。
(2,3,4)的表达式的数值就是4。
9)位运算的考查:
会有一到二题考试题目。
总的处理方法:几乎所有的位运算的题目都要按这个流程来处理(先把十进制变成二进制再变成十进制)。
例1:char a = 6, b;
b = a<<2; 这种题目的计算是先要把a的十进制6化成二进制,再做位运算。
例2:一定要记住,
例3:在没有舍去数据的时候,<<左移一位表示乘以2;>>右移一位表示除以2。
10)018的数值是非法的,八进制是没有8的,逢8进1。
11)%符号两边要求是整数。不是整数就错了。
12)三种取整丢小数的情况:
1、int a =1.6;
2、(int)a;
3、
第二章
1)printf函数的格式考查:
%d对应整型;%c对应字符;%f对应单精度等等。宽度的,左对齐等修饰。
%ld对应 long int;%lf 对应double。
2)scanf函数的格式考察:
注意该函数的第二个部分是&a这样的地址,不是a;
Scanf(“%d%d%*d%d”,&a,&b,&c); 跳过输入的第三个数据。
3)putchar ,getchar 函数的考查:
char a = getchar() 是没有参数的,从键盘得到你输入的一个字符给变量a。
putchar(‘y’)把字符y输出到屏幕中。
4)如何实现两个变量x ,y中数值的互换(要求背下来)
不可以把 x=y ,y=x; 要用中间变量 t=x;x=y;y=t。
5)如何实现保留三位小数,第四位四舍五入的程序,(要求背下来)
这个有推广的意义,注意 x = (int)x 这样是把小数部分去掉。
第三章
特别要注意:c语言中是用非0表示逻辑真的,用0表示逻辑假的。
1)关系表达式:
表达式的数值只能为1(表示为真),或0(表示假)
当关系的表达是为真的时候得到1。如 9>8这个是真的,所以表达式的数值就是1;
2)逻辑表达式:
只能为1(表示为真),或0(表示假)
a) 共有&& || ! 三种逻辑运算符号。
b) !>&&>|| 优先的级别。
c) 注意短路现象。考试比较喜欢考到。
d) 要表示 x 是比0大,比10小的方法。0<x<10是不可以的(一定记住)。是先计算0<x 得到的结果为1或则0;再用0,或1与10比较得到的总是真(为1)。所以一定要用(0<x)&&(x<10)表示比0大比10小。
3)if 语句
else 是与最接近的if且没有else的相组合的。
4)条件表达式:
表达式1 ?表达式2 :表达式3
注意是当非0时候是表达式2的数值,当为0是就是表达式2的数值。
考试口诀:真前假后。
5)switch语句:
a)一定要注意 有break 和没有break的差别,书上(34页)的两个例子,没有break时候,只要有一个case匹配了,剩下的都要执行,有break则是直接跳出了swiche语句。
b)switch只可以和break一起用,不可以和continue用。
第四章
1)三种循环结构:
a)for() ; while(); do- while()三种。
b)for循环当中必须是两个分号,千万不要忘记。
c)写程序的时候一定要注意,循环一定要有结束的条件,否则成了死循环。
d) do-while()循环的最后一个while();的分号一定不能够丢。(当心上机改错)
2) break 和 continue的差别
记忆方法:
break:是打破的意思,(破了整个循环)所以看见break就退出真个一层循环。
continue:是继续的意思,(继续循环运算),但是要结束本次循环,就是循环体内剩下的语句不再执行,跳到循环开始,然后判断循环条件,进行新一轮的循环。
3)嵌套循环
就是有循环里面还有循环,这种比较复杂,要一层一层一步一步耐心的计算,一般记住两层是处理二维数组的。
4) while((c=getchar())!=’\n’) 和 while(c=getchar() !=’\n’)的差别
先看a = 3 != 2 和 (a=3)!=2 的区别:
(!=号的级别高于=号所以第一个先计算 3!=2)第一个a的数值是得到的1;第二个a的数值是3。
考试注意点:括号在这里的重要性。
第五章
函数:是具有一定功能的一个程序块;
1) 函数的参数,返回数值(示意图):
main()
{
int a = 5,b=6,c;
c =add(a,b);
printf(“%d”,c);
}
调用函数
a,b是实参
整个函数得到一个数值就是
Add函数的返回数值。
int add ( int x, int y)
{
int z;
z=x+y;
return z;
}
被调用函数
x,y是形式参数
函数返回数值是整型
z就是这个add函数计算后得到的结果,就是函数返回给主程序的返回数值。
程序是在从上往下顺序执行,当碰到了函数add后,把a,b的数值穿给调用函数,程序暂时中断等待返回数值。当得到了返回数值后,再顺序的往下执行
2)一定要注意参数之间的传递
实参和形参之间传数值,和传地址的差别。(考试的重点)
传数值的话,形参的变化不会改变实参的变化。
传地址的话,形参的变化就会有可能改变实参的变化。
3)函数声明的考查:
一定要有:函数名,函数的返回类型,函数的参数类型。
不一定要有:形参的名称。
第六章
指针变量的本质是用来放地址,而一般的变量是放数值的。
int *p 中 *p和p的差别:
*p可以当做变量来用;*的作用是取后面地址p里面的数值
p是当作地址来使用。
*p++ 和 (*p)++的之间的差别:改错题目中很重要
*p++是 地址会变化。
(*p)++ 是数值会要变化。
三名主义:(考试的重点)
数组名:表示第一个元素的地址。数组名不可以自加,他是地址常量名。(考了很多次)
函数名:表示该函数的入口地址。
字符串常量名:表示第一个字符的地址。
第七章
1一维数组的重要概念:
对a[10]这个数组的讨论。
1、a表示数组名,是第一个元素的地址,也就是元素a[10]的地址。
2、a是地址常量,所以只要出现a++,或者是a=a+2赋值的都是错误的。
3、a是一维数组名,所以它是列指针,也就是说a+1是跳一列。
对a[3][3]的讨论。
1、a表示数组名,是第一个元素的地址,也就是元素a[10]的地址。
2、a是地址常量,所以只要出现a++,或者是a=a+2赋值的都是错误的。
3、a是二维数组名,所以它是行指针,也就是说a+1是跳一行。
4、a[0]、a[1]、a[2]也都是地址常量,不可以对它进行赋值操作,同时它们都是列指针,a[0]+1,a[1]+1,a[2]+1都是跳一列。
5、注意a和a[0] 、a[1]、a[2]是不同的,它们的基类型是不同的。前者是一行元素,后三者是一列元素。
二维数组做题目的技巧:
如果有a[3][3]={1,2,3,4,5,6,7,8,9}这样的题目。
步骤一:把他们写成:第一列第二列第三列
a[0]à 1 2 3 ->第一行
a[1]à 4 5 6 —>第二行
a[2]à 7 8 9 ->第三行
步骤二:这样作题目间很简单:
*(a[0]+1)我们就知道是第一行的第一个元素往后面跳一列,那么这里就是a[0][1]元素,所以是1。
*(a[1]+2)我们就知道是第二行的第一个元素往后面跳二列。那么这里就是a[1][2]元素,所以是6。
一定记住:只要是二维数组的题目,一定是写成如上的格式,再去做题目,这样会比较简单。
数组的初始化,一维和二维的,一维可以不写,二维第二个一定要写
int a[]={1,2} 合法。 int a[][4]={2,3,4}合法。 但int a[4][]={2,3,4}非法。
二维数组中的行指针
int a[1][2];
其中a现在就是一个行指针,a+1跳一行数组元素。 搭配(*)p[2]指针
a[0],a[1]现在就是一个列指针。a[0]+1 跳一个数组元素。搭配*p[2]指针数组使用
还有记住脱衣服法则:
a[2] 变成 *(a+2) a[2][3]变成 *(a+2)[3]再可以变成 *(*(a+2)+3)
这个思想很重要!
8. c语言程序设计实验报告
五、 课程设计小结心得体会
1设计思想
1)、设定一个一维数组,可先按员工序号设定每位员工的工资
2)、利用While语句和Prinft语句完成用户菜单的设计
功能为:第1项 设为员工编号和工资数据
第2项 设为修改员工工资数据
第3项 设为查询员工工资数据
第4项 设为结束系统
3)、当用户选择1、2项时,需输入员工编号,所以需要设计编号校正功能,如果出错可输出“The error employe number”
4)、当选择2时,进行工资数据的修改,并将新数据存回该员工的工资数组中
5)、利用for循环中判断语句,将用户工资数与数组中的工资数进行比较,如相同则输出,将计数器加1,如此下去,直到把整个数组遍历一遍
6)、判断计数器是否为0, 是0表示找不到相符的工资,如果不为0,则输出共查出几比相符的工资
以上当然里面也涉及了“函数的模块化”理念,可以避免但需要重复打印头文件时重复编写打印信头的语句。像这样的程序是多见的,这样不但降低了程序还发效率,而且耗时浪费资源“共用体”的使用简化了程序的“复杂”性,正如(4)中,学号与姓名同时表示一个人,但在函数使用了“共用体”,从而程序的简单可以便于纠错,查找问题,避免了代码的重复,这样就给编译时带来了一定的难度与“量”的繁杂。一般不采取这样的做法,力求“简单、明了、清晰”。