一、实验目的与要求:
1、熟悉VC++ 6.0的启动流程,会在VC++ 6.0中新建C语言源程序,并能够编制简单的程序;
2、学会简单的C语言程序的调试,包括编译、连接和运行程序。
二、实验内容:
1、VC++ 6.0上机软件的使用;
三、实验器材:
微机+windows操作系统+VC++6.0
四、实验步骤:
1、启动VC++ 6.0软件
单击“开始”->“所有程序”->Microsoft Visual Studio 6.0->Microsoft Visual C++ 6.0
2、新建程序
单击“文件”->“新建”,在弹出的对话框中,选择"文件"选项卡,在其中选择“C++ Source File”,还要输入文件名(以.c结尾),选择保存的目录。
3、输入程序
C语言程序基本框架:
#include<stdio.h>
void main()
{
自己编写代码的区域
}
自己编写程序:
第一步:定义变量
int a,b,c;
double x,y;
第二步:对某些变量进行初始化
第三步:编写主体功能语句(具体问题具体分析)
第四步:输出结果
C语言的输出函数:
printf(参数1,参数2);
参数1:代表输出的格式,它必须由一对双引号括起来
格式符:
%f: 表示输出一个实数,且自动保留6位小数
%d: 表示输出一个十进制整数
参数2:代表输出的常量、变量或表达式
例如1:printf("%d",123); 输出结果:123
printf("%d",0123); 输出结果:83
double x=-2.3;
printf("%f",x); 输出结果:-2.300000
printf("%f",x-1); 输出结果:-3.300000
int a=2,b=3;
printf("%d,%d",a,b); 输出结果:2,3
例:编程求长方形的面积和周长。
第一步:定义变量
int a,b,s,c;
第二步:对某些变量进行初始化(对某些变量赋初值)(一种:直接赋值 ,另一种:通过输入函数来给变量赋值)
a=10;
b=5;
第三步:编写主体功能语句
s=a*b;
c=2*(a+b);
第四步:输出结果(任何程序一定要有输出结果)
printf("%d,%d",s,c);
4、编译(检查语法错误)
将源程序(.c结尾)编译成了目标程序(.obj结尾)
5、连接(生成可执行程序,以.exe结尾)
将目标程序(.obj结尾)连接成可执行程序(.exe)
6、运行,得到结果
五、上机作业
1、编程求圆的面积和周长。
2、编程求圆体的体积和表面积。
六、运行结果
实验二:顺序结构程序设计
一、实验目的与要求:
1、掌握和使用printf和scanf函数实现基本的输入与输出功能;
2、学会编制顺序结构程序,并调试程序。
二、实验内容:
2、编制顺序结构程序。
三、实验器材:
微机+windows操作系统+VC++6.0
四、实验步骤:
1、、printf函数的使用
printf(参数1,参数2);
参数1:代表输出的格式,它必须由一对双引号括起来
格式符:
%f:表示输出一个实数,且自动保留6位小数
%d:表示输出一个十进制整数
参数2:代表输出的常量、变量或表达式
2、scanf——输入函数
格式:
scanf(参数1,参数2);
参数1:由一对双引号括起来的格式符
%d: 以十进制整数形式输入
%f: 以单精度实型输入
%lf: 以双精度实型输入
参数2:变量的地址 (格式:&变量名)
例如:
int a,b,c;
scanf("%d,%d,%d",&a,&b,&c); //从键盘上输入三个整数分别赋给a,b,c
double a,b,c;
scanf("%lf,%lf,%lf",&a,&b,&c); //从键盘上输入三个双精度实数分别赋给a,b,c
例:求长方形的面积和周长。
#include<stdio.h>
void main()
{
int a,b,c,s;
printf("请输入长方形的长和宽(以逗号隔开,输入结束请按回车键):"); //输入之前的提示作用
scanf("%d,%d",&a,&b);
c=2*(a+b);
s=a*b;
printf("长方形的周长为:%d,长方形的面积为:%d\n",c,s);
}
五、上机作业
1、已知:1公里=2里=1000米,请编写一个程序,输入公里数,将其转换成里和米。要求程序的输入输出如下:
请输入公里数: 3.3
3.30公里=6.60里=3300米
#include<stdio.h>
void main()
{
double gli,li,mi;
printf("请输入公里数:");
scanf("%lf",&gli);
li=2*gli;
mi=gli*1000;
printf("%.2f公里=%.2f里=%.0f米\n",gli,li,mi);
}
2、编程题
编写程序实现从键盘上输入两个两位的正整数a和b,并将两个两位的正整数a,b合并成一个正整数放在c中,并输出c。
合并的方式如下:将a这个数的十位和个位分别放在c的千位和十位上,将b这个数的十位和个位分别放在c的个位和百位上,例如:当 a=34,b=56时,c=3645
六、运行结果
实验三:if语句引领的选择结构程序设计
一、实验目的与要求:
1、掌握和使用if…else…双分支结构程序设计;
2、掌握和使用if…else…多分支结构程序设计。
1、if…else…双分支结构语法及多分支结构语法介绍;
2、进行if语句引领的选择结构程序设计。
三、实验器材:
微机+windows操作系统+VC++6.0
四、实验步骤:
1、双分支结构
格式:
if(表达式)
语句1;
else
语句2;
注意:
(1)if之后的表达式可以是任意的表达式,但是,一般来说,是关系表达式或者逻辑表达式。
(2)表达式的值:非0的值当作真,0当作假。
(3)语句可以是一条语句,也可以包含多条语句。若包含多条语句,则必须用一对花括号{}将这些语句扩起来构成复合语句。
2、多分支结构
格式如下:
if(表达式1)
语句1;
else
if(表达式2)
语句2;
else
if(表达式3)
语句3;
else
......
例1:某邮政系统,按照如下要求计费:
邮件重量不超过100克,则按照每克0.2元收取邮费;
邮件重量超过100克,则超过的部分按照每克0.1元收取邮费。
编程实现,从键盘上输入邮件的重量,计算并输出应该收取的邮费。
#include<stdio.h>
void main()
{
double x,y;
printf("请输入邮件重量:");
scanf("%lf",&x);
if(x<=100)
y=x*0.2;
else
y=100*0.2+(x-100)*0.1;
printf("邮费为: %.2f\n",y);
}
例2 :某超市卖苹果,10斤以上(含)每斤0.80元,8斤以上(含)每斤1.00元,6斤以上(含)每斤1.20元,4斤以上(含)每斤1.50元,4斤以下每斤1.80元。
编程完成下列具体要求:
(1)输入顾客购买苹果的重量和所付款数,输出应付款数和应找钱数。
(2)输入要有提示信息,输出要有文字说明。
(3)输出数据结果要保留两位小数。
#include<stdio.h>
void main()
{
double apple,ypay,spay,zhao;
printf("请输入苹果的重量: ");
scanf("%lf",&apple);
if(apple>=10)
ypay=apple*0.8;
else
if(apple>=8)
ypay=apple*1.0;
else
if(apple>=6)
ypay=apple*1.2;
else
if(apple>=4)
ypay=apple*1.5;
else
ypay=apple*1.8;
printf("应付款金额为: %.2f\n",ypay);
printf("输入顾客实际付款金额: ");
scanf("%lf",&spay);
zhao=spay-ypay;
printf("应找零为: %.2f\n",zhao);
}
五、上机作业
1、从键盘上输入三个任意的整数,编程输出最小数。
#include<stdio.h>
void main()
{
}
2、假定征税的办法如下:
(1)收入在800元以下(含800元)的不征税;
(2)收入在800元以上,1200元以下(含1200元),超过800元的部分按5%的税率收税;
(3)收入在1200元以上,2000元以下(含2000元),超过1200元的部分按8%的税率收税;
(4)收入在2000元以上,则超过2000元的部分按20%的税率收税。
试编写按收入计算税费的程序(要求按多分支结构实现)。
#include<stdio.h>
void main()
{
}
六、运行结果
实验四:switch语句引领的选择结构程序设计
一、实验目的与要求:
掌握和使用switch语句实现多分支结构程序设计。
1、switch多分支结构语法介绍;
2、进行switch语句引领的选择结构程序设计。
三、实验器材:
微机+windows操作系统+VC++6.0
四、实验步骤:
switch语句的格式:
switch(表达式)
{
case 常量1: 语句1;
case 常量2: 语句2;
......
case 常量n: 语句n;
default: 语句n+1;
}
注意:
1)switch之后的表达式的值只能是整数或者字符型数据,不能是实数;
2)case之后的常量的值必须与switch之后的表达式的值类型一致;
3)switch结构中可以省略default标号;
4)每个case标号之后的语句可以多条;
5)某些场合,case标号之后的语句可以省略不写;
6)执行了某个case标号之后的语句,若想立即跳出switch结构,则需在该case标号的语句末尾加上一个break语句。
例:假定征税的办法如下:
(1)收入在800元以下的不征税;
(2)收入在800元(含800元)以上,1200元以下,超过800元的部分按5%的税率收税;
(3)收入在1200元(含1200元)以上,2000元以下,超过1200元的部分按8%的税率收税;
(4)收入在2000元(含2000元)以上,则超过2000元的部分按20%的税率收税。
试编写按收入计算税费的程序(要求用switch结构实现多分支结构)。请填空:
#include<stdio.h>
void main()
{
double x;
printf("请输入您的收入:");
scanf("%lf",&x);
switch(__________)
{
case 0:
case 1:printf("税费为: %.2f\n",0);break;
case 2:printf("税费为: %.2f\n",____________);break;
case 3:
case 4:printf("税费为: %.2f\n",____________);break;
default:printf("税费为: %.2f\n",_________________);
}
}
五、上机作业
1、模拟简易计算器程序。从键盘上输入运算数和四则运算符(+、-、*、/),则输出计算结果。
【提示】:若输入:5,+,4, 则输出:5+4=9
输入: 5,-,4, 则输出:5-4=1
输入: 5,*,4, 则输出:5*4=20
输入: 5,/,4, 则输出:5/4=1.250000
#include <stdio.h>
void main()
{
double a,b;
char c;
printf("请输入运算数和运算符(格式如:3,+,5):");
scanf("%lf,%c,%lf",&a,&c,&b);
switch(c){
case '+': printf("%f+%f=%f\n",a,b,a+b);break;
case '-': printf("%f?%f=%f\n",a,b,a-b);break;
case '*': printf("%f×%f=%f\n",a,b,a*b);break;
case '/': printf("%f÷%f=%f\n",a,b,a/b);break;
default: printf("输入有误\n");
}
}
2、从键盘上输入一个四位正整数,输出其逆序数,并判断是否是对称数,如果是输出“YES”,否则输出“NO”。
【提示】:如果输入:4253,先求出其每位上的数字,再重新组成其逆序数:3524,则其不是逆序数,输出“NO”。
如果输入:4224,先求出其每位上的数字,再重新组成其逆序数:4224,则其是逆序数,输出“YES”。
#include <stdio.h>
void main()
{
int n,g,s,b,q,m;
scanf("%d",&n);
q=n/1000; //求出千位数
b=__________; //求出百位数
s=n/10%10; //求出十位数
g=n%10; //求出个位数
m=__________; //组合成逆序数
if(___________) //判断是否是对称数
printf("YES\n");
else
printf("NO\n");
}
六、运行结果
实验五:循环结构程序设计(一)
一、实验目的与要求:
1、掌握while语句、do-while语句和for语句三种编程语法结构;
2、学会使用while语句、do-while语句和for语句三种编程语法结构来实现循环结构程序设计。
二、实验内容:
1、while语句、do-while语句和for语句三种编程语法结构介绍;
2、进行while语句、do-while语句和for语句编制循环结构程序设计。
三、实验器材:
微机+windows操作系统+VC++6.0
四、实验步骤:
三种循环结构的语法结构
1、while语句
格式:
while(表达式)
循环体语句;
2、do-while语句
格式:
do
{循环体语句; ... }
while(表达式);
3、for语句
格式:
for(表达式1;表达式2;表达式3)
循环体语句;
例: 编程求1+2+3+...+n,n由键盘自己输入
分析:累加操作(规律:后一项数据总是比前一项数据多1)
定义变量:(1)n
(2)循环变量:i 代表累加的某一项数据 初始值为1 ,
要使得能够循环下去,只要使i自增1操作 i++;或++i;或i=i+1;或i+=1;
(3)和变量:s 代表结果 初始值为0;
累加操作:s=s+i;
表达式(循环条件): i<=n
循环体语句:s=s+i; i++;
#include<stdio.h>
void main()
{
int n,i,s;
printf("请输入一个正整数(赋给n):");
scanf("%d",&n);
i=1;
s=0;
while(i<=n)
{
s=s+i;
i++;
}
printf("1+2+3+...+%d=%d\n",n,s);
}
五、上机作业
1、编程求1+1/2+1/3+...+1/n,n由键盘自己输入
#include<stdio.h>
void main()
{
int i,n;
double s;
i=1;
s=0;
printf("请输入一个正整数(赋给n):");
scanf("%d",&n);
while(i<=n)
{
________;
i++;
}
printf("1+1/2+1/3+...+1/%d=%f\n",n,s);
}
2、n!(n由键盘自己输入),即求1*2*3*...*n
#include<stdio.h>
void main()
{
int i,n;
double s;
i=1;
s=1;
printf("请输入一个正整数(赋给n):");
scanf("%d",&n);
while(i<=n)
{
________;
i++;
}
printf("%d!=%.0f\n",n,s);
}
六、运行结果
实验六:循环结构程序设计(二)
一、实验目的与要求:
2、掌握双重循环结构程序设计。
二、实验内容:
1、双重循环结构介绍;
2、进行复杂的循环结构程序设计。
三、实验器材:
微机+windows操作系统+VC++6.0
四、实验步骤:
1、循环的跳转语句
(1)break语句
格式:
break;
作用:用于跳出整个循环体
例如:求1+2+3+...+100,直到累加和大于1000为止,输出此时加到第几项?
(2)continue语句
格式:
continue;
作用:用于结束本次循环,直接进入下一次循环
2、循环的嵌套——双重循环——难点
(1) for(......)
for(......)
...;
(2) while(...)
while(...)
...;
(3) for(......)
while(...)
...;
分为外层循环和内层循环:
内层循环结束需要回到外层循环,外层循环的结束才算双重循环结束。
例1:输入一个任意正整数,判断其是否为素数(质数),若是输出“YES”,否则输出“NO”。
提示:
(1)一个数若只能被1和它本身整除,则这个数是素数。
(2)设一个数x,用循环不断使得x除以2到x-1之间的某个数,则能被其间某个数整除,则其不是素数,否则就是素数。
#include<stdio.h>
void main()
{
}
五、上机作业
1、编写程序:输出2到100之间的所有素数(质数)之和。
#include<stdio.h>
void main()
{
}
2、编写程序:输入一行字符(以回车键结束),统计其中大写字母的个数、小写字母的个数、数字字符的个数、空格个数及其他字符的个数。
#include<stdio.h>
void main()
{
}
3、a+aa+aaa+...+aaa..aa,其中a,n由自己输入。
例如:a=2,n=5,则计算:
2+22+222+2222+22222
a=5,n=4 则计算:
5+55+555+5555
规律:将前一项数据乘以10,再加上第一项的值,刚好等于后一项数据
#include<stdio.h>
void main()
{
}
六、运行结果
实验七:函数及调用
一、实验目的与要求:
2、学会编写自定义函数,并能够进行调用。
二、实验内容:
1、自定义函数的语法格式介绍;
2、编写自定义函数,并能够进行调用。
三、实验器材:
微机+windows操作系统+VC++6.0
四、实验步骤:
自定义函数——重点
1、格式:
函数返回值的数据类型 函数名(类型 形参1,类型 形参2,...)
{
函数体语句;
}
注意:
(1)函数名的命名规则与变量是一致的;
(2)形参只能是变量;
(3)一般来说,将问题中的已知量(问题中必须具备的条件)作为形参来处理。
(4)问题经过一系列的处理后,会得到某个具体的值,则称为其有返回值。
若有返回值,则要确定其数据类型;
若有返回值,还要在函数体中添加一条return语句,将该值返回。
return语句的格式:
格式一: return 变量或表达式;
格式二: return(变量或表达式);
(5)有些问题经过一系列的处理后,没有得到某个具体值,只是起到相应的输出信息的作用,则该函数没有返回值,此时函数返回值的类型用void表示。
(6)具体来说,某一自定义函数要不要返回值,需跟主函数的调用语句有关的
(7)若自定义函数缺省了函数返回值的类型,则系统默认为int型.
例如1:写一自定义函数:求两个双精度实数x和y之和。
double sum1(double x,double y)
{
double s;
s=x+y;
return s;
}
例如2:写一自定义函数: 判断某一整数的奇偶性。
void jiou(int x)
{
if(x%2==0)
printf("偶数");
else
printf("奇数");
}
例如3:写一自定义函数:求1+1/(2*2)+1/(3*3)+...+1/(n*n)。
double sum2(int n)
{
double s=0.0;
int i;
for(i=1;i<=n;i++)
s=s+1.0/(i*i);
return s;
}
void sum2(int n)
{
double s=0.0;
int i;
for(i=1;i<=n;i++)
s=s+1.0/(i*i);
printf("%f",s);
}
五、上机作业
1、编写自定义函数,求:s=x+x/(1*2)+x/(1*2*3)+...+x/(1*2*3*...*n) 源程序如下:
#include<stdio.h>
double fun(double x,int n)
{
}
void main()
{
printf("%.4f\n",fun(3.0, 10));
}
实验八:函数及其嵌套、递归调用
1、掌握自定义函数的语法格式和注意事项;
2、学会编写自定义函数,并能够进行函数的嵌套和递归调用。
二、实验内容:
1、自定义函数的语法格式介绍;
2、编写自定义函数,并能够进行函数的嵌套和递归调用。
三、实验器材:
微机+windows操作系统+VC++6.0
四、实验步骤:
函数的调用
自定义函数完成后,一定要在主函数main中调用它,检验它是否正确。
在主函数调用自定义函数,完成三件事:
1、重新定义已知量(最好不要与形参重名),并且输入问题中已知量;
2、调用自定义函数,调用的格式:
格式一: 函数名(实参); //适用于没有返回值的调用
格式二: <变量>=函数名(实参); //适用于有返回值的调用
注意:实参可以是常量、变量或表达式,且实参的个数与数据类型必须与形参保持一致。
(1) 在调用时,系统会给形参分配内存空间,且将实参的值传递给形参,单向传递,形参的值改变不会影响实参。在调用结束后,则形参的内存空间释放。
(2) 任何C程序的执行都是从main函数开始,并在main函数中结束。
(3) 在程序中,自定义函数一般放在主函数之前。
(4) 自定义函数不可以嵌套,但是函数调用可以嵌套
例:写一自定义函数:求x的y次方,其中x为实型变量,y为正整型变量。
#include<stdio.h>
double fun(double x, int y) //自定义函数
{
int i;
double s=1;
for(i=1;i<=y;i++)
s=s*x;
return s;
}
void main()
{ double a,t;
int b;
scanf("%lf,%d",&a,&b);
t=fun(a,b); //调用自定义函数
printf("%lf\n",t);
}
五、上机作业
1、编写自定义函数,求:1-1/2+1/3-1/4+...+1/(2*n-1)-1/(2*n) 源程序如下:
#include<stdio.h>
double fun(int n)
{
}
void main()
{
printf("%.2f\n",fun(50));
}
验证结果:0.69
2、编写自定义函数,求:s=x+x/(1+2)+x/(1+2+3)+...+x/(1+2+3+...+n) 源程序如下:
#include<stdio.h>
double fun(double x,int n)
{
}
void main()
{
printf("%.4f\n",fun(3.0, 10));
}
验证结果:5.4545
实验九:宏的应用上机实践
一、实验目的与要求:
1、掌握编译预处理命令语法格式。
2、学会使用不带参数的宏定义和带参数的宏定义解决实际问题。
二、实验内容:
结合实例,验证不带参数的宏定义和带参数的宏定义。
三、实验器材:
微机+windows操作系统+VC++6.0
四、实验步骤:
1、宏定义
(1)不带参数的宏定义:
#define 宏名 替换文本
例如:
#define PI 3.14
#define M 5
(2)带参数的宏定义:
#define 宏名(形参表) 替换文本
例如:
#define MU(X,Y) (X)*(Y)
...
a=MU(5,2);
注意:先替换,最后再一次性计算。
1、以下程序输出结果____55____
#include<stdio.h>
#define M 5
#define N M+M
void main()
{
int k;
k=N*N*5;
printf("%d\n" , k);
}
2、以下程序输出结果___________
#include<stdio.h>
#define N 2
#define M N+1
#define NUM (M+1)*M/2
void main()
{
int i;
for(i=1;i<=NUM;i++)
printf("%d\n" , i);
}
3、以下程序输出结果____28____
#include<stdio.h>
#define S(a , b) a*b/2
void main()
{
printf("%d\n" , S(7+5, 4+2));
}
4、以下程序输出结果____9_______
#include<stdio.h>
#define SQR(x) x*x
void main()
{
int a, k=3;
a=++SQR(k+1);
printf("%d\n" , a);
}
5、以下程序输出结果_____12_________
#include<stdio.h>
#define SUB(X,Y) (X)*Y
void main()
{
int a=3,b=4;
printf("%d\n",SUB(a++,b++));
}
实验十:一维和二维数组的应用举例分析
1、掌握一维数组和二维数组的定义、引用和初始化等;
2、学会使用数组进行程序设计。
二、实验内容:
1、一维数组和二维数组的定义、引用和初始化、输入与输出介绍;
2、使用数组解决实际问题。
三、实验器材:
微机+windows操作系统+VC++6.0
四、实验步骤:
1、从键盘上输入10个任意的整数存放于一维数组a中,编程求出数组a中元素的最大值及对应的下标,最小值及对应的下标。请填空:
#include<stdio.h>
void main()
{
int a[10],i,max,maxi,min,mini;
printf("请输入10个任意的整数:");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
max=a[0];maxi=0;min=a[0];mini=0;
for(i=1;________;i++)
{
if(a[i]>max) //求最大值及对应的下标
{
max=a[i];
maxi=i;
}
if(________) //求最小值及对应的下标
{
min=a[i];
mini=i;
}
}
printf("最大值: %d,最大值下标: %d,最小值: %d,最小值下标: %d\n",max,maxi,min,mini);
}
2、从键盘上输入10个任意的整数存放于一维数组a中,编程将数组a中的所有元素按从小到大的顺序排好,并输出。
提示:冒泡排序
原始数据: 10 9 8 7 6 5 4 3 2 1 (从小到大排序)
3、输入一4行4列的二维数组,将该二维数组的下三角元素乘以x(x由自己键盘输入),并输出该二维数组。请填空:
例如:原二维输入如下:
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
输入x=2,则输出为:
2 1 1 1
4 4 2 2
6 6 6 3
8 8 8 8
#include<stdio.h>
void main()
{
int a[4][4],i,j,x;
for(i=0;i<4;i++) //输入二维数组的内容
for(j=0;j<4;j++)
scanf("%d",&a[i][j]);
scanf("%d",&x); //输入x的值
for(i=0;i<4;i++) //使得该二维数组的下三角元素乘以x
for(j=0;__________;j++)
_____________________;
for(i=0;i<4;i++) //输出该二维数组的内容
{
for(j=0;j<4;j++)
printf("%d ",a[i][j]);
printf("\n");
}
}
实验十一:字符串及其应用上机实践操作
一、实验目的与要求:
1、掌握字符型数组的定义、引用和初始化操作;
2、学会使用字符串处理函数解决实际问题。
二、实验内容:
1、字符型数组的定义、引用和初始化介绍;
2、使用字符串处理函数解决实际问题。
三、实验器材:
微机+windows操作系统+VC++6.0
四、实验步骤:
例1 :字符串加密操作(填空题)
从键盘上输入一批字符(以@结束输入),按下列要求加密并输出。
加密规则:
(1)所有字母均转换为小写;
(2)若是字母'a'到'y',则转化为下一个字母;
(3)若是'z',则转化为'a';
(4)其他字符,保持不变。
#include<stdio.h>
void main()
{ char ch;
while((ch=getchar())!='@')
{
if(ch>='a' && ch<='y')
ch=___________;
else if(ch>='A' && ch<='Y')
ch=___________;
else if(ch=='Z' || ch=='z')
ch=___________;
putchar(ch);
}
putchar("\n");
}
例2 :编写程序,将字符串s中的所有*号删除。
#include<stdio.h>
void main()
{
char s[80];
int i,j;
gets(s);
j=0;
for(i=0;s[i]!='\0';i++)
if(s[i]!='*')
{
s[j]=s[i];
j++;
}
s[j]='\0';
puts(s);
}
例3:从键盘上输入两个字符串,将两个字符串首尾相连接后,再输出新的字符串。
例如:输入两个字符串为:
Hello
China
则输出新字符串为:HelloChina
#include<stdio.h>
void main()
{
char a[50],b[50],c[100];
int i,j,k;
printf("请输入两个字符串:\n");
gets(a);gets(b);
k=0; //控制c数组的下标
for(i=0;a[i]!='\0';i++)
{ c[k]=a[i];
k++; }
for(j=0;b[j]!='\0';j++)
{ c[k]=b[j];
k++; }
c[k]='\0'; //将'\0'作为C字符串的结束标志
puts(c);
}
实验十二:指针操作数组应用上机
一、实验目的与要求:
1、掌握指针的定义,指针变量的引用;
2、掌握使用指针操作一维数组的元素;
3、学会使用指针操作一维数组解决实际问题。
二、实验内容:
1、指针变量的定义和引用介绍;
2、使用指针操作一维数组的元素;
3、使用指针操作一维数组解决实际问题。
三、实验器材:
微机+windows操作系统+VC++6.0
四、实验步骤:
指针变量:该变量存放的是某个内容变量的地址。
指针变量的定义格式:
类型名 *指针变量名 , .......;
例如:
int p; //p是内容变量,且p中的内容(值)的数据类型是int型。
int *p; //p是指针变量,p中存放的是某个内容变量的地址(地址没有数据类型可言),且该内容变量的数据类型是int型
注意:不要理解为p中存放的地址是int型。
注意:
(1)定义了一个指针变量,则必须让该指针变量有一个指向(必须给它赋初值)
int i=10,*p=&i;
等价于:
int i=10;
int *p;
p=&i;
(2)将某个内容变量的地址赋给一个指针变量,则相当于这个指针变量指向了该内容变量。
用指针操作一维数组——重点
1、一维数组的名字(常量)就是地址,是第0个元素的地址(首地址).
int a[10]={1,2,3,4,5,6,7,8,9,0};
int *p;
p=a; //让p指向a[0]元素
p=a+1; //让p指向a[1]元素
p=a+9; //让p指向a[9]元素
p++;
a++; 或 a--; //错误,因为a是数组名,是个常量,常量不能++、--
问:p++ 或者 ++p :让p指针指向下一个元素
*p++ 或者 *(p++) :p先与++结合,即p指针先指向下一个元素,然后再与*结合,取p指针所指向的空间内容
(*p)++ :先取p指针所指向的空间内容作为该表达式的值,然后使得p指针所指向的空间的内容自增1。
++(*p) :先使得p指针所指向的空间的内容自增1,然后取p指针所指向的空间内容作为该表达式的值。
int a[10];
int *p;
p=a; //让p指向a[0]元素
表示一维数组中第0个元素地址: a、 p、 &a[0]
表示一维数组中地0个元素内容: *a、 *p、 a[0]
结论:
表示一维数组中第i个元素地址: a+i、 p+i、 &a[i]
表示一维数组中第i个元素内容:*(a+i)、*(p+i)、 a[i] 、p[i]
例如 :编程求一维数组各元素之和。(请填空)
(1)使用数组方法实现
#include<stdio.h>
void main()
{ int a[5]={5,6,7,8,9},sum=0,i;
for(i=0;i<5;i++)
____sum = sum +a[i]_______;
printf("%d\n",sum);
}
(2)使用指针方法实现(指针的指向不变)
#include<stdio.h>
void main()
{int a[5]={5,6,7,8,9},sum=0,i;
int *p=a;
for(i=0;i<5;i++)
___sum = sum +p[i]___;
printf("%d\n",sum);
}
(3)使用指针方法实现(指针的指向改变)
#include<stdio.h>
void main()
{
int a[5]={5,6,7,8,9},sum=0,i;
int *p=a;
for(i=0;i<5;i++)
__sum = sum + *p++___;
printf("%d\n",sum);
}
实验十三:指针操作字符串应用上机
一、实验目的与要求:
1、掌握指针的定义,指针变量的引用;
2、掌握使用指针操作字符串;
3、学会使用指针操作字符串解决实际问题。
二、实验内容:
1、指针变量的定义和引用介绍;
2、使用指针操作字符串;
3、使用指针操作字符串解决实际问题。
三、实验器材:
微机+windows操作系统+VC++6.0
四、实验步骤:
字符串与指针
1、用数组存储字符串
char a[]="china";
printf("%s",a);
puts(a);
2、用指针表示字符串
char *a="china"; //a为指针变量,并让a指向该字符串的首地址
printf("%s",a);
puts(a);
上机作业:
1、编程求一个字符串的长度.(要求:用指针方法实现,且不能使用strlen函数)
#include<stdio.h>
void main()
{
}
2、 编程实现两个字符串的连接.(要求:用指针方法实现,且不能使用strcat函数)
#include<stdio.h>
void main()
{
}
实验十四:结构体操作学生信息上机实践
一、实验目的与要求:
1、掌握结构体类型的定义和结构体变量的定义和引用;
2、学会使用结构体解决实际问题。
二、实验内容:
1、结构体类型的定义和结构体变量的定义和引用介绍;
2、使用结构体解决实际问题。
三、实验器材:
微机+windows操作系统+VC++6.0
四、实验步骤:
例1:程序通过定义并赋初值的方式,利用结构体变量存储了一名学生的信息。函数fun的功能是输出这位学生的信息。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 给定源程序:
#include <stdio.h>
typedef struct
{ int num;
char name[9];
char sex;
struct { int year,month,day ;} birthday;
float score[3];
}STU;
/**********found**********/
void show(STU ___1___)
{ int i;
printf("\n%d %s %c %d-%d-%d", tt.num, tt.name, tt.sex, tt.birthday.year, tt.birthday.month, tt.birthday.day);
for(i=0; i<3; i++)
/**********found**********/
printf("%5.1f", ___2___);
printf("\n");
}
main( )
{ STU std={1,"Zhanghua",'M',1961,10,8,76.5,78.0,82.0 };
printf("\nA student data:\n");
/**********found**********/
show(___3___);
}
解题思路:
本题是利用结构体变量存储了一名学生的信息。
第一处:tt变量在函数体fun已经使用,所以应填:tt。
第二处:利用循环分别输出学生的成绩数据,所以应填:tt.score[i]。
第三处:函数的调用,所以应填:std。
例2:学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中, 请编写函数fun,它的功能是:把分数最低的学生数据放在b所指的数组中,注意:分数最低的学生可能不止一个,函数返回分数最低的学生的人数。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
给定源程序:
#include <stdio.h>
#define N 16
typedef struct
{ char num[10];
int s;
} STREC;
int fun( STREC *a, STREC *b )
{ }
main()
{ STREC s[N]={{"GA05",85},{"GA03",76},{"GA02",69},{"GA04",85},{"GA01",91},{"GA07",72},{"GA08",64},{"GA06",87},{"GA015",85},{"GA013",91},{"GA012",64},{"GA014",91},{"GA011",91},{"GA017",64}, {"GA018",64}, {"GA016",72}};
STREC h[N];
int i,n;FILE *out ;
n=fun( s,h );
printf("The %d lowest score :\n",n);
for(i=0;i<n; i++)
printf("%s %4d\n",h[i].num,h[i].s);
printf("\n");
out = fopen("c:\\test\\out.dat","w") ;
fprintf(out, "%d\n",n);
for(i=0;i<n; i++)
fprintf(out, "%4d\n",h[i].s);
fclose(out);
}
解题思路:
本题是把符合条件的学生记录存入到另一个结构体,人数通过函数返回,记录由实参b返回。
1. 符合条件的学生人数存在变量j(初始值为0)中,最后返回其值。
2. 利用for循环语句,依次判断是否符合条件,如果成绩相等,则把记录存入b中,人数j 加1;如果当前成绩a[i].s小于最低成绩min,那么人数重新初始化为0,把当前成绩存入最低成绩中,人数j加1。
3. 直至循环结束为止。
参考答案:
int fun( STREC *a, STREC *b )
{ int i, j = 0, min=a[0].s ;
for(i = 0 ; i < N; i++)
{ if(min > a[i].s)
{ j = 0 ; b[j++] = a[i] ; min = a[i].s ; }
else if(min == a[i].s)
b[j++] = a[i] ;
}
return j ;
}
实验十五:单链表的基本操作上机实践
一、实验目的与要求:
1、掌握单链表的建立、插入元素、删除表中某元素的算法。
2、学会使用单链表解决实际问题。
二、实验内容:
建立一个带头结点的单链表,然后对该单链表进行插入删除结点操作,输出各种操作的结果
三、实验器材:
微机+windows操作系统+VC++6.0
四、实验步骤:
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{char data;
struct node *next;
}LINKLIST;
/*以下程序段的功能为尾插入法建立单链表*/
void creat(LINKLIST *head)
{
LINKLIST *t,*p;
char ch;
p=head;
printf("请从键盘上输入一串字符,以字符$作为输入的结束符号:");
while((ch=getchar())!='$')
{
t=(LINKLIST *)malloc(sizeof(LINKLIST));
t->data=ch;
t->next=p->next;
p->next=t;
p=p->next;
}
}
/*以下程序段的功能为输出单链表的各结点的值*/
void print(LINKLIST *head)
{
LINKLIST *p;
p=head->next;
printf("head");
while(p!=NULL)
{printf("-->%c",p->data);
p=p->next;
}
printf("\n");
}
/*以下程序段的功能为在单链表中插入一个元素*/
void insert(LINKLIST *head,int x)
{
LINKLIST *p,*t;
char ch;
int i=0;
printf("请输入要输入的结点的值:");
scanf("%c",&ch);
p=head;
while(p->next!=NULL&&i<x)
{i++;
p=p->next;
}
t=(LINKLIST *)malloc(sizeof(LINKLIST));
t->data=ch;
t->next=p->next;
p->next=t;
}
/*以下程序段的功能为在单链表中删除一个元素*/
void deletenode(LINKLIST *head,int i)
{
LINKLIST *p,*s;
p=head;
int j=0;
while(p->next!=NULL&&j<i-1)
{j++;
p=p->next;
}
s=p->next;
p->next=s->next;
free(s);
}
/*主函数*/
void main()
{
LINKLIST *head;
int i;
head=(LINKLIST *)malloc(sizeof(LINKLIST));
head->next=NULL;
creat(head);
printf("建立的单链表为:");
print(head);
printf("请输入要插入结点的位置(0-n):");
scanf("%d",&i);
getchar();
insert(head,i-1);
printf("插入元素后的单链表为:");
print(head);
printf("请输入要删除的结点 (0-n):");
scanf("%d",&i);
deletenode(head,i);
print(head);
}
五、实验结果
实验十六:文件的操作上机实践
一、实验目的与要求:
1、掌握文件指针的定义和引用。
2、掌握文件常用操作函数(fopen函数、fclose函数、fputc函数和fgetc函数、fputs函数和fgets函数、fwrite函数和fread函数、fprintf函数和fscanf函数、判断文件结束函数feof、fseek函数、ftell函数等)的使用;
3、学会使用文件操作函数解决实际问题。
二、实验内容:
结合实例,使用文件常用操作函数进行实际问题的解决。
三、实验器材:
微机+windows操作系统+VC++6.0
四、实验步骤:
文件指针:文件指针实际上指向一个结构体类型的指针
定义文件指针的格式:
FILE *指针变量名;
例如:FILE *fp; //fp指向一个文件
文件操作函数
1、文件打开与关闭的函数
文件打开格式:
文件指针名=fopen(文件名,打开方式);
例如:
FILE *fp;
fp=fopen("a.dat","rb");
打开方式:
"r":只读方式打开文本文件
"rb":只读方式打开二进制文件
"w":为写方式打开文本文件
"wb":为写方式打开二进制文件
"a":为在文件后面添加数据而打开文本文件
"ab":为在文件后面添加数据而打开二进制文件
"r+":为读和写打开文本文件
"rb+":为读和写打开二进制文件
读:从文件中取数据出来送到程序中来执行
写:把程序中的数据送到文件中保存
关闭文件格式:
fclose(文件指针);
例如:fclose(fp);
2、文件读写函数
(1)fputc函数和fgetc函数——读写一个字符
格式:
fputc(ch,fp);
作用:将字符ch写到文件指针fp所指的文件中
ch=fgetc(fp);
作用:从文件指针fp所指的文件中读入一个字符,赋值给ch
(2)fputs函数和fgets函数——读写一个字符串
格式:
fputs(str,fp);
作用:将str(可以字符数组名或字符指针名)指定的字符串(不包括'\0')写到文件指针fp所指的文件中
fgets(str,n,fp);
作用:从fp所指的文件中读入n-1个字符存放到str(可以字符数组名或字符指针名)中。读入结束后,系统自动在字符串末尾加上'\0'
(3)fwrite函数和fread函数——读写二进制文件
fread(buffer,size,count,fp);
作用:从fp所指向的文件读取count个size个字节的数据送到buffer所指地址中去
fwrite(buffer,size,count,fp);
(4)fprintf函数和fscanf函数——读写任意类型 (整型、实型或字符型)的文本文件
fprintf(文件指针,格式控制字符串,输出列表);
作用:将输出列表按照指定的格式写到文件指针所指定的文件中
例如:fprintf(fp,"%x,%o",23,45);
fscanf(文件指针,格式控制字符串,输入列表);
例如:fscanf(fp,"%d%d",&x,&y);
3、判断文件结束函数feof
格式:
feof(fp)
若遇到文件结束,则feof(fp)函数的返回值为1,否则为0
while(!feof(fp))
{
.....
}
4、文件指针的定位函数
(1)fseek函数——移动文件指针到指定位置上
格式:
fseek(fp,offset,origin);
fp:文件指针,offset:位移量,origin:起始点(SEEK_SET、SEEK_END、SEEK_CUR)
例如:
fseek(fp,-30L,SEEK_END);
(2)ftell函数——获取当前文件指针的位置
格式:
long t;
t=ftell(fp);
(3)rewind函数——使得文件指针回到文件开头
格式:
rewind(fp);
上机任务:
1、给定程序中,函数fun的功能是将形参给定的字符串、整数、浮点数写到文本文件中,再用字符方式从此文本文件中逐个读入并显示在终端屏幕上。
请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
给定源程序:
#include <stdio.h>
void fun(char *s, int a, double f)
{/**********found**********/
__1__ fp;
char ch;
fp = fopen("file1.txt", "w");
fprintf(fp, "%s %d %f\n", s, a, f);
fclose(fp);
fp = fopen("file1.txt", "r");
printf("\nThe result :\n\n");
ch = fgetc(fp);
/**********found**********/
while (!feof(__2__))
{ /**********found**********/
putchar(__3__); ch = fgetc(fp);
}
putchar('\n');
fclose(fp);
}
main()
{ char a[10]="Hello!"; int b=12345;
double c= 98.76;
fun(a,b,c);
}
解题思路:
本题是考察先把给定的数据写入到文本文件中,再从该文件读出并显示在屏幕上。
第一处:定义文本文件类型变量,所以应填:FILE *。
第二处:判断文件是否结束,所以应填:fp。
第三处:显示读出的字符,所以应填:ch。
2、给定程序中,函数fun的功能是:将自然数1~10以及它们的平方根写到名为myfile3.txt的文本文件中,然后再顺序读出显示在屏幕上。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
给定源程序:
#include <math.h>
#include <stdio.h>
int fun(char *fname )
{ FILE *fp; int i,n; float x;
if((fp=fopen(fname, "w"))==NULL) return 0;
for(i=1;i<=10;i++)
/**********found**********/
fprintf(___1___,"%d %f\n",i,sqrt((double)i));
printf("\nSucceed!!\n");
/**********found**********/
___2___;
printf("\nThe data in file :\n");
/**********found**********/
if((fp=fopen(___3___,"r"))==NULL)
return 0;
fscanf(fp,"%d%f",&n,&x);
while(!feof(fp))
{ printf("%d %f\n",n,x);
fscanf(fp,"%d%f",&n,&x);
}
fclose(fp);
return 1;
}
main()
{ char fname[]="myfile3.txt";
fun(fname);
}
解题思路:
本题要求所求出的数写入到指定的文件中保存。程序中共有三处要填上适当的内容,使程序能运行出正确的结果。
第一处:int fprintf(FILE *stream, const char *format [,argument, …]); 因此本处只能填写文件流的变量fp。
第二处:由于文件打开写操作,所以必须要关闭,因此,只能填写关闭文件的函数fclose(fp)。
第三处:由于本题要把刚写入文件中的数据重新显示出来,读方式已经给出,但没有给出文件名,所以本处只能写文件名变量fname或者直接给出文件名"myfile3.dat"。