实验11 指针综合实验
任务 使用指针编写综合应用程序
1.某班有M个学生,开设三门课程(高数、英语、计算机)的成绩,编程输入学生的学号及三门课程的成绩,求各人的平均分,并显示。
参考程序如下:
#include "stdio.h"
#define M 5
struct student
{
int num;
int score[3];
float average;
}stu[M];
main( )
{
struct student *p;
for(p=stu;p<stu+M;p++)
{
scanf("%d %d %d %d",&(p->num),&(p->score[0]),&(p->score[1]),&(p->score[2]));
p->average=(p->score[0]+p->score[1]+p->score[2])/3.0;
}
printf("平均分为:\n\n");
for(p=stu;p<stu+M;p++)
{ printf("%5d%5d%5d%5d%7.2f\n",p->num,p->score[0],p->score[1],p->score[2],p->average);
}
}
2.编写一函数,求一个字符串的长度。在main( )函数中输入字符串,并输出其长度。
参考程序如下:
#include <stdio.h>
#include <string.h>
int len(char *s)
{
int k=0;
for(;*s!='\0';s++)
k++;
return k;
}
main( )
{
char str1[80],*p=str1;
scanf("%s",str1);
printf("\nlength of the string is:%d",len(str1));
}
3.从键盘输入一行文字,找出其中大写字母、小字字母、数字及其他字符各有多少?
参考程序如下:
#include <stdio.h>
main( )
{
int i,j,k,m;
char *p,a[100];
p=a;
i=j=k=m=0;
scanf("%s",p);
for(;*p!='\0';p++)
{
if(*p>=97&&*p<=122 ) i++;
else if(*p>=65&&*p<=90) j++;
else if(*p>=48&&*p<57) k++;
else m++;
}
printf("Lower case char:%d,Up case cahr:%d,number char:%d,other char:%d",i,j,k,m);
}
4.利用指针编写程序,实现对数组进行从小到大的排序(冒泡法)。
参考程序如下:
#include<stdio.h>
main( )
{
int a[10];
int *p,t,k,i,j;
p=a;
for(i=0;i<10;i++)
{ scanf("%d",p);p++; }
p=a;
for(i=0;i<9;i++)
{ k=i;
for(j=i+1;j<10;j++)
if(p[k]>p[j])k=j;
if(k!=i)
{ t=p[k];p[k]=p[i];p[i]=t;}
}
for(i=0;i<10;i++)
printf("%5d",p[i]);
}
5.100人围成一圈,从第1个人开始,每数到3的人出圈,问最后一个出圈的人是哪个?
参考程序如下:
#include <stdio.h>
void main( )
{
int a[100],i,n,k,*p;
p=a;
for(i=0;i<100;i++)
*(p+i)=i+1;
n=100;
i=k=0;
while(n>1)
{
if(*(p+i)!=0) k++;
if(k==3) {*(p+i)=0;k=0;n--;}
i++;
if(i==100) i=0;
}
while(*p==0) p++;
printf("the last is %d\n",*p);
}
实验12 结构体、共用体与枚举
任务1 结构体、共用体与枚举构造数据类型的定义与使用
1.运行下面程序,熟悉结构体变量及指向结构体变量指针的使用。
#include<stdio.h>
void main( )
{
struct xs
{ int num;
char name[20];
float score;
}stu1={001,"Zhang san",90.5};
struct xs stu2,*p;
stu2=stu1;
printf("%d %s %f\n",stu2.num,stu2.name,stu2.score);
p=&stu2;
printf("%d %s %f\n",p->num,p->name,p->score);
}
运行结果为:
1 Zhang san 90.500000
1 Zhang san 90.500000
2.运行下面程序,并分析指向结构体数组的指针变量的使用,理解指针与结构体数组的关系及结构体成员的引用方式。
#include<stdio.h>
struct xs
{ int num;
char name[20];
char sex;
int age;
}stu[3]={{10101,"Li Lin",'M',18},
{10102,"Zhang Fun",'M',19},
{10104,"Wang Min",'F',20}};
main( )
{
struct xs *p;
for(p=stu;p<stu+3;p++)
printf("%d %s %c %d\n",p->num,p->name,p->sex,p->age);
}
运行结果为:
10101 Li Lin M 18
10102 Zhang Fun M 19
10104 Wang Min F 20
思考:printf("%d%s%c%d\n",p->num,p->name,p->sex,p->age);如用结构体数组元素的方式表示,该引用方式如何表示?
代码修改如下:
#include<stdio.h>
struct xs
{ int num;
char name[20];
char sex;
int age;
}stu[3]={{10101,"Li Lin",'M',18},
{10102,"Zhang Fun",'M',19},
{10104,"Wang Min",'F',20}};
main( )
{
struct xs *p;
int i;
for(i=0;i<3;i++)
printf("%d %s %c %d\n",stu[i].num,stu[i].name,stu[i].sex,stu[i].age);
}
3.以下程序通过定义学生结构体数组,存储了若干名学生的学号、姓名和3门课的成绩。函数fun( )的功能是将存放学生数据的结构体数组,按照姓名的字典序(从小到大)排序。
请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结果。
#include <stdio.h>
#include <string.h>
struct student {
long sno;
char name[10];
float score[3];
};
void fun(struct student a[], int n)
{
/**********found**********/
struct student t;
int i, j;
/**********found**********/
for (i=0; i< n-1 ; i++)
for (j=i+1; j<n; j++)
/**********found**********/
if (strcmp(a[i].name,a[j].name) > 0)
{ t = a[i]; a[i] = a[j]; a[j] = t; }
}
void main( )
{ struct student s[4]={{10001,"ZhangSan", 95, 80, 88},{10002,"LiSi", 85, 70, 78},{10003,"CaoKai", 75, 60, 88}, {10004,"FangFang", 90, 82, 87}};
int i, j;
printf("\n\nThe original data :\n\n");
for (j=0; j<4; j++)
{ printf("\nNo: %ld Name: %-8s Scores: ",s[j].sno, s[j].name);
for (i=0; i<3; i++) printf("%6.2f ", s[j].score[i]);
printf("\n");
}
fun(s, 4);
printf("\n\nThe data after sorting :\n\n");
for (j=0; j<4; j++)
{ printf("\nNo: %ld Name: %-8s Scores: ",s[j].sno, s[j].name);
for (i=0; i<3; i++) printf("%6.2f ", s[j].score[i]);
printf("\n");
}
}
4.下面程序通过对学生学号、姓名、出生年月信息的输入与输出,分析并理解指向结构体类型变量的正确使用方法,以及结构体嵌套定义。
#include <stdio.h>
#include <stdlib.h> /*使用malloc( )需要包括该头文件*/
struct data/*定义结构体*/
{
int day,month,year;
};
struct stu/*定义结构体*/
{
char name[20];
long num;
struct data birth; /*嵌套的结构体类型成员*/
} ;
void main( ) /*定义main( ) 函数*/
{
struct stu *xs; /*定义结构体类型指针*/
xs=(struct stu *)malloc(sizeof(struct stu)); /*为指针变量分配安全的地址*/
printf("Input name,number,year,month,day:\n");
scanf("%s",xs->name); /*输入学生姓名、学号、出生年月日*/
scanf("%ld", &xs->num);
scanf("%d %d %d", &xs->birth.year,&xs->birth.month,&xs->birth.day);
printf("\nOutput name,number,year,month,day\n" );/*打印输出各成员项的值*/
printf("%s%ld %5d// %d// %d\n",xs->name,xs->num,xs->birth.year,
xs->birth.month,xs->birth.day);
}
运行结果如下:
Input name,number,year,month,day:
HanTingyu 22 1985 11 1
HanTingyu22 1985//11//1(书上多空了很多的空格)
5.验证下面程序,熟悉共用体变量的使用。
#include <stdio.h>
union ab{
int a;
char b[2];
};
void main( )
{
union ab t;
t.a=0x1234;
printf("t.a=%x\nt.b[1]=%x\nt.b[0]=%x\n",t.a,t.b[1],t.b[0]);
}
程序输出结果如下:
t.a=1234
t.b[1]=12
t.b[0]=34
任务2 链表的定义与使用
给定程序中,函数fun( )的功能是将带头节点的单向链表结点数据域中的数据从小到大排序。即若原链表结点数据域从头至尾的数据为10、4、2、8、6,排序后链表结点数据域从头至尾的数据为2、4、6、8、10。
请在程序的下划线处填入正确的内容并将下划线删除, 使程序得出正确的结果。
#include <stdio.h>
#include <stdlib.h>
#define N 6
typedef struct node {
int data;
struct node *next;
} NODE;
void fun(NODE *h)
{ NODE *p, *q; int t;
/**********found**********/
p = h->next ;
while (p) {
/**********found**********/
q = p->next ;
while (q) {
/**********found**********/
if (p->data > q->data)
{ t = p->data; p->data = q->data; q->data = t; }
q = q->next;
}
p = p->next;
}
}
NODE *creatlist(int a[])
{ NODE *h,*p,*q; int i;
h = (NODE *)malloc(sizeof(NODE));
h->next = NULL;
for(i=0; i<N; i++)
{ q=(NODE *)malloc(sizeof(NODE));
q->data=a[i];
q->next = NULL;
if (h->next == NULL) h->next = p = q;
else { p->next = q; p = q; }
}
return h;
}
void outlist(NODE *h)
{ NODE *p;
p = h->next;
if (p==NULL) printf("The list is NULL!\n");
else
{ printf("\nHead ");
do
{ printf("->%d", p->data); p=p->next; }
while(p!=NULL);
printf("->End\n");
}
}
main( )
{ NODE *head;
int a[N]= {0, 10, 4, 2, 8, 6 };
head=creatlist(a);
printf("\nThe original list:\n");
outlist(head);
fun(head);
printf("\nThe list after sorting :\n");
outlist(head);
}