资源描述
实验一 顺序程序设计
【实验目的】
1、熟悉C语言数据类型的概念,熟悉如何定义整型、字符型和实型变量
2、掌握C语言中的算术运算符
3、熟悉C语言表达式语句、空语句和复合语句
4、能编写简单的顺序结构的程序
【预习内容】
1、C语言中类型定义的标志符int 、short、unsigned 、char、float 、double……
2、C语言中的运算符所能实现的操作
3、输入输出函数的调用语句getchar()、putchar()、scanf()、printf()
【实验内容及步骤】
1. 上机改错题
#include <stdio.h>
int main()
{ int a, b;
scanf("%d%d", &a, &b);
printf("%d\n", a/b); return 0;}
程序纠错后,若从键盘输入15,4,则程序的运行结果为( 3)。
#include <stdio.h>
int main()
{ float r, s;
scanf("%f",&r);
s=3.14159*r*r;
printf("%f\n", s); //s是float型,%d打印的是整形。数据不一致会出错
return 0;}
程序纠错后,若从键盘输入3.5,则程序的运行结果为( 38.484477)。
2.上机验证题
int main()
{ char c1='b',c2='e';
printf("%d,%c\n",c2-c1,c2-'a'+'A');
return 0;
}
程序运行结果:( )
int main()
{ int x=10, y=3, z;
printf("%d %d\n", x/y, x%y);
return 0;
}
程序运行结果:( )
int main()
{ int sum=5, pad=5;
pad = sum ++, pad ++, ++ pad;
printf("%d\n", pad);
return 0;
}
程序运行结果:( )
int main()
{short int n=65536;
n++;
printf("%d\n",n);
return 0;
}
程序运行结果:( )
3.上机编程题
1、从键盘上任意输入三个整型数据a、b和c,要求将其交换输出a、b和c的值。如从键盘输入a=10,b=20,c=30,程序运行后输出a=20,b=30,c=10。
[程序清单]
#include <stdio.h>
int main()
{
int a,b,c; //定义三个整形变量
int temp;//交换用的临时变量
/*赋值(要严格按照格式输入,在这里,除了%d,其他字符要原样输入,比如a=和,不能缺少。见下面运行结果)*/
scanf("a=%d,b=%d,c=%d", &a, &b, &c);
temp = a;
a = b ;
b = c;
c = temp;
printf("a=%d,b=%d,c=%d\n", a, b, c);
}
[程序运行过程]
第一行是输入。第二行是输出
2、编程从键盘任意输入一个三位数组成的整数,将其个位、十位和百位分离后输出,例输入256,则输出a=2,b=5,c=6。
[程序清单]
#include <stdio.h>
int main()
{
int number; //定义你将要输入的三位数整数的变量
int a,b,c; //定义三个整形变量,接收number分离出来的值
scanf("%d", &number);
c = number%10; //使用取余得到个位
/* 下面这行,假设number现在为256,number除以10本来是得25.6。但是25.6又赋值回给number,由于number是整形的,25.6后面的0.6会被截断。number值为25 */
number = number/10;
b = number%10;//取到十位的数
/*下面这行除10之后number现在就是一个个位数了。这个数就是以前百位上的数。所以在下下面直接赋值就行*/
number = number/10;
a = number;
printf("a=%d,b=%d,c=%d\n", a, b, c);
}
[程序运行结果]
实验二 分支程序设计
一、实验目的
1、掌握C语言表示逻辑量的方法(0表示“假”,1或非0表示“真”)
2、学会正确使用关系运算表达式和逻辑表达式
3、熟练使用if语句、if-else语句和switch语句
二、预习内容
1、熟悉关系表达式和逻辑表达式的表示和使用
2、熟悉if语句、if-else语句和switch语句的格式、作用和用法
三、上机内容
1、找出程序中的错误,并加以简化
#include "stdio.h"
int main( )
{ float max, min, median;//没有定义变量,怎么赋值?
scanf("%f,%f,%f",&max,&min,&median);
if (max==0)
{ min=0;
median=(max-median)/2; }
else
min=max/2;
printf("max=%f,min=%f,median=%f\n", max, min, median); /*这里没错,只是没输出的话怎么看结果是不?*/
return 0;}
修改程序后:
(1) 若从键盘输入0,5,8,则程序的运行结果为( )。
(2)若从键盘输入5,8,11,则程序的运行结果为( )。
#include "stdio.h"
int main( )
{ int a;
scanf("%d", &a);
if (a>0) //if是判断,要有条件
if (a<10 )
printf("a>0 and a<10\n");
else //用来输出除了0到10之间的数外还有后谁。(优化部分)
printf("a>=10\n");
else
printf("a<=0\n");
return 0;}
修改程序后:
(1) 若从键盘输入3,则程序的运行结果为( )。
(2) 若从键盘输入-5,则程序的运行结果为( )。
(3) 若从键盘输入16,则程序的运行结果为( )。
#include "stdio.h"
int main( )
{ int a=1,b=1, c;
/*看不懂这题说的是什么,如果是输出c的值,直接把if (c=(a-b))变成c=(a-b);不就得了。但还是看不出来它想表达什么*/
if (c=(a-b))
printf("c is %d\n", c);
return 0;}
修改程序后,程序的运行结果为( c is 0)。
2、上机验证程序,并分析结果
#include "stdio.h"
int main()
{ int a= 2, b= -1, c= 2;
if ( a<b ) //2<(-1) 显然是错的,所以a<b的值是false;
if ( b<0 ) c=0;//这个if在上面的if体中,上面if不执行。这里肯定也不执行
else c++;//注意else的一一对应关系。是属于哪个if的
printf( “%d\n”, c); /*由于上面的第一个if为false,所以上面的语句都不执行了。直接就到了输出。*/
return 0;}
该程序的运行结果是( )。
#include "stdio.h"
int main()
{ int a;
scanf( “%d”, &a);
if ( a>50 ) printf( “%d\n”, a );/*判断a是否大于50.如果大于50.三句printf都会打印,应为a大于50的话,必定大于40,30嘛 */
if ( a>40 ) printf( “%d\n”, a );//同上面思路
if (a>30 ) printf ( “%d\n”, a );
return 0;}
(1) 若从键盘输入25,则程序的运行结果为( )。
(2) 若从键盘输入35,则程序的运行结果为( )。
下面这些直接赋值粘贴在vc上都可以运行的。我就不写了
(3)若从键盘输入45,则程序的运行结果为( )。
(4)若从键盘输入55,则程序的运行结果为( )。
#include "stdio.h"
int main()
{ int x=10, y=20, t=0;
if ( x==y ) t=x ; x=y ; y=t ;//注意if有无大括号的区别,这里的if范围只到t=x;
printf( “%d %d\n”, x, y );
return 0;}
该程序的运行结果是( )。
#include "stdio.h"
int main()
{ int n ;
scanf( “%d”, &n ) ;
if ( n++<10 ) printf( %d\n”, n ) ;//注意n++与++n的区别,n++是先运算,后执行++.
else printf( “%d\n”, n-- ) ;
return 0;}
(1)若从键盘输入9,则程序的运行结果为( )。
(2)若从键盘输入10,则程序的运行结果为( )。
3、编程题
(1)从键盘任意输入四个int类型的整数,要求将其中的最大数输出。
#include "stdio.h"
int main()
{
int a,b,c,d;
int temp;
scanf("%d%d%d%d", &a,&b,&c,&d);
temp=a;//把第一值赋给temp
if(temp<b) //逐一比较,始终保持temp要最大
temp = b;
if(temp<c)
temp=c;
if(temp<d)
temp=d;
printf("max=%d\n",temp);
return 0;
}
(2)从键盘任意输入四个int类型的整数,要求将它们按从小到大的顺序输出。
#include "stdio.h"
int main()
{
int a,b,c,d;
int temp;//交换时用的临时变量
printf("请输入四个整数(用空格隔开):\n");
scanf("%d%d%d%d", &a,&b,&c,&d);
if(a>b)
{
temp = a;
a = b;
b = temp;
}
if(a>c)
{
temp = a;
a = c;
c = temp;
}
if(a>d)
{
temp = a;
a = d;
d = temp;
}
/*上面的用a逐一与b,c,c比较,交换。保证a最小. 同理,下面用b与c,d比较交换。保证b是 b,c,d中最小的。再往下原理一样*/
if(b>c)
{
temp = b;
b = c;
c = temp;
}
if(b>d)
{
temp = b;
b = d;
d = temp;
}
if(c>d)
{
temp = c;
c = d;
d = temp;
}
printf("从小到大: %d %d %d %d\n", a, b, c, d);
return 0;
}
(3) 给出一百分制成绩,要求输出成绩等级,90分以上为'A',80~89分为'B',70~79分为'C',60~69分为'D',60分以下为'E'。规定使用switch结构。
#include "stdio.h"
int main()
{
int grade;//定义成绩变量
printf("请输入成绩:");
scanf("%d", &grade);
grade = grade/10;//只要十位上的数字
switch(grade)
{
case 9: printf("A\n");break;
case 8: printf("B\n");break;
case 7: printf("C\n");break;
case 6: printf("D\n");break;
default: printf("E\n");break;
}
return 0;
}
实验三 循环程序设计
一、实验目的
1、掌握while语句、do-while语句和for语句实现循环的方法
2、理解循环结构程序段中语句的执行过程
3、进一步掌握循环结构程序的应用
二、预习内容
熟悉以下语句: while语句、do-while语句、for、break、continue语句
三、上机内容
1、阅读以下程序,先预测其结果,再上机运行验证:
①#include "stdio.h"
int main()
{ int x=-1;
do{
x=x*x;
} while(!x);
printf("%d\n", x);
return 0;
}
运行结果是( )
② #include "stdio.h"
int main()
{ int a,s,n,count;
a=2;s=0;n=1;count=1;
while(count<=7)
{ n=n*a; s=s+n; ++count;}
printf("s=%d",s);
return 0;
}
运行结果是 ( )
③#include "stdio.h"
int main()
{ int i=1,s=3;
do{ s+=i++;
if(s%7==0) continue;
else ++i;
}while(s<15);
printf("%d",i);
return 0;
}
运行结果是( )
④ #include "stdio.h"
int main()
{
int num=0;
while(num<=2)
{
num++;
printf("%d\n",num);
}
return 0;
}
运行结果是 ( )
2、编程与程序分析
① 编程求1-3+5-7+9-11+……-99+101的值。 (找规律,1,3,5,7,9...。奇正偶负)
#include "stdio.h"
int main()
{
int sum=0; //总和
int i=1; //过程变量。1,3,5,7,9......
int sign=-1;//符号,用来变换正负
for(i;i<=101;i=i+2)
{
sign = sign*(-1);//奇正偶负
sum = sum+(sign*i);//sign*i是要让i是正还是负
}
printf("总和:%d\n", sum);
return 0;
}
② 从键盘输入一组十进制整数,以9999结束,统计其中正数的个数和其中的正数之和。
(使用while判断你是否输入了9999.如果输入就不再执行循环)
#include "stdio.h"
int main()
{
int count=0;//定义计数器
int sum=0;//正数总和
int number;//要输入的数
printf("请输入一组整数(用空格或回车隔开):\n");
scanf("%d",&number);
while(number!=9999)//如果number不等于9999,就会一直循环
{
if(number>0)
{
count = count+1;//如果number大于0.计数器加1
sum = sum+number;//计算和
}
scanf("%d",&number);
}
printf("正数的个数是:%d个,正数之和为:%d\n", count, sum);
}
③ 分析程序运行结果
#include "stdio.h"
int main()
{ int x=1,y=0,a=0,b=0;
for ( x=1; x<=4; x++ )
{ switch(x)
{ case 1: switch (y)
{ case 0: a++; break;
case 1: b++; break;
}
case 2: a++; b++; break;
case 3: a++; b++;
}
printf("a=%d, b=%d\n", a, b);
}
return 0;
}
3、思考题
(1)若有语句while (!x),则退出循环的条件是 ( x为真)。
(2)若有语句 while (x%2 && y>100 ),则继续循环条件是( x不等于0且y>100),而退出循环的条件是( x等于0或y<=100)。
(3)while (x=0)与while (x==0)两条语句的循环条件有何区别?
While(x=0)相当于while(0),不执行循环。
While(x==0)是x与0比较。若x为0执行循环。否则退出循环
实验四 数组的应用
一、实验目的
1、掌握一维、二维数组的定义、数组元素的引用形式和赋值的方法。
2、掌握一维、二维数组的输入和输出的方法。
3、掌握和一维数组有关的典型算法,如求菲波那契数列、最大(小)数、查找、排序等。
4、掌握字符串的定义以及它和一维字符数组之间的关系和区别。
5、掌握字符串处理函数的功能和应用。
二、预习内容
1、预习一维数组的定义及引用的一般方法。
2、熟悉循环语句和数组处理语句结合的方法。
3、二维数组的定义和二重循环之间的关系。
4、字符串的概念。
三、实验内容
1、分析和记录以下程序运行结果,并上机验证:
(1)#include "stdio.h"
int main()
{
int v[5];
int i;
v[0]=197; v[2]=-100;
v[4]=350; v[1]=v[0]+v[2];
v[3]=--v[4];
for (i=0;i<5;i++)
printf( "v[%d]=%d\n", i, v[i] );
return 0;
}
该程序的运行结果是_____________
(2)#include "stdio.h"
int main()
{ int t, i;
int a[10]={ 1,2,3,4,5,6,7,8,9,10 };
t=a[9];
for ( i=9; i>1; i-=2)
a[i]=a[i-2];
a[1]=t;
for ( i=0; i<10; i++ )
printf( "%3d", a[i] );
return 0;
}
该程序的运行结果是:_____________
(3)#include "stdio.h"
int main()
{ int num[4][4]={11,22,33,44,1,2,3,4,10,20,30,40,12,22,32,42};
int i, j, s=0;
for (j=0; j<3; j++)
for ( i=0; i<3; ++i )
if ( i==j ) s+=num[j][i];
printf( "%d\n", s);
return 0;
}
该程序的运行结果是:___________
(4)#include "stdio.h"
int main()
{int i, j, m, n, a, x[3][4]={43,32,22,13,11,22,33,44,55,11,32,31};
m=n=0; a=x[m][n];
for (i=0;i<3; i++)
for ( j=0; j<4; j++)
if ( a>x[i][j] ) { m=i; n=j; a=x[m][n]; }
printf("a=%d, m=%d n=%d\n", a, m, n );
return 0;
}
2、将程序补充完整,以完成以下功能,并上机调试。
(1)以下程序以每行输出4个数据的格式输出a数组。(中等难度题)
#include "stdio.h"
int main(){ int a[12], i;
for ( i=0; i<12; i++ ) scanf( "%d",&a[i]) ;
for (i=0; i<12; i++ )
{ if (i%4==0)printf("\n");
printf( "%6d", a[i] );
}
printf( "\n" );
return 0;
}
(2)以下程序将数组中的数据按逆序存放。(中等难度题)
#include "stdio.h"
#define SIZE 12 /*SIZE为常量12*/
int main()
{ int a[SIZE], i, j, t;
for ( i=0; i<SIZE; i++ ) scanf( "%d",&a[i]);
i=0; j=SIZE-1;
while ( i<j )
{ t=a[i];a[i]=a[j];a[j]=t; i++; j--;}
for (i=0; i<SIZE; i++) printf( "%4d", a[i] );
printf( "\n");
return 0;
}
(3)以下程序实现将数组a中的元素按从小到大的顺序排列。
#include "stdio.h"
int main()
{ int i, j, temp, a[10];
for (i=0; i<10; i++ ) scanf("%d",&a[i]);
for (i=0;i<10;i++ )
for (j=0;j<i; j++ )
if (a[j]>a[i]){temp=a[j];a[j]=a[i];a[i]=temp;}
for (i=0; i<10; i++) printf( "%d", a[i] );//改为printf( "%4d", a[i] );会好看点
return 0;
}
(4)若有三个字符串s1、s2和s3,其中s1="abcdef",s2="123456",要求用字符数组实现将s1的内容复制到s3中,再将s2的内容添加到s3的后面,最后输出s3。
#include "stdio.h"
int main()
{ char s1[]="abcdef", s2[]="123456",s3[20]="";
int i=0, j=0;
while ( s1[ i ]!='\0')
{ s3[ i ]=s1[ i ]; i++; }
i--;
while ( s2[ j ]!='\0' )
{s3[ i ]=s2[ j ];i++; j++; }
for ( i=0;s3[i]!='\0';i++ ) printf( "%c", s3[ i ] );
return 0;
}
3、编程题:
(1)读入10个整数,求出非负数个数及其和,并将10个整数按从小到大的次序输出。
(可结合前面的小到大排序,和计数)
#include "stdio.h"
int main()
{ int i, j, temp, a[10], count=0,sum=0;
for (i=0; i<10; i++ )
{
scanf("%d",&a[i]);
if(a[i]>=0)
{
count = count+1;//计数
sum = sum+a[i];//计算和
}
}
for (i=0;i<10;i++ )
for (j=0;j<i; j++ )
if (a[j]>a[i]){temp=a[j];a[j]=a[i];a[i]=temp;}
printf("非负数%d个,总和为:%d\n",count, sum);
printf("从小到大排序:\n");
for (i=0; i<10; i++) printf( "%4d", a[i] ); printf("\n");
return 0;
}
(2) 从键盘输入十个整数对一个一维数组赋值,并将其中的奇数存放到另一个数组中后再输出,并输出奇数的个数。
如:从键盘输入: 13 14 17 34 45 55 56 76 77 99
则输出: 13 17 45 55 77 99
count = 6
#include "stdio.h"
int main()
{
int a[10],b[10];//定义两个一维数组
int i;
int j=0;//j是给b数组用的
int count=0;
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<10;i++)//用来遍历a数组
{
if(a[i]%2!=0)//除以2不等于0说明是奇数
{
b[j]=a[i];
j=j+1;/*定位到下一位,不改变j就会一直是b[0]*/
}
}
count = j;//共有j个奇数
for(i=0;i<j;i++)
{
printf("%3d",b[i]);
}
printf("\n");
printf("count=%d\n",count);
return 0;
}
(3) 编程求一个m*n的二维数组中所有元素的最大值,元素可随机产生,m,n任意指定。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define M 4
#define N 4
int main()
{
int arr[M][N];
int i,j;
int temp;//临时比较的变量
srand(time(NULL));//根据系统当前时间设置随机数种子
for(i=0;i<M;i++)//赋值
{
for(j=0;j<N;j++)
{
//rand()%100+1即产生1到100的随机数
arr[i][j]=rand()%100+1;
}
}
temp = arr[0][0];
printf("随机生成的二维数组如下:\n");
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
{
printf("%4d",arr[i][j]);//打印出二维数组
if(temp<arr[i][j])//顺便进行比较,找最大
{
temp = arr[i][j];
}
}
printf("\n");
}
printf("最大值是:%d\n",temp);
}实验五 函数的应用
一、实验目的
1、掌握定义函数的方法;
2、掌握函数实参和形参的对应关系,以及“值传递”的方法;
3、掌握数组名作为实参时,实参和形参之间的传递方法
二、预习内容
函数的概念、定义格式、变量的作用域以及调用过程中数据的传递方法。
三、实验内容
1、分析和记录以下程序运行结果,并上机验证:
#include "stdio.h"
int main()
{ int x=2, y=4;
int swap( int, int );
printf("(1)in main: x=%d, y=%d\n", x, y);
swap(x, y);
printf("(4)in main: x=%d, y=%d\n",x, y);
return 0;}
swap( int a, int b)
{ int t;
printf("(2)in swap: a=%d, b=%d\n",a, b);
t=a; a=b; b=t;
printf("(3)in swap: a=%d, b=%d\n",a, b);
}
运行结果:_______________________________________
2、若将以上程序中的形参a、b对应改为x和y,使其与实参变量同名,记录并分析结果。
结果一样,虽然同名,但却是完全不相关的两个数。
3、预测以下程序结果,并上机验证。
#include "stdio.h"
void fun1( )
{ int x=5;
printf( "x=%d\n", x ); }
void fun2(int x)
{ printf( "x=%d\n", ++x ); }
int main( )
{ int x=2;
fun1( );
fun2( x );
printf( "x=%d\n", x );
return 0;
}
运行结果:_______________
4、分析程序运行结果,并验证程序。
#include "stdio.h"
static int x=20;
void fun1(int x)
{ x+=10;
printf(“%d……fun1()\n”,x);}
fun2( )
{ x+=10;
printf(“%d……fun2()\n”,x);}
int main()
{ int x=10;
fun1(x);
fun2();
printf(“%d……int main()\n”,x);
return 0;}
运行结果:_______________
5、分析程序运行结果,并验证程序。
#include "stdio.h"
int main( )
{ void fun( );
fun( );
return 0;
}
void fun( )
{ static int a=2; /*a为静态变量*/
char k='A';
a*=2; k+=1;
printf("%d, %c\n", a, k); }
运行结果:_______________
6、分析程序运行结果,并验证程序。
#include "stdio.h"
int k;/*k为全局变量*/
int main()
{
void fun();
k=3;
fun();
printf(“%d\n”,k);
return 0;
}
void fun()
{ k=k*k;}
运行结果:_______________
7、编程题:
(1)定义一个能判断任意整数a是否是素数的函数isprime( int a),并利用这一函数,输出100~199之间的所有素数。
#include<stdio.h>
int main()
{
int i;
int isprime(int k);
printf("100到199之间的素数是:\n");
for(i=100;i<=199;i++)
{
if(isprime(i))/*如果是素数就输出*/
{
printf("%4d",i);
}
}
printf("\n");
return 0;
}
int isprime(int a)/*判断是不是素数的函数,是素数返回true*/
{
int i=0;
for(i=2;i<a;i++)
{
if(a%i==0)
{
return 0;
}
}
return 1;
}
(3) 定义一个函数递归函数 long f (int n) 求n!,并利用此函数,求出sum=4!+6!+7!的值。
#include<stdio.h>
int main()
{
long f(int n);
long sum;
sum=f(4)+f(6)+f(7);
printf("4!+6!+7!=%d\n",sum);
}
long f(int n)
{
if(n==1)
{
return 1;
}
else
{
return n*f(n-1);
}
}
实验六 综合
一、实验目的
1、掌握选择,循环,数组,函数,指针的定义和引用;
2、在程序中熟练应用选择,循环,数组,函数,指针的相关知识,编写综合性的程序。
二、预习内容
1、数组,循环,选择,函数,指针的相关知识
三、实验内容
编程题
(下面的三题网上都可找到)
(1) 一辆卡车违反交通规则,撞人逃跑。现场3人目击,但没记住车号,只记下车的特征。甲说:牌照前两位数相同,乙说:牌照后两位数相同。丙是位数学家,他说:四位的车号刚好是一个整数的平方。请求出车号。
#include <stdio.h>
#include <math.h>
int main() {
int i,j,num,res;
for(i = 11; i < 100; i += 11) {/*前两位相同的数*/
for(j = 11; j < 100; j += 11) {/*后两位相同的数*/
num = 100 * i + j; /*组成车牌号*/
res = (int)sqrt(num);/*开平方函数,所以开头要引入math.h*/
if(res * res == num) /*判断是不是一个数的平方*/
printf("%d\n",num);
}
}
return 0;
}
(2) 设有一数列,包含10个数,已按升序排列。现要求编一程序,它能够把从指定位置开始的n个数按逆序重新排列并输出新的完整数列。例如,原数列为1,2,3,4,5,6,7,
8,9,10,若要求把从第4个数开始的5个数按逆序重新排列,则新数列为1,2,3,8,7,6,5,4,9,10。要求分三行显示,第一行是原数列,第二行显示指定位置和n的值,第三行是新数列。
#include <stdio.h>
int main()
{
void f(int b[],int x,int y);
int a[10]={1,2,3,4,5,6,7,8,9,10},b[10];
int m,n,i;
for(i=0;i<10;i++)//把a数组复制一份给b数组
{
b[i]=a[i];
}
printf("指定开始位置:");
scanf("%d",&m);
printf("指定按倒叙输出的个数:");
scanf("%d",&n
展开阅读全文