C语言程序设计上机实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

本科实习报告
实习名称: C 语言程序设计实习性质:08060101
实习时间:2011.09—2012.01
实习地点:
学生姓名:
学号:
学院:信息科学技术学院
学系:数学系
专业:信息与计算科学
指导教师:
教师单位:数学系
2011年9月1日
C语言程序设计课程实验项目目录学生姓名:学号:
第 1 页暨南大学本科实验报告专用纸
实验一熟悉WinTC/VC的上机过程:
一、实验目的:
1.熟悉Win TC或者VC++ 6.0的软件环境,掌握使用其进行编辑、编译、连接和运行的方法。

2.通过运行简单的C程序,掌握C源程序的特点。

二、实验内容:(由学生选择WinTC或者VC之一完成相关实验)
1.运行WinTC程序,进入C程序设计环境。

2.建立工程文件
3.编辑源文件
4.编译、连接
(1)单文件源程序的编译、连接
源程序先经过编译,生成目标文件(.obj文件),然后将目标文件进行连接,生成可执行文件(.exe)。

如果编译、连接中发生错误,在Message窗口中显示出错信息,修改错误后,可重新编译、连接。

(2)多文件源程序的编译、连接
可以用长的源程序分割成几个文件,分别编译然后生成可执行文件。

此时使用Project菜单。

步骤:第一步:有三个文件f1.c、f2.c、f3.c组成一个完整的C程序,分别建立三个文件,将f1.c、f2.c、f3.c三个文件保存到同一个文件夹中(如d:\tc\project\)。

f1.c:
#include "stdio.h"
extern a,b;
extern max(int x,int y);
main()
{
int e=1,f=2;
printf("%d\n",max(a,b));
printf("%d\n",max(e,f));
}
f2.c:
int a=3,b=4;
f3.c:
int max(int x,int y )
{return x>y?x:y;}
第 2 页C语言程序设计
第二步:构造Project文件,在编辑状态下,编辑一个扩展名为.prj的文件,文件的内容为:f1
f2
f3
第三步:构造EXE文件,按F9键即将三个文件编译、连接成一个EXE文件,文件名为wang.exe。

如果编译、连接出现错误,则必须进行修正,然后再编译。

5.运行程序
如果编译、连接完全正确,则可以用运行程序。

三、实验过程(依据上面示例,简要描述你使用WinTC或者其它编译器的过程)
第 3 页暨南大学本科实验报告专用纸
实验二数据类型、运算符和表达式
一、实验目的:
1.掌握C语言数据类型,熟悉如何定义整型、字符型、实型变量,以及对它们赋值的方法,了解以上数据类型输出时所使用的格式转换符号。

2.学会使用C的有关运算符,以及包含这些运算符号的表达式,特别是自加(++)和自减(——)运算符的使用。

3.进一步熟悉C程序的编辑、编译、连接和运行的过程。

二、实验内容:
1.输入以下程序,并编译、运行,分析运行结果:
main()
{ char c1,c2;
c1=97;c2=98;
printf(″% c %c″,c1,c2);
}
在此基础上:
(1)加一个printf语句,并运行之。

printf(″%d,%d″,c1,c2);
(2)再将第二行改为:
int c1,c2;
再运行程序。

第 4 页C语言程序设计
(3)再将第三行改为:
c1=300;c2=400;
再运行,并分析结果。

2.输入并运行以下程序:
main()
{ int i,j,m,n;
i=8;j=10;
m=++i;n=j++;
printf(″%d,%d,%d,%d\n″,i,j,m,n);
}
分别作以下改动并运行:
(1)将第四行改为:
m=i++;n=++j;
(2)程序改为:
main()
{ int i,j;
i=8;j=10;
printf(″%d,%d″,i++,j++);
}
第 5 页(3)在(2)的基础上,将printf语句改为:
printf(″%d,%d″,++i,++j);
(4)再将printf语句改为:
printf(″%d,%d,%d,%d″,i,j,i++,j++);
(5)程序改为:
main()
{ int i,j,m=0,n=0;
i=8;j=10;
m+=i++;n-=--j;
printf(″i=%d,j=%d,m=%d,n=%d″,i,j,m,n);
}
3.先判断以下程序的输出结果,在运行验证。

(1) (实验结果: 12 2 12 10)
main()
{ int i=3,j=2,a,b,c,d;
d=(i*3,j=10);
a=(--i==j++)? --i:++j;
b=i++;
c=j;
printf(″%d,%d,%d,%d\n″,a,b,c,d);
}
第 6 页C语言程序设计
(2)( 实验结果: 6e 16)
main()
{ int a=110,b=017;
printf(″%x,%d\n″,a++,++b);
}
(3)( 实验结果: 0 36 0)
main()
{
int a=-1;b=36,c;
c=(++a>0)&&!(b--<=0);
printf(″%d,%d,%d\n″,a,b,c);
}
4.补充完整以下程序,将从键盘输入的任意大写字母转换为小写字母,将小写字母转换为大写字母。

( 实验结果:与输入相同)
main()
{ char c;
scanf(″%c″,&c);
.......
printf(″%c″,c);
}
第7 页暨南大学本科实验报告专用纸
实验三顺序程序设计
一、实验目的:
1.掌握赋值语句的使用。

2.掌握数据的输入输出方法,能正确使用各种格式转换符。

二、实验内容:
1.输入以下程序:
#include "stdio.h"
main()
{
int i;
char j;
for(i=1;i<10;i++)
{
scanf("%c",&j);
printf("%c",j);
}
}
(1)运行程序,输入a↙b↙c↙d↙e↙f↙g↙h↙i↙
观察程序的执行结果,是否能够输出字母a,b,c,d,e,f,g,h,i。

为什么?
(不能。

因为按回车会被当做一个换行字符被送到缓冲区)
(2)在scanf语句后面加上语句:getchar();
运行程序,输入a↙b↙c↙d↙e↙f↙g↙h↙i↙
观察程序的执行结果,是否能够输出字母a,b,c,d,e,f,g,h,i。

为什么?
(能。

按回车键之后字符才被输送,所以没有读取回车这个字符)
第8 页C 语言程序设计
(4)在源程序的基础上,将scanf语句的%c前面加一空格,即改为:scanf("└┘%c",&j);
运行程序,输入└┘a↙└┘b↙└┘c↙└┘d↙└┘e↙└┘f↙└┘g↙└┘h↙└┘i↙
观察程序的执行结果,是否能够输出字母a,b,c,d,e,f,g,h,i。

为什么?
(能。

└┘ %c在输出时没有输出└┘这个字符,所以当每次输入空格跟一个字母时,字母在空格的位置输出,而回车这个换行字符则在字母的位置输出)
运行程序,输入└┘a└┘b└┘c└┘d└┘e└┘f└┘g└┘h└┘i↙
观察程序的执行结果,是否能够输出字母a,b,c,d,e,f,g,h,i。

为什么?
(能。

└┘%c被当成是一个循环,所以└┘没有占据单独的一个循环,故能全部输出。


2.做教材上的习题
3.6和3.7
3.编制一程序,用getchar函数输入字符,然后用putchar函数输出字符,同时要求输出字符的ASCII
#include <stdio.h> void main()
{ char c1,c2;
c1=getchar();
c2=getchar();
putchar(c1);
putchar(c2);
putchar('\n'); } #include <stdio.h> void main()
{ Int c1,c2;
c1=getchar();
c2=getchar();
putchar(c1);
putchar(c2);
putchar('\n'); }
暨南大学本科实验报告专用纸
实验四逻辑运算和判断选取控制
一、目的要求
1.了解C语言表示逻辑量的方法(以0代表“假”,以1代表“真”);
2.学会正确使用逻辑运算符和逻辑表达式;
3.熟练掌握if语句和switch语句
二、实验内容
先编程序,解决以下问题,然后上机调试运行程序。

1.编写一程序,从键盘输入字符,判别输入字符是数字、大写字母还是小写字母,输出判别结果。

#include "stdio.h"
void main()
{
p rintf("please input a char\n");
c har x;
x=getchar();
i f (x>='A'&&x<='Z'||x>='a'&&x<='z')printf("this is a letter\n");
e lse
if (x>='0'&&x<='9')printf("this is a num\n");
else
printf("error\n");
}
2.给出一个不多于5位的正整数,要求:
(1)求出它是几位数;
#include "stdio.h"
void main()
{
i nt a,i=0;
s canf("%d",&a);
w hile (a>0)
{
i=i+1;
a=a/10;
}
p rintf("%d\n",i);
}
(2)分别打印出每一位数字;#include "stdio.h"
void main()
{
int a,b,i,c=10000;
scanf("%d",&a);
for (i=4;i>=0;i=i--)
{b=a/c;
printf("%d ",b);
a=a-b*c;
c=c/10;
}
}
(3)按逆序打印出各位数字。

#include "stdio.h"
void main()
{
int a,i,c=10000;
char b[5];
scanf("%d",&a);
for (i=4;i>=0;i=i--)
{
b[i]=a/c;
a=a-b[i]*c;
c=c/10;
}
for (i=0;i<=4;i++)
printf("%d ",b[i]); }
3.任意输入5个字母,如果输入的不是字母,程序应能提示重新输入,然后按照字母的ASCII码值从小到大的顺序输出。

#include "stdio.h"
#include<conio.h>
main()
{
char a,b,c,d,e,x[5];
int i,t,j;
a=getchar();b=getchar();c=getchar();
d=getchar();e=getchar();
if ((a<'A'||a>'z'||a>'Z'&&a<'a')||
(b<'A'||b>'z'||b>'Z'&&b<'a')||
(c<'A'||c>'z'||c>'Z'&&c<'a')||
(d<'A'||d>'z'||d>'Z'&&d<'a')||
(e<'A'||e>'z'||e>'Z'&&e<'a'))
printf("please retype the char\n");
else
printf("%d,%d,%d,%d,%d\n",a,b,c,d,e);
printf("按从小到达排列\n");
x[0]=a;x[1]=b;x[2]=c;x[3]=d;x[4]=e;
for (j=0;j<=3;j++)
for (i=0;i<4-i;i++)
if (x[i]>x[i+1])
{
t=x[i];
x[i]=x[i+1];
x[i+1]=t;
}
for (i=0;i<5;i++)
printf("%d\n",x[i]);
getch();
}
4.有一函数,
()
()
()






-
<

-
<
=
10
1
3
10
1
1
2
1
2
x
x
x
x
x
x
y,用scanf函数输入任意x的值,求y的值。

#include "stdio.h"
void main()
{
float x,y;
printf("please input a num\n");
scanf("%f",&x);
if (x<1)y=x*x;
else
if (x>=10)y=3*x-1;
else
y=2*x-1;
printf("x=%f,y=%f\n",x,y);
}
暨南大学本科实验报告专用纸
实验五循环控制
一、实验目的
1.熟悉用while语句,do-while语句和for语句实现循环的方法。

2.掌握在程序设计中用循环的方法实现各种算法(如穷举、迭代、递推等)。

二、实验内容
编写程序并上机调试运行。

1.输入两个正整数,求其中最大公约数和最小共倍数。

#include<stdio.h>
#include<conio.h>
void main()
{
int a,b,c,d,e;
printf ("please input 2 numbers:\n");
scanf ("%d,%d",&a,&b);
e=a*b;
if (a<b)
{c=b;b=a;a=c;};
while (b!=0)
{d=a%b;a=b;b=d;};
printf ("最小公约数是:%d\n",a);
printf ("最小公倍数是:%d\n",e/a);
}
2.输入一行字符,分别统计出其中的英文字母、空格、数字和其它字符的个数。

#include<stdio.h>
void main()
{
char c;
int L=0,N=0,S=0,O=0;
printf("请输入一段字符:\n");
while(c!='\n')
{c=getchar();
if (c>='a'&&c<='z'||c>='A'&&c<='Z')
L=L+1;
else
if (c>='0'&&c<='9') N=N+1;
else
if (c==' ') S=S+1;
else
O=0+1;
}
printf("字母:%d个,数字:%d个,空格:%d
个,
其它:%d个\n",L,N,S,O);
}
3.输出九九表。

1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 2
4 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81 #include<stdio.h>
void main()
{
int x[9][9];
int a,b;
for(a=1;a<=9;a++)
{
for(b=1;b<=9;b++)
{x[a][b]=a*b;}
}
for(a=1;a<=9;a++)
{
for(b=1;b<=9;b++)
printf("%d ",x[a][b]);
printf("\n");
}
}
4.求输入的十个整数中正数的个数及其平均值。

#include<stdio.h>
void main()
{ char x[10];
int i,n=0;
float ave,s=0;
printf("请输入十个整数:\n");
for (i=0;i<=9;i++)
scanf("%d",&x[i]);
for (i=0;i<=9;i++)
{if (x[i]>0)
{s=s+x[i];
printf("%d ",x[i]);
n=n+1;}
}
ave=s/n;
printf("正整数为%d个\n",n);
printf("平均数为%f\n",ave);
}
5.两个乒乓球队进行比赛,各出三人。

甲队为A、B、C3人,乙队为X、Y、Z3人。

已抽签决定比赛名单。

有人向队员打听比赛的名单,A说他不和X比,C说他不和X、Z比,请编写找出3对赛手的名单。

(提示:用循环和判断实现)
#include<stdio.h>
void main()
{
char A,B,C;
for(A='X';A<='Z';A++)
for(B='X';B<='Z';B++)
if(A!=B)
for(C='X';C<='Z';C++)
if(A!=C&&B!=C)
if(A!='X'&&C!='X'&&C!='Z')
printf("A-%c\,B-%c\,C-%c\n",A,B,C);
}
暨南大学本科实验报告专用纸
实验六数组
一、目的要求
1.掌握一维数组和二维数组的定义、赋值和输入输出的方法;
2.掌握字符数组和字符串函数的使用;
3.掌握与数组有关的算法(特别是排序算法)。

二、实验内容
编写程序并上机调试运行。

1.编写一程序,从键盘输入任意两个字符串,然后将两个字符串连接起来,不要使用strcat函数。

#include<stdio.h>
#include<string.h>
void main()
{
char str1[50],str2[50],str3[50];
printf("请输入字符串1:");
scanf("%s",str1);
printf("请输入字符串2:");
scanf("%s",str2);
strcmp(str3,str2);
printf("连接后字符串为:%s%s\n",str1,str2);
}
2.编写一程序,从键盘输入任意两个字符串s1和s2,然后比较字符串的大小(字符串比较是从左到右逐位比较),如果s1>s2,输出1;s1=s2,输出0;s1<s2,输出-1。

#include<stdio.h>
#include<string.h>
void main()
{
char str1[20],str2[20];
printf("请输入字符串1:");
scanf("%s",str1);
printf("请输入字符串2:");
scanf("%s",str2);
if (strcmp(str1,str2)>0)
printf("1\n");
else
if (strcmp(str1,str2)<0)
printf("-1\n");
else
printf("0\n");
}
3.编写一程序,输入一字符串到数组中,然后将该数组中小写字母转换为大写字母,并复制到另一字符数组中。

(复制时,‘\0’也要复制过去)
#include<stdio.h>
#include<string.h>
void main()
{
char str1[20],str2[20];
printf("请输入字符串:");
scanf("%s",str1);
strupr(str1);
strcpy(str2,str1);
printf("转化后字符串为:%s\n",str2);
}
4.编写程序,把键盘输入的字符串中的数字字符删除,然后现实该字符串。

#include<stdio.h>
#include<string.h>
void main()
{
char str[50];
int i=0;
printf("请输入字符串:");
scanf("%s",str);
for(i=0;i<=strlen(str);i++)
{
if(str[i]>='0'&&str[i]<='9')
str[i]=' ';
}
printf("删除后字符串为:%s\n",str);
}
暨南大学本科实验报告专用纸
实验七函数
一、目的要求
1.掌握定义函数的方法;
2.掌握函数实参与形参的对应关系,以及“值传递”的方式;
3.掌握函数的嵌套调用和递归调用的方法;
4.掌握全局变量和局部变量、动态变量和静态变量的概念和使用方法。

二、实验内容
编写程序,并上机运行之。

1.输入一行字符串,然后写一函数输出该行字符串中最长的单词。

例如I am a student中最长的单词为student。

#include <stdio.h>
#include <string.h>
void main()
{
char a[100];
void f(char a[100]);
printf("请输入一串字符:");
gets(a);
f(a);
}
void f(char a[100])
{
int lenth=0,max=0,i,flag=0;
for(i=0;a[i]!='\0';i++)
{
if(a[i]!=' ')lenth++;
if(a[i]==' ')
{ if(lenth>max)
max=lenth;
lenth=0;
}
}
if(lenth>max)
{ max=lenth;
flag=i-max;
printf("该字符串中最长的单词共%d个字符,该单词为:",max);
for(i=flag;i<flag+max;i++)
printf("%c",a[i]);
printf("\n\n");
}
lenth=0;
}
2.写一函数,使输入的一个字符串反序存放,使用“传址”调用方式。

#include <stdio.h>
#include <string.h>
void Rearrange(char *p)
{
char *str=strrev(p);
strcpy(p, str);
return ;
}
int main(void)
{
char a[20];
printf("请输入一个字符串:");
scanf("%s",a);
Rearrange(a);
printf("该字符串倒序排列后结果如下:");
printf("%s",a);
printf("\n\n");
return 0;
}
3.写几个函数。

(1)输入10个职工的姓名和职工号;(2)将职工号由小到大排序,姓名顺序也随之调整;(3)要求输入一个职工号,用折半查找法找出该职工的姓名。

从主函数中输入要查找的职工号,输出该职工姓名。

解释:折半查找法是先将数据排序,例如有7个数据:1,3,4,7,10,25,30已经排序,要查找25在序列中的位置。

将序列折半,中间位置为4,中间数为7,如果25等于该中间数则停止,否则继续。

序列分为:1,3,4和10,25,30。

25比4大,显然25不在序列1,3,4中;对序列10,25,30重新按照折半法查找,中间数为25,已经查找结束。

(1): int input(int mum[10],char name[10][8])
{
int i;
for(i=0;i<10;i++)
{
printf("请输入工号:\n");
scanf("%d",&num[i]);
printf("请输入姓名:\n");
getchar();
gets(name[i]);
}
}
(2):int sort(int num[10],char name[10][8])
{
int i,j,k,t;
char h[8];
for(i=0;i<10;i++)
{
k=i;
for(j=i+1;j<10;j++)
if(num[j]<num[k])k=j;
if(k!=i)
{
t=num[i];
strcpy(h,name[i]);
num[i]=num[k];
strcpy(name[i],name[k]);
num[k]=t;
strcpy(name[k],h);
}
}
}
(3):int search(int n,int num[10],char mame[10][8])
int sta,end,mid,loca,sign;
sta=0;end=9;sign=0;
if((n<num[0])||(n>num[9]))
loca=0;
while((sign==0)&&(sta<=end))
{
mid=(sta+end)/2;
if(n==num[mid])
{ loca=mid;
printf("职工号:%d,姓名:%s\n",n,name[loca]);
sign=1;
}
else if(n<num[mid])
end=mid-1;
else sta=mid+1;
}
if(sign==0||loca==0)
printf("对不起,无法找到您想要的职工!\n");
}
4.写一个判断素数的函数,在主函数中输入一个整数,输出是否素数的信息。

#include<stdio.h>
#include<math.h>
void main()
{ int judge(int n);
int n;
printf("请输入一个整数:\n");
scanf("%d",&n);
if (judge(n)==0)
printf("%d是素数!\n\n",n);
else
printf("%d不是素数!\n\n",n);
}
int judge(int n)
{ int flag=1,i,j;
j=sqrt(n);
for(i=2;i<=j;i++)
if (n%i==0)
flag=0;
return(flag);
}
暨南大学本科实验报告专用纸
实验九指针
一、实验目的:
1.掌握指针的概念,会定义和使用指针变量;
2.学会使用数组的指针和指向数组的指针变量;
3.学会使用字符串的指针和指向字符串的指针变量;
4.学会使用指向函数的指针变量;
5.了解指向指针的指针的概念及其使用方法。

二、实验内容:
编写程序,并上机运行之(要求使用指针处理)。

1.编制一函数实现任意3*3阶矩阵的转置,函数的参数用指针形式。

在主函数中输入矩阵元素。

#include<stdio.h>
void main()
{
int trs(int *p);
int a[3][3],*p,i;
printf("请输入一个3X3矩阵:\n");
for(i=0;i<3;i++)
scanf("%d%d%d",&a[i][0],&a[i][1],&a[i][2]);
p=&a[0][0];
trs(p);
printf("转置后的新矩阵如下:\n");
for(i=0;i<3;i++)
printf("%d %d %d\n",a[i][0],a[i][1],a[i][2]);
}
int trs(int *p)
{
int i,j,k;
for(i=0;i<3;i++)
for(j=i;j<3;j++)
{
k=*(p+3*i+j);
*(p+3*i+j)=*(p+3*j+i);
*(p+3*j+i)=k;
}
return 1;
}
2.从键盘输入任意两个字符串s1和s2,然后用函数实现比较字符串的大小(字符串比较是从左到右逐位比较),如果s1>s2,函数返回1;s1=s2,函数返回0;s1<s2,函数返回-1。

函数的参数采用指针形式。

#include<stdio.h>
#include<string.h>
void main()
{
i nt compare(char *p1,char*p2);
i nt k;
c har s1[10],s2[10];
c har *p1,*p2;
s canf("%s%s",s1,s2);
p1=&s1[0];p2=&s2[0];
k=compare(p1,p2);
p rintf("%d\n",k);
}
int compare(char *p1,char *p2)
{
i nt k;
i f(strcmp(p1,p2)>0)k=1;
else
if(strcmp(p1,p2)<0)k=-1;
else
k=0;
r eturn(k);
}
3.用指向指针的指针的方法对5个字符串排序并输出。

提示:用二维数组存放5个字符串,设计一个指针数组或二维指针,指向该字符串数组,用strcmp()函数比较字符串的大小。

#include<stdio.h>
#include<string.h>
void main()
{ void order(char (*p)[10]);
int i;
char a[5][10],(*p)[10];
for(i=0;i<5;i++) scanf("%s",a[i]);
p=a;
order(p);
printf("排列后的顺序如下:\n");
for(i=0;i<5;i++)
printf("%s\n",a[i]);}
void order(char (*p)[10])
{ char temp[10],*t=temp;
int i,j;
for(i=0;i<4;i++)
for(j=0;j<4-i;j++)
if(strcmp(p[j],p[j+1])>0)
{ strcpy(t,p[j]);
strcpy(p[j],p[j+1]);
strcpy(p[j+1],t);
}
}
4.编写一函数,将一个含n个字符的字符串从其第m个字符开始的k个字符复制到另一字符串中。

函数的原型为copystr(char * str1, char * str2, int m, int k)。

#include<stdio.h>
#include<string.h>
#include<math.h>
void main()
{
void copystr(char *p1,char *p2,int m,int k);
int m,k;
char str1[50],str2[50];
printf("请输入一组字符串:\n");
gets(str1);
printf("请输入m和k的值:\n");
scanf("%d%d",&m,&k);
if(strlen(str1)>=k)
copystr(str1,str2,m,k);
printf("从第m位到第k位字符为:%s\n",str2);
}
void copystr(char *p1,char *p2,int m,int k)
{
int n;
n=1;
while(n<m)
{
n++;
p1++;
}
while(n>=m&&n<=k)
{
*p2=*p1;
p1++;
p2++;
n++;
}
*p2='\0';
}
暨南大学本科实验报告专用纸
实验十结构体和共用体
一、目的要求:
1.掌握结构体类型变量的定义和使用;
2.掌握结构体类型数组的概念和应用;
3.掌握链表的概念,初步学会对链表进行操作;
4.掌握公用体的概念与使用。

二、实验内容:
1.有5个学生,每个学生的数据包括学号、姓名、三门课的成绩,从键盘输入5个学生的数据,要求打印出三门课总平均成绩,以及最高分的学生的数据(包括姓名、学号、三门课的成绩、平均分数)。

要求用一个input函数输入成绩;用average函数求总平均分;用max函数找出最高分学生数据;总平均分和最高分的学生的数据在主函数中输出。

#include <stdio.h>
struct student
{ char num[10];
char name[10];
float score[3];
float ave;
}stu[5];
void main()
{ void input(struct student stu[5]);
int aver(struct student stu[5]);
int max(struct student stu[5]);
int i=0,j,k;
float ave;
input(stu);
ave=aver(stu);
k=max(stu);
printf("学号姓名课程1 课程2 课程3 平均分\n\n");
while (i<5)
{ printf("%s %s ",stu[i].num,stu[i].name);
for(j=0;j<3;j++)
printf("%5.2f ",stu[i].score[j]);
printf("%5.2f\n\n",stu[i].ave);
i=i+1;
}
printf("分数最高的学生是:%s %s\n\n",stu[k].num,stu[k].name);
printf("最高成绩为:%5.2f,%5.2f,%5.2f,%5.2f\n\n",
stu[k].score[0],stu[k].score[1],stu[k].score[2],stu[k].ave);
}
void input(struct student stu[5])
{ int i=0,j;
while(i<5)
{ printf("请输入第%d个学生学号:",i+1);
2.建立一个链表,每个结点包括:学号、姓名、性别、年龄。

输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删除。

#include <stdio.h>
struct student
{
int num;
char name[8];
char sex[4];
int age;
struct student *next;
}stu[5];
void main()
{struct student stu[5]={{001,"张三","男",21},{002,"李四
","女",19},{003,"王五","男",17},{004,"
陈六","男",18},
{005,"林七","女",20}};
int i,j,n;
struct student *p,*p1,*head,*head1;
head=stu;
printf("原来链表如下:\n\n");
for(p1=head,i=1;i<6;i++)
{ if(i<5)p1->next=stu+i;
else p1->next=NULL;
printf("%d %s %s %d\n",
p1->num,p1->name,p1->sex,p1->age);
if(i<5)p1=p1->next;
}
printf("\n请输入您要删除的成员的年龄:");
scanf("%d",&n);
p1=head;
while(p1!=NULL)
{ if (p1->age==n)
if(p1==head)
head=p1->next;
else
{ p->next=p1->next;
p1=p1->next;
}
else{p=p1;p1=p1->next;}
}
printf("\n删除后新链表如下:\n\n");
p1=head;
while(p1!=NULL)
{ printf("%d %s %s %d\n",
p1->num,p1->name,p1->sex,p1->age);
p1=p1->next;
}
}
3.已有a,b两个链表,每个链表中等结点包括学号、成绩。

要求把两个链表合并,按学号升序排列。

#include <stdio.h>
#include<malloc.h>
#define LEN sizeof(struct student)
struct student
{ int num;
int score;
struct student *next;
};
int n,sum=0;
struct student la,lb;
void main()
{ struct student *creat(void);
struct student *insert(struct student *,struct student *);
int print(struct student *);
struct student *head_a,*head_b,*head_ab;
printf("请输入第一个链表:\n\n");
head_a=creat();
sum=sum+n;
printf("请输入第二个链表:\n\n");
head_b=creat();
sum=sum+n;
head_ab=insert(head_a,head_b);
print(head_ab);
}
struct student *creat(void) //建立链表函数
{ struct student *head;
struct student *p1,*p2;
n=0;
p1=p2=(struct student *)malloc(LEN);
printf("请输入学号和成绩:\n\n");
printf("输入完毕请输入0结束!\n\n");
scanf("%d %d",&p1->num,&p1->score);
head=NULL;
while(p1->num!=0)
{ n=n+1;
if(n==1)head=p1;
else p2->next=p1;
p2=p1;
p1=(struct student*)malloc(LEN);
scanf("%d %d",&p1->num,&p1->score);
}
p2->next=NULL;
return(head);
}
struct student *insert(struct student *h_a,struct student *h_b)//合
并链表
{ struct student *pa1,*pa2,*pb1,*pb2;
pa2=pa1=h_a;
pb2=pb1=h_b;
do
{ while((pb1->num>pa1->num)&&(pa1->next!=NULL))
{ pa2=pa1;
pa1=pa1->next;
}
4.输入和运行以下程序:
#include "stdio.h"
union data
{ int i[2];
float a;
long b;
char j[4];
};
main()
{
union data u;
scanf("%d,%d",&u.i[0],&u.i[1]);
printf("%d,%d,%f,%ld,%c,%c,%c,%c",
u.i[0],u.i[1],u.a,u.b,u.j[0],u.j[1],u.j[2],u.j[3]);
}
输入两个整数10000,20000给u.i.[0]和u.i.[1]。

分析运行结果。

然后将scanf语句改为:scanf(“%ld”,&u.b);
输入60000给b。

分析运行结果。

实验十一位运算
一、实验目的:
1.掌握按位运算的概念和方法,学会使用位运算符;
2.学会通过位运算实现对某些位的操作。

二、实验内容:
编写一函数getbits,从一个16位的单元中取出某几位(即该几位保留原值,其余位为0),函数调用形式为:getbits(value,n1,n2)
value为该16位数的值,n1为欲取出的起始位,n2为欲取出的结束位。

要求把这几位数用八进制数打印出来。

实验十二文件
一、目的要求:
1.掌握文件以及缓冲文件系统、文件指针的概念;
2.学会使用文件打开、关闭、读、写等文件操作函数;
3.学会使用缓冲文件系统对文件进行简单的操作。

二、实验内容
编写程序并上机调试运行。

1.有5个学生,每个学生的数据为:学号、姓名、三门课的成绩。

计算每个学生的平均成绩,将原有数据和计算出的平均分数存放在磁盘文件“stud”中。

2.将上题“stud”文件中的学生数据,按平均分进行排序处理,将已排序的学生数据存入一个新文件“stu-sort”中。

3.将上题已排序的学生成绩文件进行插入处理。

插入一个学生的三门课成绩。

程序先计算新插入学生的平均成绩,然后将它按成绩高低顺序插入,插入后建立一个新文件。

对上题的学生原有数据为:
91101 Wang 89,98,67.5
91103 Li 60,80,90
91106 Fun 75,5,91.5,99
91110 Ling 100,50,62.5
91113 Yuan 58,68,71
要插入的学生数据为:
91108 Xin 90,95,60
暨南大学信息科学技术学院
《C语言程序设计》课程设计
实验报告
题目:学生信息管理系统
专业:信息与计算科学
班级: 2010级
学号: 2010051728 姓名:陈可敦
成绩:
指导教师:樊足志
完成日期: 2011年 11月15日
程序代码如下:
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
void look(); /*声明查看函数*/
void save(); /*声明保存函数*/
void search_name(); /*声明按姓名查看函数*/
void search_num(); /*声明按学号查看函数*/
void order(); /*声明排序函数*/
void del(); /*声明删除函数*/
int openl(); /*声明打开函数*/
void add(); /*声明输入函数*/
void reset(); /*声明信息修改函数*/
struct stu /*定义学生信息的结构体类型*/ {
char num[15];
char name[20];
char sex[4];
int age;
char dep[40];
char add[40];
int QQ;
char E_mail[20];
int chinese;
int math;
int english;
float sum;
float aver;
}stu[100];
int n; /*声明一个全局变量*/
void main() /*主函数*/
{
int i,flag=0; /*声明局部变量*/
while(1) /*循环输出以下信息*/
{
printf("☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★\n\n");
printf("★******* 欢迎使用学生信息管理系统! *******☆\n\n");
printf("☆***** ----------------------------- *****★\n\n");
printf("★******* 1、增加学生的信息 *******☆\n\n"); /*键入学生的信息*/
printf("☆******* 2、查看录入的学生信息 *******★\n\n"); /*查看录入的学生信息*/
printf("★******* 3、按姓名查看学生的信息 *******☆\n\n"); /*按姓名查看学生的信息*/
printf("☆******* 4、按学号查看学生的信息 *******★\n\n"); /*按学号查看学生的信息*/
printf("★******* 5、按总分排列输出学生信息*******☆\n\n"); /*按总分排序输出学生的信息*/ printf("☆******* 6、删除学生信息 *******★\n\n"); /*删除学生信息*/
printf("★******* 7、保存学生信息 *******☆\n\n"); /*保存*/
printf("☆******* 8、修改学生信息 *******★\n\n"); /*修改某一学生的信息*/
printf("★******* 0、退出 *******☆\n\n"); /*退出*/
printf("☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★\n\n");
printf("请输入你所要进入的系统编号:");
scanf("%d",&i);
switch(i)
{
case 1:add();break; /*调用信息输入函数请按1*/
case 2:look();break; /*调用查看函数请按2*/
case 3:search_name();break; /*调用通过姓名查看函数请按3*/
case 4:search_num();break; /*调用通过学号查看函数请按4*/
case 5:order();break; /*调用排序查看函数请按5*/
case 6:del();break; /*调用删除函数请按6*/
case 7:save();break; /*调用保存函数请按7*/
case 8:reset();break; /*调用信息修改函数请按8*/
case 0:flag=1;break; /*退出SWITCH语句请按0*/
default :printf("输入错误!");
}
if(flag) break; /*退出循环请按0*/
}
}
int openl() /*定义打开文件函数*/
{
system("CLS");
int i;
FILE *fp;
if((fp=fopen("stu.txt","rb"))==NULL)
{
printf("Cannot open file.\n");
exit(0);
}
for(i=0;!feof(fp);i++)
fread(&stu[i],sizeof(struct stu),1,fp);
fclose(fp);
return(i-1);
}
void save() /*建立保存文件函数*/
{
system("CLS");
FILE *fp; /*定义文件型指针*/
int i;
if((fp=fopen("stu.txt","wb"))==NULL) /*打开输出文件*/
{
printf("文件打开错误!\n");
return; /*终止程序*/
}
for(i=0;i<n;i++) /*向stu文件中写入信息*/ if(fwrite(&stu[i],sizeof(struct stu),1,fp)!=1)
printf("对不起,您的输入有误!\n");
fclose(fp); /*关闭文件*/
printf("\n恭喜您,信息保存成功!\n");
printf("\n请按任意键返回菜单\n!");
getch();
}
void see() /*打开并查看文件*/
{
system("CLS");
int i;
n=openl();
printf("恭喜您,文件打开成功!\n");
printf("请按任意键查看信息!\n");
getch();
printf("学号姓名性别年龄学院籍贯 QQ号码 E_mail 语文成绩数学成绩英语成绩总成绩平均成绩\n");
for(i=0;i<n;i++) /*输出所有的学生信息*/
{
printf("%10s %s %2s %d %s %s %d %s %d %d %d %5.2f %5.2f\n",stu[i].num,stu[i].
name,
stu[i].sex,stu[i].age,stu[i].dep,stu[i].add,stu[i].QQ,stu[i].E_mail,stu[i].chinese,stu[i].m ath,
stu[i].english,stu[i].sum,stu[i].aver);
}
printf("\n请按任意键返回菜单!");
getch();
}
void add() /*定义信息增加函数*/
{
system("CLS");
int i;
printf("你想输入信息的学生个数为:");
scanf("%d",&n);
for(i=0;i<n;i++) /*输入每个学生的信息*/
{
printf("\n请输入学号:");
scanf("%s",&stu[i].num);
printf("\n请输入姓名:");
scanf("%s",&stu[i].name);
printf("\n请输入性别:");
scanf("%s",&stu[i].sex);
printf("\n请输入年龄:");
scanf("%d",&stu[i].age);
printf("\n请输入学院:");
scanf("%s",&stu[i].dep);
printf("\n请输入籍贯:");
scanf("%s",&stu[i].add);
printf("\n请输入QQ号码:");
scanf("%d",&stu[i].QQ);
printf("\n请输入E_mail:");
scanf("%s",&stu[i].E_mail);
printf("\n请输入语文成绩:");
scanf("%d",&stu[i].chinese);
printf("\n请输入数学成绩:");
scanf("%d",&stu[i].math);
printf("\n请输入英语成绩:");
scanf("%d",&stu[i].english);
stu[i].aver=((float)stu[i].english+(float)stu[i].math+(float)stu[i].chinese)/3;
/*计算平均成绩*/ stu[i].sum=(float)stu[i].english+(float)stu[i].math+(float)stu[i].chinese;
/*计算总成绩*/ printf("\n平均成绩=%4.1f\n",stu[i].aver);
/*输出平均成绩*/ printf("\n总成绩=%4.1f\n",stu[i].sum);
/*输出总成绩*/ if (n>1)printf("\n请输入下一个学生信息!\n");
}
printf("\n输入成功,请按任意键返回菜单!\n");
getch();
save();
}
void look() /*定义查看函数*/
{
system("CLS");
int i;
//n=openl(); /*调用openl函数*/
printf("学号姓名性别年龄学院籍贯 QQ号码 E_mail 语文成绩数学成绩
英语成绩总成绩平均成绩\n");
for(i=0;i<n;i++) /*输出所有的学生的信息*/
{
printf("%10s %s %2s %d %s %s %d %s %d %d %d %5.2f %5.2f\n",stu[i].num,
stu[i].name, stu[i].sex,stu[i].age,stu[i].dep,stu[i].add,stu[i].QQ,
stu[i].E_mail,stu[i].chinese,stu[i].math,stu[i].english,stu[i].sum,
stu[i].aver);
}
printf("\n请按任意键返回菜单!\n");
getch();
}
void search_name() /*按姓名查看函数*/
{
system("CLS");
int i;
char name[10]; /*声明字符数组*/
printf("请输入您要查询的学生姓名:\n");
scanf("%s",name);
printf("学号姓名性别年龄学院籍贯 QQ号码 E_mail 语文成绩数学成绩英语成绩总成绩平均成绩\n");
for(i=0;i<n;i++)
if(strcmp(stu[i].name,name)==0) /*将输入的姓名与结构体中的姓名进行比较*/
{
printf("%10s %s %2s %d %s %s %d %s %d %d %d %5.2f %5.2f\n",stu[i].num,
stu[i].name,stu[i].sex,stu[i].age,stu[i].dep,stu[i].add,stu[i].QQ,
stu[i].E_mail,stu[i].chinese,stu[i].math,stu[i].english,stu[i].sum,
stu[i].aver);
printf("\n请按任意键返回菜单!\n");
}
getch();
}
void search_num() /*定义按学号查看函数*/
{
system("CLS");
int i;
char num[4]; /*声明字符数组*/
printf("请输入您要查询的4位学生学号:\n");
scanf("%s",num);
printf("学号姓名性别年龄学院籍贯 QQ号码 E_mail 语文成绩数学成绩英语成绩总成绩平均成绩\n");
for(i=0;i<n;i++)
if(strcmp(stu[i].num,num)==0) /*将输入的学号与结构体中的学号进行比较*/ printf("%10s %s %2s %d %s %s %d %s %d %d %d %5.2f %5.2f\n",stu[i].num,
stu[i].name,stu[i].sex,stu[i].age,stu[i].dep,stu[i].add,stu[i].QQ,
stu[i].E_mail,stu[i].chinese,stu[i].math,stu[i].english,stu[i].sum,
stu[i].aver);
printf("\n请按任意键返回菜单!\n");
getch();。

相关文档
最新文档