文档视界 最新最全的文档下载
当前位置:文档视界 › 2010C语言实验报告书[da][1][1]

2010C语言实验报告书[da][1][1]



《C及C++语言程序设计》
实验报告书


姓 名 ______________________
班 级 ______________________
学 号 ______________________
实验时间 _________学年第___学期



扬州大学计算机中心

目 录

实验一 程序的建立、调试执行的方法与步骤…………………………………1
实验二 程序控制…………………………………………………………………5
实验三 函数的定义、调用和声明………………………………………………9
实验四 数组及其应用……………………………………………………………13
实验五 字符串处理………………………………………………………………17
实验六 函数的应用………………………………………………………………21
实验七 链表………………………………………………………………………25
实验八 算法设计与简单分析……………………………………………………27








实验名称: 程序的建立、调试执行的方法与步骤
实验时间: 年 月 日 第 周 星期
实验属性:实践性
一、 实验目的
1. 理解典型的C程序开发环境的要素;
2. 学会使用WIN-TC集成环境编辑、编译、连接和运行C语言的源程序;
3. 掌握程序编辑的基本方法,了解编译、连接的原理以及运行程序的方法;
4. 通过运行简单的C程序,初步了解C程序的特点;
5. 学习使用scanf和printf这两个常用的I/O函数。
二、 实验预备工作
1. 复习第1章程序设计基础和第2章C语言入门,掌握C语言源程序的基本构成;
2. 了解C语言程序的编辑、编译、运行过程;
3. 预习第11章 C语言上机引导,了解Win-TC集成开发环境的组成。
三、 实验内容
1.填空题
(1) (1) 下列程序运行的结果为_________0_______________。
#include
main()
{ int a=9;
float x=6.3, y=3.5;
printf(“%d\n”, a%5*(int)(x+y)%7/4);
getch();
}

(2) 以下是一个完整的C程序,其功能为 求a、b的和____。
#include
void main()
{ int a,b,c;
printf(“enter first integer : ”);
scanf(“%d”,&a);
printf(“enter second integer : ”);
scanf(“%d”,&b);
c=a+b;
printf(“\n a+b=%d\n”,c);
}

2.改错题
(1) [题目] 下列程序将助你熟悉由编译器产生的错误信息。请尝试改正其中的错误,直到程序经编译后没有错误信息,最后得到正确的输出结果:Some output:1,2,3
[程序]
#include
void main()
{
int a=1;b=1,c=1,
prinf(“Some output: %d,%d,%d\n”a,b,c)

修改后的源程序为:
#iinclude
void main()
{ int a=1,b=2,c=3;
printf(“Some output: %d,%d,%d\n”,a,b,c);

}

(2) [题目] 下列程序将助你熟悉由编译器产生的错误信息。请尝试改正其中的错误。
[程序]
#include
void main()
{
integer I;
long j;
prinf(“Enter an integer:);
scanf(“%d”,&i);
j=I*I;
printf(“I=%d j=%d\n,j);
}

修改后的源程序为:
void main()
{
int i;
long j;
prinf(“Enter an integer:);
scanf(“%d”,&i);
j=i*i;
printf(“i=%d j=%d\n”,i,j);
}








3.通过调试程序回答问题
(1) [题目]用一个main函数实现:从键盘上输入三个正整数,求最大值。请完善程序。
[源程序清单]
main()
{
int a ,b ,c ,d ,max;
printf(“Enter three integers:”);
___scanf__________(“%d%d%d”,&a,&b,&c);
if(a>b) max=_____a__________;
else max=______b_________;
if(___c>max____________) max=c;
_____printf__________(“max of the three numbers is %d”,max);
}
[测试数据及结果]



(2) [题目] 编写main函数,其功能是实现从键盘上输入两个变量a、b,交换它们的值并输出。
[源程序清单]
main()
{ int a, b, c ;
scanf(“%d%d”,&a,&b);
c=a; a=b; b=c;
printf(“a=%d\tb=%d\n”,a,b);
}


[测试数据及结果]





(3) [题目]编写一个main函数实现:输入变量a、b的值,并将b的值加入到a中,输出a
[源程序清单]

main()
{ int a, b;
scanf(“%d%d”,&a,&b);
a+=b;
printf(“a=%d\n”,a);
}


[测试数据及结果]


四、实验总结

实验名称: 程 序 控 制
实验时间: 年 月 日 第 周 星期
实验属性:实践性
一、 实验目的
1. 掌握顺序结构、分支结构和循环结构的编程方法;
2. 进一步学会正确使用逻辑运算符和逻辑表达式;
3. 掌握break语句和continue语句的功能及应用;
4. 熟练掌握级数的近似计算、阶乘的计算、素数的判断;
5. 熟练掌握利用枚举法来找出符合条件的数或验证定理与猜想;
6. 熟练掌握二重循环的应用。
二、 实验预备工作
1. 复习if语句、switch语句的用法;
2. 复习for语句、while语句、do-while语句的用法;
3. 复习break语句和continue语句的功能。
三、 实验内容
1、 填空题
2、 (1) 下列程序的功能是___判断x是否为素数,是就输出TRUE,否则输出FALSE___。
#include
main()
{ int x , k ,i ;
scanf(“%d”,&x);
for(i=2; i<=(k=sqrt(x)); i++)
if(x%i==0) break;
if(i>k) printf(“TRUE”);
else printf(“FALSE”);
}
3、 (2) 下列程序的运行结果是________ a=2,b=1____________________。
#include
main()
{
int x=1, y=0,a=0,b=0;
switch(x)
{ case 1: switch(y)
{ case 0:

a++; break;
case 1: b++; break;
}
case 2: a++, b++; break;
}
printf(“a=%d, b=%d\n”, a, b);
}
(3)下面程序的功能是计算100到1000之间有多少个数其各位数字之和是5。
main()
{ int i, s, k, count=0;
for( i=100; i<=1000; i++)
{
s=0; k=i;
while ( k )
{
s = s+k%10;
k =___k/10________; }
if( s!=5 ) __continue_________;
count++;
}
printf( “%d\n”, count);
}
4、 改错题
[题目] 求满足下列条件的三位数n,它除以11(整数相除)所得到的商等于n的各位数字的平方和,且其中至少有二位数字相同的数。如:131,它除以11的商为11,各位数字的平方和为11,又如550,也是满足条件的三位数。
[含有错误的源程序]
main()
{ int n , a , b , c;
for(n=1; n<1000; n++) /* for(n=100;n<1000;n++) */
{ a=n/100;
b=n/10%10;
c=n/10; /* c=n%10; */
if(n/11=a*a+b*b+c*c||(a==b+a==c+b==c)>=2) /*if(n/11==a*a+b*b+c*c&&(a==b)+(a==c)+(b==c)>=1)*/
printf(“%5d”,n);
}
}
3、程序设计题
(1) [题目]请编程序:根据以下函数关系,对输入的每个x值,计算出相应的y值。
x y x<0 0 0[源程序清单]












[运行结果]




(2) [题目] 编程题:求π的近似值:
要求:先求出前2n项的π值,再求出2n+2项的π值,直至二者之差小于10-5为止。
[源程序清单]










[运行结果]


(3) [题目]编程计算1!+2!+3!+…+n!的前10项之和。
[源程序清单]
main()
{ int n, i;
long s=0, t=1;
printf(“input n=”);
scanf(“%d”,&n);
for(i=1;i<=n;i++)
{ t*=i;
s+=t;
}
printf(“sum=%ld\n”,s);
}

[运行结果]


(4)编程求出两个整数a和b的最小公倍数。
[程序清单]











[运行结果]


四、实验总结


实验名称: 函数的定义、调用和声明
实验时间: 年 月 日 第 周 星期
实验属性:实践性
一、 实验目的
1. 掌握函数的一般调用和递归调用;
2. 掌握函数调用时虚实参数结合的方式;
3. 掌握变量的作用域与存储类别的基本概念。
二、 实验预备工作
1. 复习函数定义的一般形式、函数调用的一般形式;
2. 复习函数实际参数和形式参数的基本概念及在函数调用时形参与实参的结合方法;
3. 复习变量的作用域及存储类别等基本知识。
三、 实验内容
1.填空题
(1) 下列程序执行时的输出结果是___i=

7,j=6,x=7
i=2,j=7,x=5____________。
main()
{
int i=2,x=5,j=7;
fun(j,6);
printf(“i=%d,j=%d,x=%d\n”, i , j , x);
}
fun(int i ,int j)
{
int x=7;
printf(“i=%d,j=%d,x=%d\n”, i , j ,x);
}
(2) 下列程序执行时的输出结果是_____468__________。
main()
{ int a=2, i;
for(i=0; i<3; i++)
{ printf(“%d”, fun(a));
a++;
}
}
f(int a)
{ int b=0;
static int c=0;
b++, c++;
return a+b+c;
}
(3) 下面程序的运行结果是___The result is: 365__________。
long func(long x)
{
if(x<100) return x%10;
else return func(x/100)*10+x%10;
}
main()
{
printf(“The result is: %ld\n”,func(132645));
}
(4) 下面程序的运行结果是_____3600________。
#include
int fun(int k);
int w=3;
main()
{
int w=10;
printf(“%d\n”,fun(5)*w);
}
int fun(int k)
{
if(k==0) return w;
return (fun(k-1)*k);
}
2.改错题
[题目]以下程序从键盘输入一个较大的整数n(n>=6),然后验证6到n之间的所有偶数都可以分解为两个素数之和。
[程序]
#include "stdio.h"
#include”math.h”
void main()
{ int k,j,n,limit;
do
{ printf("Input a number>=6:");
scanf("%d",&limit); }
while(limit<6);
for(n=6;n<=limit;n+=2)
for(k=3;k<=n/2;k+=2)
if(prime(k))
{ j=n-k;
if(prime(j))
{ printf("%d=%d+%d\n",n,k,j);
continue; /* break */
}
}
}
int prime(int m)
{ int g,h; h=sqrt(m);
for(g=2;g<=h;g++)
if(m%g==0)return 0;
return 1;
}
3、程序设计题
(1) [题目] 设n0是一个给定的正整数。对于i=0,1,2,…,定义:若ni是偶数,则ni+1=ni/2;若ni是奇数,则ni+1=3ni+1;若ni是1,则序列结束。用这种方法产生的数称为冰雹数(hailstone)。请编写一个函数void hailstones(int n),其功能是显示由n产生的序列,并按如下形式输出。
Hailstones generated by 77:
77 232 116 58 29 88
44 22 11 34 17 52
26 13 40 20 10 5
16 8 4 2 1
Number of hailstones generated:23
[源程序]
void hailstones(int n)
{ int t=1;
printf("%5d",n);
while(n!=1)
{ t++;
if(n%2) n=3*n+1;
else n=n/2;
printf("%5d",n);
if(t%6==0) printf("\n");
}
printf("\nNumber of hailstones generated:%d\n",t);
}
main()
{ int n;
printf("hailstones generated by: ");
scanf("%d",&n);
hailstones(n);
}




[测试数据及结果]




四、实验总结
实验名称: 数组及其应用


实验时间: 年 月 日 第 周 星期
实验属性:实践性
一、 实验目的
1. 掌握数组元素的输入和输出的方法;
2. 掌握与数组有关的算法(排序、查找、插入、删除等)。
二、 实验预备工作
1. 复习一维、二维数组的定义及数组元素的引用方法;
2. 复习一维、二维数组的输入和输出的方法;
3. 理解冒泡排序算法和选择排序算法。
三、 实验内容
1.填空题
(1)以下程序在a数组中查找与x值相同的元素的所在位置。
main()
{ int a[11] ,x , i;
printf(“Enter 10 Integers:\n”);
for(i=1; i<=10; i++) scanf(“%d”,a+i);
printf(“Enter x:”); scanf(“%d”,&x);
a[0]=___x_______; i=10;
while(x!=a[i]) ____i--_______;
if(__i!=0 (或i>0 )_________) printf(“%5d ’s position is %4d\n”,x,i);
else printf(“%d is not found!\n”,x);
}
(2)以下程序分别在 a 数组和 b 数组中放入an+1 和bn+1个由小到大的有序数, 程序把两个数组中的数按由小到大的顺序归并到c 数组中。
#include
main()
{ int a[10]={1,2,5,8,9,10},an=5;
int b[10]={1,3,4,8,12,18},bn=5;
int i,j,k,c[20],max=9999;
a[an+1]=b[bn+1]=max;
i=j=k=0;
while ((a[i]!=max)||(b[j]!=max))
if(a[i]{ c[k]= a[i] ;
k++;
i++
}
else { c[k]= b[j] ;
k++;
j++
}
for (i=0;iprintf("%4d",c[i]);
printf("\n");
}
2.改错题
(1)[题目] 以下程序的功能是从键盘上最多输入10个整数,并检测整数3是否包含在这些数据中,若包含3,则显示出第一个3出现的位置,程序有些错误,试改正之。
main()
{ int data[10];
j=0; /* int j=0 */
while (j<10)
{ scanf(“%d”,data[j]); /* scanf(“%d”,&data[j]) */
j++;
}
for(j=0;j<10;j++)
if(data[j]=3) /* data[j]== 3 */
{ printf(“3 is in the position of %d\n”,j);
continue;
}
}
(2)[题目]在m行n列的二维数组中找出最大值的元素,然后将该元素所在行与最后一行交换,将该元素所在列与最后一列交换。请按功能要求改正程序中的错误,并调试程序。
#define M 3
#define N 4
#include “math.h”
main()
{int x,k,j,com,col,t;
int a[M][N]={12,4,56,-34,0,-2,-45,3,9,-7,4,-65};
for(k=0;k{ for(j=0;jprintf("\n");
}
putchar('\n');
x=0; com=0; col=0; /* x=a[0][0] */
for(k=0;kfor(j=k+1;jif(xfor(k=0;k{ t=a[k][col];a[k][col]=a[k][N];a[k][N]=t;} /* a[k][col]=a[k][N-1];a[k][N-1]=t; */
for(k=0;k

)
{ t=a[com][k];a[com][k]=a[M][k];a[M][k]=t; } /* a[com][k]=a[M-1][k];a[M-1][k]=t; */
for(k=0;k{ for(j=0;jprintf("\n");
}
putchar('\n');
}
3.程序设计题
⑴下面程序是利用插入排序法将n个数从大到小进行排序,插入排序的算法思想如下:从一个空表开始,将待排序的数一个接一个插入到已排好序的有序表中(空表视为有序),从而得到一个新的、记录数增1的有序表。例如:当n=7时,待排序的数及每一趟有序表的变化情况如下:
趟数 有序表 剩余待排序数 初始状态 空 49 38 65 97 76 13 27 第1趟 49 38 65 97 76 13 27 第2趟 49 38 65 97 76 13 27 第3趟 65 49 38 97 76 13 27 第4趟 97 65 49 38 76 13 27 第5趟 97 76 65 49 38 13 27 第6趟 97 76 65 49 38 13 27 第7趟 97 76 65 49 38 27 13 空 请完善下列程序并进行调试。
#include <stdio.h>
main()
{ int a[10]; int i ,j,t;
printf(”\nEnter 10 number:”);
for(i=0; i<=9; i++)
scanf(“%d”,&a[i]);
for(i=1; i<=9; i++)
{ t=a[i];
j=i-1 ;
while((j>=0)&&(t>a[j]))
{ a[j+1]=a[j] ;
j--;
}
a[j+1]=t ;
}

printf(“\nthere is 10 number:”);
for(i=0; i<=9; i++) printff(“%4d”,a[i]);

(2) [题目] 打印以下形式的杨辉三角形。
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
[源程序清单]

 
 
 
 
 
 
 
 
 
 
 
 

运行结果:
 
 
四、 实验总结


实验名称: 字符串处理
实验时间: 年 月 日 第 周 星期
实验属性:实践性
一、 实验目的
1.掌握字符串处理函数的模拟;
2.掌握字符串的压缩与还原、查找子串、插入子串等操作。
二、 实验预备工作
1. 掌握字符串的初始化方法及字符串的结束标记;
2. 复习字符串的输入输出方法;
3. 复习字符串处理函数,掌握其功能及使用方法。
三、实验内容
1. 填空题
(1)下面程序是模拟字符串复制函数,将字符串b复制到字符串a。
#include
#include
main()
{ int i;
char a[20],b[10];
gets(b); i=0
while(____a[i]=b[j] (或 (a[i]=b[j]) != ‘\0 ‘ )____) ______i++______;
puts(a);
}
(2)下面函数的功能是比较两个字符串是否相等,若相等则返回1,否则返回0。
compare(char a[], char b[])
{ int i=0;
while(___a[i]==b[j]___&&_

__ a[i] != ‘\0 ‘ (或b[i]) != ‘\0 ‘)__) i++;
return (a[i]== ‘\0 ‘&& b[i]== ‘\0 ‘)? 1: 0 (或!(a[i]-b[i]))__;
}

2. 改错题
[题目] 下面程序的功能是将字符串中的数字字符删除后输出。
void delnum(char s[80])
{ int i,j;
for (i=0,j=0;s[i]!=’\0’;i++)
if (s[i]>’0’&& s[i]<’9’) /* !(s[i]>=’0’&& s[i]<=’9’) */
{s[j]=s[i]; j++}
s[i]=’\0’; /* s[j]=’\0’; */
}
main()
{ char item[80];
gets(item);
delnum(item);
printf(“\n%s”,item);
}
3. 程序设计题
(1) [题目] 在一行文本中查找给定的单词。一行文本有字母和分隔符组成,分隔符包括若干空格、逗号、句号和换行符。一个单词有若干个连续字母组成。
[实现提示]main函数中word数组存放欲查找的单词。find_word函数完成在t字符串中查找单词w的功能,先从t串中找出一个单词,再与w进行比较,最后如果找到则返回单词w在t串中第一次出现的位置,否则返回-1。
[源程序清单]
#include
#include
#include
main()
{
char text[80]=“I will pass the examination in the summer holiday.”,word[20];
int t;
puts(“enter a word to be found:”);
gets(word);
t=find_word(___text, word__________);
if(__t>=0 (或t!=1 )___________)
printf(“The word ‘%s’ in text . It locates in %d.\n”,word,t);
else
printf(“not found!\n”);
}

find_word(char t[] , char w[])
{
char s[20];
int i , j , k=0;
for(i=0; t[i]!=’\0’; i++)
{ if(isalpha(t[i]))
{ for(j=0; isalpha(t[i+j]); j++)
s[j]=__t[i+j]________;
s[j]=’\0’;
if(strcmp(w,s)==0)
return _i______;
i=____i+j_________;
}
}
return -1;
}

[测试数据及结果]



(2)[题目] 程序功能:将一字符串做压缩处理。编程要求:
① 编写一个函数int compress(char s[]),将s中连续出现的多个相同字符压缩为一个字符,统计被删除的字符个数,返回被删除的字符个数。
② 编写主函数main,从键盘读入一行字符数据放入一个字符型数组中,调用compress函数对该字符数组中字符做压缩处理,输出压缩后的字符串。
③ 用以下数据测试程序:
@@@@@@ I wwillll succesful &&&&&& and you too !!!!!!##########
[源程序清单]
程序一:
#include
main()
{ int n;
char str[100];
gets(str);
n=compress(str);
printf("compress %d char! %s\n",n,str);
}
int compress(char s[])
{int i,j,sum=0,n=0;
for(i=j=0;s[i];i++)
{ while(s[i]==s[i+1]) {i++;n++;}
sum+=n;
n=0;
s[j++]=s[i];
}
s[j]='\0';
return sum;
}


程序二:
#include
#include
#include


main ( )
{ char s[]="@@@@@ I wwillll successful";
int n;
n=compress(s) ;
puts(s);
printf("\n%d\n",n);
getch();
}
int compress(char s[])
{ char *p=s,*q;
int n=0;
while(*p)
{ q=p+1;
while( *q==*p )
{ q++;
n++;
}
strcpy(p+1, q);
p++;
}
return n;


 [测试数据及结果]

四、实验总结
实验名称: 函数的应用
实验时间: 年 月 日 第 周 星期
实验属性:实践性
一、实验目的
1. 掌握指针的基本概念;
2. 掌握指针作为函数参数时程序设计的方法技巧;
3. 掌握方程求根、定积分计算等常用算法;
4. 了解指针函数的用法。
二、 实验预备工作
1. 复习指针的用法;
2. 复习与数组有关的指针的定义和用法;
3. 复习指针作为函数参数时的用法。
三、实验内容
1. 填空题
(1) 以下程序的运行结果是______C________
main()
{
char s[]=”China”; char *p=s;
printf(“%c”, *p);
}
(2) 以下程序的运行结果是___0 1 3 6___________
main()
{ int i ,k ;
for(i=0; i<4; i++)
{ k=sub(&i);
printf(“%3d”,k);
}
printf(“\n”);
}
sub(int *s)
{ static int t=0;
t=*s+t;
return t; }
2. 改错题
[题目] 以下程序中函数encode完成一个字符串的加密功能,将s1字符串中的字符经过变换后保存到s2指向的字符数组中。二维数组cs保存了一个明码密码对照表,第一行是明码字符,第二行是对应的密码字符。加密方法:从s1字符串中每取一个字符,均在cs表第一行中查找有无该明码字符,若找到则将对应的密码字符放入s2中,否则将s1中原来的字符放入s2中。
#include
char cs[2][10]={"aceghjlnp","fonptiude"};
void encode(char *s1,char *s2)
{ int n,i,j;
for(n=0;s1[n]!='\0';n++)
{ for(i=0;i<10 && s1[n]!=cs[0][i]; i++ );
if(i<10) s2[n]=s1[n] ; /* i>=10 */
else s2[n]=cs[1][i];
}
s2[n]='\0';
}

main()
{ char ts[80]="jntwrnwt",td[80];
encode(ts,td); puts(td);
}
3. 程序设计题
(1)[题目] 用牛顿迭代法求方程3x3-3x2+x-1=0在x0=2附近的实根。要求:
① 用函数float newtoon(float x)求方程在x附近的根;
② 用函数float F(float x)求x处的函数值,用函数float F1(float x)求f(x)在x处的导数;
③ 在主函数中输入x0,并输出结果。
[算法提示]
牛顿迭代法又被称为切线法。设f(x)= 3x3-3x2+x-1,若要求方程的根,即求f(x)=0时x的值。我们需要知道x0的值,表示在x0附近求实根。在曲线上f(x0)点处作该点的切线,切线的斜率为f’(x0);切线与x轴的交点为x,切线的斜率又为,所以,可得交点x的值为。如果|x-x0|>1e-5,则把x当作新的x0,重复上述过程,直到|x-x0|<=1e-5为止。
[源程

序]
float F(float x)
{
return x*(3*x*(x-1)+1)-1;
}
float F1(float x)
{
return __9*x*x-6*x+1________________;
}
float newtoon(float x)
{
float f,f1,x0;

do { _xo=x_____________;
f=F(x0);
f1=F1(x0);
x=___x0-f/f1___________;
}while(___fabs(x-x0)>=1e-5____________);
return x;
}
main()
{ float x0;
scanf(“%f”,&x0);
printf(“The result =%.2f\n”,____newtoon(x0)_____________);
}
[运行结果]





(2)[题目] 两个等长的二进制数之间的海明距离是指对应位数字不同的位数。如100101和001110之间的海明距离为4。设计算机系统使用16个二进制位表示一个十进制整数,试按下列要求编写程序:
① 编写函数void DecToBin(char str[], int n),其功能是将非负整数n转换成16位二进制数字字符串,按由低位向高位存入数组str中;
② 编写函数int Hymin(char *x , char *y),其功能是统计x、y指向的两个16位二进制数字字符串对应位数字不同的位数,并返回统计结果;
③ 在主函数中输入两个十进制正整数39和15,分别调用函数DecToBin将它们转换为二进制数字字符串,再调用函数Hymin计算它们之间的海明距离。将这两个十进制数转换后的二进制字符串及其海明距离输出。
请验证结果是否为:distance of 39 and 15 = 2
[源程序]
void DecToBin(char str[] , int n)
{int i=0,j;
while(n!=0)
{ str[i++]=___n%2+’0’________;
n=___n/2____;
}
for(j=i ; j<16 ; j++) str[j]=’0’;
}

int Hymin(char *x , char *y)
{int count=0, i ;
for(i=0; i<16 ; i++)
if(__x[i]!=y[i] (或 *x++!=*y++_)_________) count++;
return count;
}
main()
{ int m,n,t;
char a[17],b[17];
scanf(“%d%d”,&m,&n);
__DecToBin( a, m)_____________;
___ DecToBin( b, n)____________;
printf(“distance of %d and %d = %d\n”,m,n,___Hymin(a,b)________);
}
[测试数据及结果]





四、实验总结




实验名称: 链 表
实验时间: 年 月 日 第 周 星期
实验属性:验证性
一、 实验目的
1. 掌握结构体的基本概念及应用;
2. 了解动态存储分配的基本概念;
3. 进一步掌握C语言中指针的运用;
4. 掌握链表的建立、插入、删除、归并等基本操作。
二、 实验预备工作
1. 复习结构体的基本概念;
2. 复习指向结构体数组的指针的应用。
三、 实验内容
1.填空题
(1)有如下说明:
struct link { int data; struct link *next;}*p;
设p已申请到一个结点空间,要求将p串接到头结点head上,写出建立如图所示的存储结构和赋值所需的语句。
head data next
head = _____p_

________;
____p->data___________ = 20;
____p->next___________ = NULL;
(2) 下列程序的运行结果是_____51,60,21________________
struct stu { int x;int *y; } *p;
int dt[4]={10,20,30,40};
sturct stu a[4]={50,&dt[0],60,&dt[1],70,&dt[2],80,&dt[3]};
main()
{ p=a;
printf("%d,",++p->x);
printf("%d,",(++p)->x);
printf("%d\n",++(*p->y));
}
2.改错题
[题目] 下列程序用来建立一个带头结点的单向链表,新产生的结点总插在链首。程序有些错误,请上机调试并改正之。
#include
main()
{ struct node
{ char ch;
struct node *l;
}*h,*p;
char c;
h=NULL;
while ((c=getchar())!=’\n’)
{ p=(int *)malloc(sizeof(struct node));
p->ch=c;
h=p->l;
p=h;
}
p=h;
while(p!=NULL)
{ printf(“%3c”,p->ch);
p++;
}
putchar(‘\n’);
}
四、 实验总结


实验名称: 算法设计与简单分析
实验时间: 年 月 日 第 周 星期
实验属性:综合性
一、 实验目的
1.掌握文件以及缓冲文件系统、文件指针的基本概念;
2.掌握用C的标准I/O函数对文件进行打开、关闭、读写等操作;
3.进一步掌握程序设计、多函数编程的基本方法;
4.理解模块化程序设计的内涵;
5.熟练掌握单向链表的操作方法。
二、实验预备工作
1. 复习有关文件、文件指针的基本概念;
2. 复习fopen()、fclose()、fscanf()、fprintf()、feof()等函数使用格式和功能;
3. 进一步理解结构化程序设计的三种结构;
4. 进一步复习函数定义、声明、调用的方法及函数参数的传递方式。
三、实验内容
1、填空题
阅读、调试并写出下列程序的功能______________________________________。
#include "stdio.h"
main()
{ FILE *fp;
char ch,fname[10];
printf("Input name of file\n");
gets(fname);
if((fp=fopen(fname,"w"))==NULL)
{ printf("cannot open this file!\n");
exit(0);
}
printf("Enter data:\n");
while((ch=getchar())!='!')
fputc(ch,fp);
fclose(fp);
}
2、改错题
[源程序]
int main(void)
{ int *fp;
int k;
fp=fopen(“gelatin”);
for(k=0;k<30;k++)
fputs(fp, “Nanette eats gelatin.”);
fclose(“gelatin”);
return 0;
}
3、程序设计题
设计一简单的学生成绩管理系统,学生成绩信息以文件形式存储在外存中,需要操作时,需调入内存以链表形式存放;数据的基本操作包括添加、删除、插入、显示全部记录等。
(1) 采用菜单驱动方式;程序显示如下菜单:
****Students' Grade

Management System**** /*菜单选择*/
1. Input Records
2. Display All Records
3. Insert a Record
4. Delete a Record
5. write data to file
0. Quit
*****************************************
(2) 每个学生成绩信息包括学号、姓名、成绩,每个学生的信息构成一条记录。
(3) 以文件形式存储学生成绩信息,以链表形式进行添加、插入、删除和显示全部记录等
操作;
(4) 根据文件创建链表,操作完毕后,以文件存储链表数据。
(5) 部分函数已完成,请完成剩余函数。
#include
#include
#include

typedef struct /*定义学生成绩信息结构体*/
{
char num[10]; /*学号*/
char name[20]; /*姓名*/
int score; /*成绩*/
}SSCORE;
int menu(); /*菜单函数*/
void add(SSCORE * link); /*增加一批记录*/
void display(SSCORE *link); /*显示全部记录*/
void insert(SSCORE *link, char number[]); /*根据学号,在该学号的记录前增加一记录*/
void delete(SSCORE *link, char number[]); /*根据学号,删除一条记录*/
void write(SSCORE *link, char fname[]); /*链表数据写入指定文件*/
SSCORE * createl(char fname[]); /*根据文件,创建链表,并返回该链表的头指针*/

void main() /*主函数*/
{ char c;
char fnameo[20],fnames[20],numid[20];
SSCORE *stulink=NULL;
system("cls"); /*清屏*/
printf("please input file name\n");
scanf("%s",fname); /*输入要打开文件的文件名*/
stulink=create(fname);
while(1)
{ c=menu();
switch(c) /*判断具体操作*/
{ case 1:
printf("\tInput Records\n"); /*增加一批记录*/
add(stulink);
system("pause");break;
case 2:
printf("\tDisplay All Records\n");
display(stulink); /*显示所有记录*/
system("pause");break;
case 3:
printf("\tInsert a Record\n");
printf("\tPlease input a numid\n");
scanf("%s",numid); /*输入学号*/
insert(stulink,numid); /*根据学号,在该学号记录前增加一条记录*/
system("pause");break;
case 4:
printf("\tDelete a Record\n");
printf("\tPlease input a numid\n");
scanf("%s",numid); /*输入学号*/
delete(stulink,numid); /*根据学号,删除一条记录*/
system("pause");break;
case 5:
printf("\t write data to file\n");
printf("please input file name\n");
scanf("%s",fnames); /*输入保存文件的文件名*/
write(stulink,fnames); /*数据写入指定文件*/
system("pause");break;
case 0:
printf("\tGood Luck,Bye-bye!\n");
system("pause");
free(stulink);
exit(0); /*结束程序*/
}
}
system("pause

");
}

int menu() /*菜单函数*/
{ char c;
do
{ system("cls"); /*清屏*/
printf("\t****Students' Grade Management System****\n"); /*菜单选择*/
printf("\t 1. Input Records \n");
printf("\t 2. Display All Records\n");
printf("\t 3. Insert a Record\n");
printf("\t 4. Delete a Record\n");
printf("\t 5. write data to file\n");
printf("\t 0. Quit\n");
printf("\t *****************************************\n");
printf("\t Give your Choice(0-5):");
c=getchar(); /*读入选择*/
}while(c<'0'||c>'5');
return(c-'0'); /*返回选择*/
}

SSCORE *createl(char fname[]) /*根据文件,创建链表,并返回该链表的头指针*/
{










}

void add(SSCORE * link) /*增加一批记录*/
{










}
void display(SSCORE *link) /*显示全部记录*/
{










}
void insert(SSCORE *link, char number[]) /*根据学号,在该学号记录前增加一条记录*/
{








}
void delete(SSCORE *link,char number[]) /*根据学号,删除一条记录*/
{










}
void write(SSCORE *link, char fname[]) /*链表数据写入指定文件*/
{











}

四、实验总结



151





《C及C++程序设计》实验报告

18



相关文档