上机一 C 语言的运行环境和运行过程
上机目的:
1. 掌握c 程序设计编程环境visual c++,掌握运行一个c 程序设计的基本步骤,包括编辑、编译、连接和运行。
2. 掌握c 语言程序设计的基本框架,能够编写简单的c 程序。 3. 了解程序调试的基本思想,能找出并改正c 程序中的语法错误。 上机内容:
一、采用VC 创建C 程序。基本步骤:(要求熟练掌握)
在“我的电脑”上选择一个硬盘分区(如E 盘),新建一个文件夹(可随意命名,如取名为Ctemp ),用于存放c 程序。
1) 启动VC++
“开始”->“程序”->“Microsoft Visual Studio 6.0”->“Microsoft Visual C++6.0”进入VC++编程环境。 2) 新建工作空间, 取名为
P1
3) 新建一个工程, win32控制台程序(win32 console application),在右边选“添加到当前工作空间”,取名为project1。确定后,在对话框中选“一个空的工程 ”
.
4) 新建一个C++源文件(*.cpp)
“文件”->“新建”,单击“文件”选项卡,选择“C++Source Files”,修改“位置”,保存到指定目录和,并取名为“c1”,单击“确定”。
观察左边窗体,在source File 中有一个源程序文件 c1.cpp 。右边窗体中可以输入源程序。
5) 编辑和保存源程序。(注意:源程序一定要在英文状态下输入,即字符标点都要在半角状态下,同时注意大小写,一般都用小写)
可在编辑窗口输入源程序,然后执行“文件”->“保存”或“文件”->“另存为”
6) 查看C 源文件、目标文件和可执行文件的存放位置。
源文件在保存目录下,目标文件和可执行文件在“保存目录\Debug”中
7) 编译(*.obj) 用来检查语法错误
“组建”->“编译”或Ctrl+F7,在产生的工作区对话框中,选择“是”。
观察文件目录中的变化。
8) 连接(*.exe)
“组建”->“组建”或
F7
观察目录中的文件变化
9) 运行
“编译”->“执行”或
Ctrl+F5
二、简单调试
1
2、输入源程序
3、编译程序。观察下方的错误提示。
4、找出里面的错误并修改。 直到错误提示中只有:
思考出现错误的原因。如何改正?
将main()函数改名,改为triangle(),编译程序。可编译通过,为什么?
执行程序,输入底10, 高,5,观察是否可以输出正确结果。 如果不能输出正确结果,如何修改程序?
5、在操作系统中直接执行刚才建立的C 程序文件。
基础知识:
1、一个C 语言程序可由多个源文件组成;
2、C 语言程序由函数组成,一个程序可以有多个函数,但必须有且仅只能有一个main()函数;
3、C 语言程序总是从main()函数开始执行,执行main()函数后结束程序。
以下为上机作业。
一、输入与输出(可不抄题)
输入程序,观察输出结果,并对输出结果做出合理的解释。 1./* e1.cpp */ #include int main() { float x;
double y;
x=213.82631;y=213.82631; printf("%-4.2f,%-6.2e\n",x,y);
return 0;
} 输出结果: 解释:
2)将printf("%-4.2f,%-6.2e\n",x,y);语句改为printf("%-10.2f,% 16.2e\n",x,y);结果有何变
化。 结果:
2. /* e2.cpp */ #include }
3. /* e3.cpp */( 参考课本75-81页 ) #include "stdio.h" int main() {
printf("1) %d\n",336);
printf("2) the octal number of 17 is %o\12",17); printf("3) the hex number of 30 is %x\n",30); printf("4) %f is floating format\xa",13.5);
解释:
int main()
{ float x=5/2,y=5.0/2;
printf("x=%f,y=%f\n",x,y);
return 0;
输出结果: 解释:
printf("5) %c\n",'a');
printf("6) %s\n","a flying bird"); return 0; }
1)本程序的执行结果是:
2)只保留printf("6) %s\n","a flying bird");语句,在字符串"a flying bird"中, 在加入 \t, \r, \b中的任一项,观察输出结果有何变化。为什么?
如:printf("6) %s\n","a flying\t bird"); 或printf("6) %s\n","\t a flying bird");
printf("6) %s\n","a flying\r bird"); 或printf("6) %s\n"," a \rflying bird"); printf("6) %s\n","a flying\b bird"); 或printf("6) %s\n"," a flying bird\b ");
4. 一个投资者拿1000元进行投资, 每年都能获得4%的回报, 30年后, 他最初投入的1000元资产总值变为多少? 公式: 资产= 投资(1+收益)^年限 ;
#include "stdio.h" #include "math.h"
#define Y 30 //宏常量年 #define I 4 //利息
#define C 1000 //投入资金 int main() {
int year=Y;
double interest=I;
double capital=C, assets;
assets = capital*pow( 1+interest /100.0, year);
printf("%5.0lf元投资%d年, 年收益率%.0lf%,30年后资产总额为:%5.2lf",capital,year,interest,assets); return 0;
} i.
ii.
“年收益率%.0lf%,”如何修改以输出%? 修改以上程序,改为在执行时输入变量的值。请写出修改为后程序:
二、编写程序。
1. 定义三个整型变量(假设变量为a,b,c ),分别给这三个变量输入1个整数,然后交换它们中的数,即把a 中原来的值给b ,把b 原来的值给c, 把c 中原来的值给a 。
源程序:
2、编写一个房贷计算器。用于计算等额本息还款方式的月供金额及累计还款金额和利息。
要求:输入贷款金额,贷款年限,银行基准年利率,
输出:月还款金额,累计还款金额,利息,利息与本金之比
注:月利率= 年利率 / 12
上机报告要求
将以上各题的源程序、运行结果写在上机报告上
注:上机报告需手写,打印版成绩为0,请使用专用的实验报告纸,不要使用作业本,上交的上机报告由学院存档,不再返还。
上交时间:下次上机课上课前。
以下内容无需写上机报告。
课后需要掌握的知识:
二进制数的补码表示方法:
假设有一short int 类型的数,值为5, 5转换成二制是101 B,
那么,它在计算机中如何表示呢:
我们知道:short int类型的数占用2字节(16位),所以要在它的有效位前面填上一堆0,补足16位。
写成: 00000000 00000101 写成十六进制就是: 00 05
long int 则是:00000000 00000000 00000000 00000101
十六进制就是:00 00 00 05
-5在计算机中如何表示呢?
在计算机中,负数以其正数的补码形式表达。
什么叫补码呢?这得从原码,反码说起。
原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。其最高位为符号位。 如 00000000 00000101 是十进制数5的原码。最高位是符号位(正数符号位为0) -5的原码: 10000000 00000101 负数符号位为1
反码:正数的反码是其本身。
负数的反码:
符号位不变,将其余二进制数按位取反,所得的新二进制数为原二进制数的反码。 取反操作指:原数为1,取反后得0;原为0,得1。(1变0; 0变1)
如:将 1000 0000 0000 0101 (-5)除了符号位外每一位都取反,
得 1111 1111 1111 1010
称:1111 1111 1111 1010 是 1000 0000 0000 0101 的反码。
反码是相互的,所以也可称:
11111111 11111010 和 10000000 00000101 互为反码。
补码:正数:补码 = 反码 = 原码
负数的补码求法:求出反码,再加1,
补码加法,如果进位到符号位,会连符号位一起加。
也就是说,要得到一个数的补码,先得到反码,然后将反码加上1,所得数称为补码。
比如: 1000 0000 0000 0101 的反码是: 1111 1111 1111 1010。
那么,补码为:
11111111 11111010 + 1(从右相加,逢2进位) = [**************]1
所以,-5 在计算机中表达为:11111111 11111011。
根据补码求原码:求反码后加1
如果查看计算机内存存储的数据,一个数是不是负数,必需根据其数据类型判断,而不能只看其补码
如:1111 1111 1111 1011
转换为十进制数: 65531 十六进制:0x FFFB。
如果是signed long int 型的数据,则是65531 (D )
如果是signed short int 型, 最大正数值为32767,如果是正数,已溢出,应该是负数,计算其值的方法如下 :
原码为: 1111 1111 1111 1011
取反: 1000 0000 0000 0100
再 +1 = 1000 0000 0000 0101 = -5 (D)
再举一例,我们来看整数-1在计算机中如何表示。
int 类型,那么:
1、先取-1的原码: 10000000 00000001
2、求反码: 11111111 11111110
3、求补码: 11111111 11111111
转换为十进制数: 65535 十六进制:0x FFFF。
正数的原码, 补码, 反码都相同, 都等于它本身
从原码来计算负数的反码和补码:
负数的反码: 符号位为1, 其余各位求反
负数的补码: 符号位为1, 其余各位求反, 末位加1
也就是说, 反码末位加上1就是补码
为什么计算机用补码存储数据?
如果用原码: 0 可以表示为: 0000 0000 0000 0000 (+0)
也可以表示为: 1000 0000 0000 0000 (-0)
如果用反码: 0 可以表示为: 0000 0000 0000 0000 (+0)
也可以表示为: 1111 1111 1111 1111 (-0)
如果用补码:+0 表示为 0000 0000 0000 0000
-0 为其反码+1, 1111 1111 1111 1111 +1 (从右相加,逢2进位) = 0000 0000 0000 0000
用原码和反码,0有两种表示方法(+0,-0),计算机无法有效区分,,采用补码,0只有一种表示方法。
比较以下几个数的原码、反码、补码
32767 二进制表示:0111 1111 1111 1111 对应于signed/unsigned short int
原码: 0111 1111 1111 1111
反码: 0111 1111 1111 1111
补码: 0111 1111 1111 1111 (对应十进制数 32767)
-32767 二进制表示:-0111 1111 1111 1111 对应于signed short int
原码: 1111 1111 1111 1111
反码: 1000 0000 0000 0000
补码: 1000 0000 0000 0001 (对应无符号十进制数 32769)
32768 二进制表示:0000 0000 0000 0000 1000 0000 0000 0000 对应于unsigned long int 原码:0000 0000 0000 0000 1000 0000 0000 0000
反码:0000 0000 0000 0000 1000 0000 0000 0000
补码:0000 0000 0000 0000 1000 0000 0000 0000 (对应无符号十进制数 32768) 对于 signed short int 而言,最高位是符号位, 32768已超出其存储范围。
-32768 二进制表示:-1000 0000 0000 0000 对应于signed int
原码:1000 0000 0000 0000 1000 0000 0000 0000
反码:1111 1111 1111 1111 0111 1111 1111 1111
补码:1111 1111 1111 1111 1000 0000 0000 0000 (对应无符号十进制数 4294934528)
-32768 在signed short int中的表示:
对于signed short int 而言, -32766的补码为:1000 0000 0000 0010 (请自行计算)
-32767的补码为:1000 0000 0000 0001
signed short int的最小值应该为: 1000 0000 0000 0000
= -32767 -1 = -32768
以下为特殊规则
补码 1000 0000 0000 0000 在short int 中只能是负数,不可能是正数。
因为short int能表示最大数是32767 (即0111 1111 1111 1111), (最高位是符号位), 超过取值范围。
根据补码求1000 0000 0000 0000这个数的原码:
先求: 反码 : 1111 1111 1111 1111
补码 = 反码+1 = 1000 0000 0000 0000
对应二进制数32768
这个数是负数,所以值是 -32768
注意: 这个数比较特殊,它的符号位与有效数字位是相同的。对于singed char, signed short int, signed long int,它们可表示的最小值都是这种情况。
上机一 C 语言的运行环境和运行过程
上机目的:
1. 掌握c 程序设计编程环境visual c++,掌握运行一个c 程序设计的基本步骤,包括编辑、编译、连接和运行。
2. 掌握c 语言程序设计的基本框架,能够编写简单的c 程序。 3. 了解程序调试的基本思想,能找出并改正c 程序中的语法错误。 上机内容:
一、采用VC 创建C 程序。基本步骤:(要求熟练掌握)
在“我的电脑”上选择一个硬盘分区(如E 盘),新建一个文件夹(可随意命名,如取名为Ctemp ),用于存放c 程序。
1) 启动VC++
“开始”->“程序”->“Microsoft Visual Studio 6.0”->“Microsoft Visual C++6.0”进入VC++编程环境。 2) 新建工作空间, 取名为
P1
3) 新建一个工程, win32控制台程序(win32 console application),在右边选“添加到当前工作空间”,取名为project1。确定后,在对话框中选“一个空的工程 ”
.
4) 新建一个C++源文件(*.cpp)
“文件”->“新建”,单击“文件”选项卡,选择“C++Source Files”,修改“位置”,保存到指定目录和,并取名为“c1”,单击“确定”。
观察左边窗体,在source File 中有一个源程序文件 c1.cpp 。右边窗体中可以输入源程序。
5) 编辑和保存源程序。(注意:源程序一定要在英文状态下输入,即字符标点都要在半角状态下,同时注意大小写,一般都用小写)
可在编辑窗口输入源程序,然后执行“文件”->“保存”或“文件”->“另存为”
6) 查看C 源文件、目标文件和可执行文件的存放位置。
源文件在保存目录下,目标文件和可执行文件在“保存目录\Debug”中
7) 编译(*.obj) 用来检查语法错误
“组建”->“编译”或Ctrl+F7,在产生的工作区对话框中,选择“是”。
观察文件目录中的变化。
8) 连接(*.exe)
“组建”->“组建”或
F7
观察目录中的文件变化
9) 运行
“编译”->“执行”或
Ctrl+F5
二、简单调试
1
2、输入源程序
3、编译程序。观察下方的错误提示。
4、找出里面的错误并修改。 直到错误提示中只有:
思考出现错误的原因。如何改正?
将main()函数改名,改为triangle(),编译程序。可编译通过,为什么?
执行程序,输入底10, 高,5,观察是否可以输出正确结果。 如果不能输出正确结果,如何修改程序?
5、在操作系统中直接执行刚才建立的C 程序文件。
基础知识:
1、一个C 语言程序可由多个源文件组成;
2、C 语言程序由函数组成,一个程序可以有多个函数,但必须有且仅只能有一个main()函数;
3、C 语言程序总是从main()函数开始执行,执行main()函数后结束程序。
以下为上机作业。
一、输入与输出(可不抄题)
输入程序,观察输出结果,并对输出结果做出合理的解释。 1./* e1.cpp */ #include int main() { float x;
double y;
x=213.82631;y=213.82631; printf("%-4.2f,%-6.2e\n",x,y);
return 0;
} 输出结果: 解释:
2)将printf("%-4.2f,%-6.2e\n",x,y);语句改为printf("%-10.2f,% 16.2e\n",x,y);结果有何变
化。 结果:
2. /* e2.cpp */ #include }
3. /* e3.cpp */( 参考课本75-81页 ) #include "stdio.h" int main() {
printf("1) %d\n",336);
printf("2) the octal number of 17 is %o\12",17); printf("3) the hex number of 30 is %x\n",30); printf("4) %f is floating format\xa",13.5);
解释:
int main()
{ float x=5/2,y=5.0/2;
printf("x=%f,y=%f\n",x,y);
return 0;
输出结果: 解释:
printf("5) %c\n",'a');
printf("6) %s\n","a flying bird"); return 0; }
1)本程序的执行结果是:
2)只保留printf("6) %s\n","a flying bird");语句,在字符串"a flying bird"中, 在加入 \t, \r, \b中的任一项,观察输出结果有何变化。为什么?
如:printf("6) %s\n","a flying\t bird"); 或printf("6) %s\n","\t a flying bird");
printf("6) %s\n","a flying\r bird"); 或printf("6) %s\n"," a \rflying bird"); printf("6) %s\n","a flying\b bird"); 或printf("6) %s\n"," a flying bird\b ");
4. 一个投资者拿1000元进行投资, 每年都能获得4%的回报, 30年后, 他最初投入的1000元资产总值变为多少? 公式: 资产= 投资(1+收益)^年限 ;
#include "stdio.h" #include "math.h"
#define Y 30 //宏常量年 #define I 4 //利息
#define C 1000 //投入资金 int main() {
int year=Y;
double interest=I;
double capital=C, assets;
assets = capital*pow( 1+interest /100.0, year);
printf("%5.0lf元投资%d年, 年收益率%.0lf%,30年后资产总额为:%5.2lf",capital,year,interest,assets); return 0;
} i.
ii.
“年收益率%.0lf%,”如何修改以输出%? 修改以上程序,改为在执行时输入变量的值。请写出修改为后程序:
二、编写程序。
1. 定义三个整型变量(假设变量为a,b,c ),分别给这三个变量输入1个整数,然后交换它们中的数,即把a 中原来的值给b ,把b 原来的值给c, 把c 中原来的值给a 。
源程序:
2、编写一个房贷计算器。用于计算等额本息还款方式的月供金额及累计还款金额和利息。
要求:输入贷款金额,贷款年限,银行基准年利率,
输出:月还款金额,累计还款金额,利息,利息与本金之比
注:月利率= 年利率 / 12
上机报告要求
将以上各题的源程序、运行结果写在上机报告上
注:上机报告需手写,打印版成绩为0,请使用专用的实验报告纸,不要使用作业本,上交的上机报告由学院存档,不再返还。
上交时间:下次上机课上课前。
以下内容无需写上机报告。
课后需要掌握的知识:
二进制数的补码表示方法:
假设有一short int 类型的数,值为5, 5转换成二制是101 B,
那么,它在计算机中如何表示呢:
我们知道:short int类型的数占用2字节(16位),所以要在它的有效位前面填上一堆0,补足16位。
写成: 00000000 00000101 写成十六进制就是: 00 05
long int 则是:00000000 00000000 00000000 00000101
十六进制就是:00 00 00 05
-5在计算机中如何表示呢?
在计算机中,负数以其正数的补码形式表达。
什么叫补码呢?这得从原码,反码说起。
原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。其最高位为符号位。 如 00000000 00000101 是十进制数5的原码。最高位是符号位(正数符号位为0) -5的原码: 10000000 00000101 负数符号位为1
反码:正数的反码是其本身。
负数的反码:
符号位不变,将其余二进制数按位取反,所得的新二进制数为原二进制数的反码。 取反操作指:原数为1,取反后得0;原为0,得1。(1变0; 0变1)
如:将 1000 0000 0000 0101 (-5)除了符号位外每一位都取反,
得 1111 1111 1111 1010
称:1111 1111 1111 1010 是 1000 0000 0000 0101 的反码。
反码是相互的,所以也可称:
11111111 11111010 和 10000000 00000101 互为反码。
补码:正数:补码 = 反码 = 原码
负数的补码求法:求出反码,再加1,
补码加法,如果进位到符号位,会连符号位一起加。
也就是说,要得到一个数的补码,先得到反码,然后将反码加上1,所得数称为补码。
比如: 1000 0000 0000 0101 的反码是: 1111 1111 1111 1010。
那么,补码为:
11111111 11111010 + 1(从右相加,逢2进位) = [**************]1
所以,-5 在计算机中表达为:11111111 11111011。
根据补码求原码:求反码后加1
如果查看计算机内存存储的数据,一个数是不是负数,必需根据其数据类型判断,而不能只看其补码
如:1111 1111 1111 1011
转换为十进制数: 65531 十六进制:0x FFFB。
如果是signed long int 型的数据,则是65531 (D )
如果是signed short int 型, 最大正数值为32767,如果是正数,已溢出,应该是负数,计算其值的方法如下 :
原码为: 1111 1111 1111 1011
取反: 1000 0000 0000 0100
再 +1 = 1000 0000 0000 0101 = -5 (D)
再举一例,我们来看整数-1在计算机中如何表示。
int 类型,那么:
1、先取-1的原码: 10000000 00000001
2、求反码: 11111111 11111110
3、求补码: 11111111 11111111
转换为十进制数: 65535 十六进制:0x FFFF。
正数的原码, 补码, 反码都相同, 都等于它本身
从原码来计算负数的反码和补码:
负数的反码: 符号位为1, 其余各位求反
负数的补码: 符号位为1, 其余各位求反, 末位加1
也就是说, 反码末位加上1就是补码
为什么计算机用补码存储数据?
如果用原码: 0 可以表示为: 0000 0000 0000 0000 (+0)
也可以表示为: 1000 0000 0000 0000 (-0)
如果用反码: 0 可以表示为: 0000 0000 0000 0000 (+0)
也可以表示为: 1111 1111 1111 1111 (-0)
如果用补码:+0 表示为 0000 0000 0000 0000
-0 为其反码+1, 1111 1111 1111 1111 +1 (从右相加,逢2进位) = 0000 0000 0000 0000
用原码和反码,0有两种表示方法(+0,-0),计算机无法有效区分,,采用补码,0只有一种表示方法。
比较以下几个数的原码、反码、补码
32767 二进制表示:0111 1111 1111 1111 对应于signed/unsigned short int
原码: 0111 1111 1111 1111
反码: 0111 1111 1111 1111
补码: 0111 1111 1111 1111 (对应十进制数 32767)
-32767 二进制表示:-0111 1111 1111 1111 对应于signed short int
原码: 1111 1111 1111 1111
反码: 1000 0000 0000 0000
补码: 1000 0000 0000 0001 (对应无符号十进制数 32769)
32768 二进制表示:0000 0000 0000 0000 1000 0000 0000 0000 对应于unsigned long int 原码:0000 0000 0000 0000 1000 0000 0000 0000
反码:0000 0000 0000 0000 1000 0000 0000 0000
补码:0000 0000 0000 0000 1000 0000 0000 0000 (对应无符号十进制数 32768) 对于 signed short int 而言,最高位是符号位, 32768已超出其存储范围。
-32768 二进制表示:-1000 0000 0000 0000 对应于signed int
原码:1000 0000 0000 0000 1000 0000 0000 0000
反码:1111 1111 1111 1111 0111 1111 1111 1111
补码:1111 1111 1111 1111 1000 0000 0000 0000 (对应无符号十进制数 4294934528)
-32768 在signed short int中的表示:
对于signed short int 而言, -32766的补码为:1000 0000 0000 0010 (请自行计算)
-32767的补码为:1000 0000 0000 0001
signed short int的最小值应该为: 1000 0000 0000 0000
= -32767 -1 = -32768
以下为特殊规则
补码 1000 0000 0000 0000 在short int 中只能是负数,不可能是正数。
因为short int能表示最大数是32767 (即0111 1111 1111 1111), (最高位是符号位), 超过取值范围。
根据补码求1000 0000 0000 0000这个数的原码:
先求: 反码 : 1111 1111 1111 1111
补码 = 反码+1 = 1000 0000 0000 0000
对应二进制数32768
这个数是负数,所以值是 -32768
注意: 这个数比较特殊,它的符号位与有效数字位是相同的。对于singed char, signed short int, signed long int,它们可表示的最小值都是这种情况。