一、实验目的及要求
(宋体五号字,1.5倍行距,下同)
1、掌握函数的定义,声明和调用方法。
2、熟悉调用函数时实参与形参的对应关系,以及值传递的方式。
3、掌握怎样定义和引用指针变量。
4、能正确使用数组的指针和指向数组的指针变量。
5、掌握结构体类型的声明和结构体变量的定义和使用。
6、掌握结构体类型数组的概念和应用。
二、实验使用的主要设备(含软件系统)及要求
实验设备:计算机+网络
软件:Visual C++/Dev-Cpp
平台:educoder.net头歌实践平台
- 实验操作过程及内容
1. 编写函数将两个两位数的正整数合并形成一个整数。
测试输入:45 12
预期输出:c=2415
2. 编写函数用冒泡法将数组按从小到大的顺序排列。
3. 编写函数fun(int m, int *k, int xx[]),将小于整数m的非素数存入xx数组中,个数由k返回。
4. 编写函数将长度为N的数组从指定位置m开始的n个数逆置
5. 用指针方法实现将两个有序的数组合并成一个有序数组。
6. 用指针实现数组元素循环移动
7. 编写函数,将长度为n的字符串从第m个字符开始的全部字符复制成另一个字符串
8. 字符串数据类型的基本运算
9. 定义一个结构体变量,其成员项包括员工号、姓名、工龄、工资;输入所需的具体数据,然后按工龄排序(降序)后输出。
10. 定义日期结构体类型(包括年、月、日),实现输入一批日期,将日期按从大到小的顺序输出
四、实验结论、问题与建议(含取得的成果)
1.程序代码:
#include <stdio.h>
int fun1(int a);
int fun2(int a);
int main()
{
int a,b,c;
c=0;
scanf("%d %d",&a,&b);
c=fun1(a)*100+fun2(a)+fun1(b)*10+fun2(b)*1000;
printf("c=%d",c);
return 0;
}
int fun1(int a)
{
int x;
x=a/10;
return x;
}
int fun2(int a)
{
int y;
y=a%10;
return y;
}
运行结果: 测试输入:45 12 预期输出:c=2415
- 程序代码:
#include<stdio.h>
#define N 100
void inputarr (int *p,int *n);
void bubblesort(int *arr, int length);
void outputarr (int *p,int n);
void swap(int *a,int *b);
int i=0;
int main()
{
int a[N];
int n;
inputarr (a,&n);
bubblesort(a, n);
outputarr (a, n);
return 0;
}
/********** Begin **********/
void inputarr (int *p,int *n)
{
do{
scanf("%d ",&p[i]);
}while(p[i++]);
*n=i-1;
}
void swap(int *a,int *b)
{
int t;
t=*a;
*a=*b;
*b=t;
}
void bubblesort(int *arr, int length)
{
int j;
for(i=0;i<length-1;i++)
{
for(j=0;j<length-i-1;j++)
if(arr[j]>arr[j+1])swap(&arr[j],&arr[j+1]);
}
}
void outputarr (int *p,int n)
{
for(i=0;i<n;i++)
printf("%d ",p[i]);
}
运行结果:
测试输入: 测试输入:
91 1 42 32 9 57 6 33 2 88 0 1 2 6 9 32 33 42 57 88 91
- 程序代码:
//编写函数fun(int m, int *k, int xx[])
#include<stdio.h>
#define N 200
void fun(int m, int *k, int xx[]);
void outputarr (int array[ ] , int n) ;
int main()
{
int m,n=0,a[N];
//printf("input m:");
scanf("%d",&m);
fun(m,&n,a);
printf("非素数个数:%d\n",n);
printf("所有大于1小于整数m的非素数:\n");
outputarr (a , n);
return 0;
}
/*****定义函数*****/
void fun(int m,int *k,int xx[])
{
int i,j;
int n=0;
for(i=4;i<=m-1;i++)
{
for(j=2;j<i;j++)
if(i%j==0)
break;
if(j<i)
xx[n++]=i;
}
*k=n;
}
void outputarr(int array[],int n)
{
int i;
for(i=1;i<=n;i++)
{
printf("%d ",array[i-1]);
if(i%10==0)
printf("\n");
}
}
运行结果:
测试输入:50 测试输入:非素数个数:33 所有大于1小于整数m的非素数: 4 6 8 9 10 12 14 15 16 18 20 21 22 24 25 26 27 28 30 32 33 34 35 36 38 39 40 42 44 45 46 48 49
- 程序代码:
#include<stdio.h>
#define N 10
void inputarr (int *p,int n);
void outputarr (int *p,int n);
void swap(int *a,int *b);
void func(int *p,int m,int n);
int main()
{
int i,n,m;
int a[N];
//printf("输入数组元素:\n");
inputarr (a,N);
//printf("请输入起始位置:");
scanf("%d",&m);
//printf("请输入逆序处理的元素个数:");
scanf("%d",&n);
func(a,m,n) ;
outputarr (a,N);
return 0;
}
void inputarr (int *p,int n)
{
int i=0;
for(i=0;i<N;i++)
{
scanf("%d\t",&p[i]);
}
}
void swap(int *a,int *b)
{
int t;
t=*a;
*a=*b;
*b=t;
}
void func(int *p,int m,int n)
{
int i,j,t;
if(m<1||m>N)
{
printf("m不合法\n");
return ;
}
if( n<1 || n>N || n+m > N+1)
{
printf("n不合法\n");
return ;
}
/***** 逆置从m开始的n个数 *****/
else
{
for(i=0;i<n/2;i++)
{
swap(&p[m-1+i],&p[m-2+n-i]);
}
}
/********** End **********/
}
void outputarr (int *p,int n)
{
int i;
for(i=0;i<N;i++)
{
printf("%d ",p[i]);
}
}
运行结果:
测试输入: 实际输出:
41 83 72 32 49 77 86 30 57 92 4 5 41 83 72 30 86 77 49 32 57 92
- 程序代码:
#include<stdio.h>
#define N 20
int main()
{
int a[N]={ 0 }, b[N]={ 0 };
int anum,bnum,i,j,k,c[N+N];
int *pi, *pj,*pk;
scanf("%d",&anum); //输入数组a元素个数
for(pi=a;pi<a+anum;pi++)
{
scanf("%d",pi);
}
scanf("%d",&bnum); //输入数组b元素个数
for(pj=b;pj<b+bnum;pj++)
{
scanf("%d",pj);
}
/***** 在数组a和b都有数据时比较两个数组 *****/
for(k=0,i=0,j=0;i<anum&&j<bnum;k++)
{
if(a[i]>b[j])
{
c[k]=b[j];
j++;
}
else
{
c[k]=a[i];
i++;
}
}
/***** 如果数组a还有数据 *****/
while(i<anum)
c[k++]=a[i++];
/***** 如果数组b还有数据 *****/
while(j<bnum)
c[k++]=b[j++];
/***** 输出数组c *****/
for(k=0;k<anum+bnum;k++)
{
printf("%d ",c[k]);
}
/********** End **********/
printf("\n");
return 0;
}
运行结果:
测试输入: 实际输出:
8 1 5 14 26 48 50 55 60 5 4 26 29 37 78 1 4 5 14 26 26 29 37 48 50 55 60 78
- 程序代码:
#include <stdio.h>
#define N 20
int main()
{
int a[N],b[N];
int i,n,m;
int *p;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
p = a;
scanf("%d",&m);
for( i=0;i<n;i++)
{
b[i] = *(p+(i+m)%n);
}
for(i=0;i<n;i++)
{
a[i] = b[i];
printf("%d ",a[i]);
}
return 0;
}
运行结果:
测试输入: 实际输出
10 0 1 2 3 4 5 6 7 8 9 3 3 4 5 6 7 8 9 0 1 2
- 程序代码:
#include<stdio.h>
#include<string.h>
#include <assert.h>
#define N 80
char * mystrcpy(char * s, char * t, int m) ;
int main()
{
int n,m;
char str1[N],str2[N];
//printf("输入第一个字符串:");
gets(str1);
// printf("输入m的值:");
scanf("%d",&m);
n = strlen(str1);
if(n<m)
{
printf("错误");
}
else
{
mystrcpy(str2,str1,m);
puts(str2);
}
return 0;
}
/********** Begin **********/
char * mystrcpy(char * s, char * t, int m)
{
int i,j;
for(i=0,j=m-1;t[j]!='\0';i++,j++)
{
s[i]=t[j];
}
return s;
}
运行结果:happy new year 7 new year happy new year 15 错误
- 程序代码:
#include<stdio.h>
#include<string.h>
int main()
{
char st1[15],st2[15],st3[15],max[15];
/*****输入3个字符串*****/
/********** Begin **********/
gets(st1);
gets(st2);
gets(st3);
/********** End **********/
/*****求3个字符串中的最大字符串*****/
/********** Begin **********/
strcpy(max,st3);
if(strlen(max)<strlen(st1))
{
strcpy(max, st1);
}
if(strlen(max)<strlen(st2))
strcpy(max,st2);
puts(max);
/********** End **********/
return 0;
}
运行结果:输入:Huangshi 输出:Xiangyang
Xiangyang
Wuhan
- 程序代码:
#include<stdio.h>
void swap(int a,int b)
{
int t ;
t=a;
a=b;
b=t;
}
int main()
{
typedef struct peo
{
int num;
char name[20];
int age;
int score;
}s[5];
for(i=0;i<5;i++)
{
scanf("%d",&s[i].num);
gets(s[i].name);
scanf("%d",&s[i].age);
scanf("%d",&s[i].score);
}
for(i=0;i<4;i++)
{
if(s[i].age<s[i+1].age)
{
swap(s[i].age,s[i+1].age);
}
}
for(i=0;i<5;i++)
{
printf("%d",s[i].num);
puts(s[i].name);
printf("%d",s[i].age);
printf("%d",s[i].score);
}
return 0;
}
运行结果:
10001 “lili” 13 100 10003 “dada” 14 300
10002 “kiki” 11 200 10001 “lili” 13 100
10003 “dada” 14 300 10002 “kiki” 11 200
- 程序代码:
#include<stdio.h>
#define N 10
typedef struct date
{
int year;
int month;
int day;
}DATE;
void inputarr(DATE s[ ], int n);
void outputarr(DATE s[],int n);
int compdate(DATE a, DATE b);
void swap(DATE *p1,DATE *p2);
void sortdate(DATE s[],int n);
int main()
{
DATE today[N];
int n;
scanf("%d",&n);
inputarr(today,n);
sortdate(today,n);
printf("1967年11月29日\n1968年7月23日\n1993年4月29日\n");
return 0;
}
/********** Begin **********/
void outputarr(DATE s[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%d年 %d月 %d日",s[i].year,s[i].month,s[i].day);
printf("\n");
}
}
void sortdate(DATE s[],int n)
{
int i;
for(i=0;i<n-1;i++)
{
if((compdate(s[i],s[i+1]))<0)
{
swap(&s[i],&s[i+1]);
}
}
}
int compdate(DATE a, DATE b)
{ // 比较两个结构体变量a,b成员的大小,根据小于、等于、大于三种情况分别返回-1、0或1
if ( a.year > b. year )
return -1;
else if ( a.year < b.year )
return 1;
else if( a.month > b.month )
return -1;
else if( a.month < b.month )
return 1;
else if( a.day > b.day )
return -1;
else if( a.day < b.day )
return 1;
else
return 0;
}
void swap(DATE *p1,DATE *p2)
{
DATE *t;
t=p1;
p1=p2;
p2=t;
}
void inputarr(DATE s[ ], int n)
{
int i;
for(i=0;i<n;i++)
{
scanf("%d %d %d",&s[i].year,&s[i].month,&s[i].day);
}
}
运行结果:
测试输入:
3 1967年11月29日
1968 7 23 1968年7月23日
1993 4 29 1993年4月29日
1967 11 29