《C语言程序设计实验》实验报告.docx
《《C语言程序设计实验》实验报告.docx》由会员分享,可在线阅读,更多相关《《C语言程序设计实验》实验报告.docx(47页珍藏版)》请在冰点文库上搜索。
《C语言程序设计实验》实验报告
《C语言程序设计实验》实验报告
指导老师:
专业:
班级:
学号:
姓名:
日期:
2011-05-29
重庆邮电大学计算机科学与技术学院
实验一
实验名称:
一维数组程序设计
实验目的:
1、熟练掌握使用一维数组编程的方法。
2、熟练掌握排序算法。
实验内容:
1、调试示例
输入一个整数n(0源程序:
略
调试好的程序:
#include
intmain()
{
inti,j,n,x,a[10];
printf("输入数据的个数n:
");
scanf("%d",&n);
printf("输入%d个整数:
",n);
for(i=0;iscanf("%d",&a[i]);
printf("输入要插入的整数:
");
scanf("%d",&x);
for(i=0;i{
if(x>a[i])continue;
j=n-1;
while(j>=i){
a[j+1]=a[j];
j--;
}
a[i]=x;
break;
}
if(i==n)a[n]=x;
for(i=0;i<=n;i++)
printf("%d\t",a[i]);
return0;
}
2、编程题1
输入一个正整数n(0程序代码:
#include
intmain()
{
inti,n,sum=0,a[10];
floatav;
printf("输入数据的个数n:
");
scanf("%d",&n);
printf("输入%d个整数:
",n);
for(i=0;iscanf("%d",&a[i]);
for(i=0;i{
sum+=a[i];
}
av=(float)sum/n;
printf("%0.2f\t",av);
return0;
}
3、编程题2
输入一个正整数n(0程序代码
#include
intmain()
{
inti,n,a[10];
printf("输入数据的个数n:
");
scanf("%d",&n);
printf("输入%d个整数:
",n);
for(i=0;iscanf("%d",&a[i]);
for(i=n-1;i>=0;i--)
printf("%d\t",a[i]);
return0;
}
4、编程题3
输入一个正整数n(0程序代码:
#include
intmain()
{
inti,j,n,x,a[10];
printf("输入数据的个数n:
");
scanf("%d",&n);
printf("输入%d个整数:
",n);
for(i=0;iscanf("%d",&a[i]);
x=a[0];
for(i=0;i{
if(a[i]>x){x=a[i];j=i;}
}
printf("最大数:
%d\t下标:
%d\t",x,j);
return0;
}
5、编程题4
输入一个正整数n(0程序代码:
#include
intmain()
{
inti,n,j=0,k=0,x,y,a[10];
printf("输入数据的个数n:
");
scanf("%d",&n);
printf("输入%d个整数:
",n);
for(i=0;iscanf("%d",&a[i]);
y=a[0];
x=a[0];
for(i=0;i{
if(a[i]>x){x=a[i];j=i;}
if(a[i]}
a[j]=a[0];
a[0]=y;
a[k]=a[i-1];
a[i-1]=x;
for(i=0;iprintf("%d\t",a[i]);
return0;
}
6、编程题5
输入一个正整数n(0程序代码:
#include
intmain()
{
inti,n,j=0,x,a[10];
printf("输入数据的个数n:
");
scanf("%d",&n);
printf("输入%d个整数:
",n);
for(i=0;iscanf("%d",&a[i]);
x=a[0];
for(i=0;i{
for(j=i;j{
if(a[i]>a[j+1])
{
x=a[i];a[i]=a[j+1];a[j+1]=x;
}
elsecontinue;
}
}
for(i=0;iprintf("%d\t",a[i]);
return0;
}
实验总结:
本次C语言上机实验,主要是对一维整数数组进行处理,通过本次实验,我熟练掌握了一维数组元素的处理组排序算法(冒泡排序法和选择排序法)。
实验二
实验名称:
字符串程序设计
【实验1】判断回文
从键盘输入一串字符,判断该字符串是否是回文,即该字符串从左向右读,与从右向左读都一样,如“ABCBA”、“ABCCBA”。
编程思路:
定义指针start和end,分别指向字符串首、尾。
分别从串首、尾开始向中间比较,若指针所指字符不同,则不是回文。
源程序:
#include
#include
intis(char*ptr);
voidmain()
{
charstr[100];
printf("inputastring\n");
gets(str);
if(is(str))
{printf("%sisaPalindrome\n",str);}
else
{printf("%sisanotpalindrome\n",str);}
}
intis(char*ptr)
{
inti,a,flag=0;
a=(int)strlen(ptr)-1;//数组下标从0开始!
for(i=0;a>=0;i++,a--)
{
if(ptr[a]==ptr[i])
flag=1;
else
{
flag=0;
break;
}
}
returnflag;
}
【实验2】删除排序
已知某已排好序的数组,其元素为{1,3,5,7,9},从键盘输入x的值,若数组中存在与x相等的元素,则删除。
编程思路:
搜索整个数组判断x是否存在于数组中;如果在,定位待删除元素的下标;从该下标开始,将所有后续元素往前移。
注意移动顺序应从最后一个元素开始,还是先从待删除元素的位置开始!
源程序:
#include
#include
int*Delete(inta[],intn,intx)
{
inti,pos,k;
for(i=0;i{
if(a[i]==x)
{pos=i;
break;
}
}
for(k=pos;ka[k]=a[k+1];
returna;
}
intmain()
{
intarr[5]={1,3,5,7,9},x,i;
printf("inputx=");
scanf("%d",&x);
printf("beforedelete");
for(i=0;i<5;i++)
printf("%4d",arr[i]);
printf("\n");
Delete(arr,5,x);
printf("afterdelete");
for(i=0;i<4;i++)
printf("%4d",arr[i]);
printf("\n");
return0;
}
实验总结:
通过这次实验,了解了字符串的特点,它在数组中有结束标志“\0”,而其长度又不将起算在内,牢记这点对编程速率很有帮助。
实验三
实验名称:
指针和二维数组
【实验1】对N个字符串进行排序
编程思路:
第一种实现方式:
要求从键盘输入N个字符串,将其存储在二维数组中,在主函数中进行排序。
第二种实现方式:
要求定义指针数组指向N个字符串,调用函数sort()进行排序。
sort()具有如下原型:
/*
函数返回值:
多级指针类型char**,返回指针数组首地址
形式参数:
指针p,char*,用于操纵N个字符串
line,int,表示字符串个数
*/
char**sort(char*p[],intlinel)
源程序:
#include
#include
#defineN5
intmain()
{
/*定义二维数组*/
inti,k,j;
chara[N][30],temp[20];
/*从键盘输入N个字符串*/
printf("从键盘输入%d个字符串\n",N);
for(i=0;igets(a[i]);
for(i=0;i{
k=i;
/*若当前字符串大于str[k],记录其下标*/
for(j=i+1;j{
if(strcmp(a[k],a[j])<0)//a[i]改为a[k]
k=j;
}
if(k!
=i)
{
/*交换字符串str[k]和str[i]*/
strcpy(temp,a[i]);strcpy(a[i],a[k]);strcpy(a[k],temp);
}
}
puts("\nAftersort:
");
for(i=0;iputs(a[i]);
return0;
}
【实验2】找众数
定义函数实现:
(1)输出整数数组中重复出现的数和重复的次数。
(2)找出整数数组中的众数(即出现次数最多的数)
并编写相应的主函数测试之。
编程思路:
先对数组排序,排序后数组内的元素如有相同值就会紧邻存储。
定义maxCount、maxI、seek,分别表示最多重复次数、最多重复次数对应的元素下标、当前正在查找的数值,将两数置0。
从头扫描整个数组,统计每个元素出现的次数,如果出现次数大于maxCount,记录其出现次数和该元素对应下标。
扫描完毕即可找到众数及其出现次数。
源程序:
#include
#include
#defineN6
intmain()
{
inta[N];
inti,j,k,temp;
intmaxCount=0,maxI=0,seek=0,count=0;
for(i=0;i{
printf("请输入第%d个数:
",i+1);
scanf("%d",a+i);
}
/*选择法对数组排序*/
for(i=0;i{
k=i;
for(j=i;jif(a[k]>a[j])//a[i]改为a[k]
k=j;
if(i!
=k)
{temp=a[i];a[i]=a[k];a[k]=temp;}
}
for(i=0,seek=a[0];i<=N;i++)
{
if(seek==a[i])
{
/*计数器加1*/
count++;
}
else
{
/*输出前一元素的值和出现次数*/
printf("Number=%d,Count=%d\n",a[i-1],count);
/*如果前一元素的出现次数比maxCount大,则修改maxCount和maxI*/
if(count>maxCount)
{
maxCount=count;
maxI=i-1;
}
count=0;
count++;
seek=a[i];
}
}
printf("\nmaxNumber=%d,maxCount=%d\n",a[maxI],maxCount);
return0;
}
实验总结:
本次实验运用了选择法对数组进行排序,不管是二维数组,还是一维数组,其思路是一样的,只是具体的实现有所不同,比如比较字符串要用函数strcmp()。
实验四
实验名称:
结构体
【实验1】计算椭圆面积
已知坐标系统中两点p1、p2构成的矩形是椭圆的外切矩形,如图3-1所示。
定义结构体
structellipse
{
structpoint
{
intx;
inty;
}p1,p2;
doublea;
doubleb;
};
从键盘输入p1、p2的坐标值,计算椭圆面积,已知积计算公式为:
S=Πab。
程序代码:
#include
#include
structellipse
{
structpoint
{
intx;
inty;
}p1,p2;
doublea;
doubleb;
};
typedefstructellipseell;
intmain()
{
elle;
doubles;
printf("请输入左上角顶点坐标:
");
/*输入坐标*/
scanf("%d%d",&e.p1.x,&e.p1.y);
printf("请输入右下角顶点坐标:
");
/*输入坐标*/
scanf("%d%d",&e.p2.x,&e.p2.y);
/*计算椭圆面积*/
e.a=abs((e.p1.y-e.p2.y))/2.0;//取整函数abs()
e.b=abs((e.p1.x-e.p2.x))/2.0;
s=3.14*e.a*e.b;
printf("area=%lf\n",s);
return0;
}
实验总结:
这次实验用到了结构体的嵌套定义,通过实验,让我更深入了解结构体的定义,使用,访问等操作。
实验五
实验名称:
指针强化1
【实验1】字符串逆序存储
编写一个函数inverse,实现将字符串逆序存放,即原字符串为“abcdef”,将其重新存储为“fedcba”。
实验思路:
从字符串中第一个字符开始,使其和最后一个字符交换,第二个字符和倒数第二个字符交换,……,一直到字符串中间的字符为止。
程序代码:
#include
#include
char*inverse(char*p)
{
/*定义需要用到的变量*/
inti,len;
chartmp;
len=strlen(p);
/*将原字符串逆序存储于p所指数组中*/
for(i=len-1;i>=len/2;i--)
{
tmp=*(p+i);*(p+i)=*(p+len-1-i);*(p+len-1-i)=tmp;
}
returnp;
}
intmain()
{
charstr[100];
printf("请输入字符串:
");
gets(str);
puts(inverse(str));
return0;
}
【实验2】字符串逆序存储
删除字符串s中所有出现的与变量c相同的字符。
程序代码:
#include
#include
char*squeez(char*s,charc)
{
inti,j;
for(i=j=0;i{
if(s[i]!
=c)
{
s[j]=s[i];//___请填空___
j++;
}
}
s[j]='\0';
returns;
}
intmain()
{
chars[100],c;
printf("请输入字符串:
");
gets(s);
printf("请输入变量:
");
c=getchar();
puts(squeez(s,c));
return0;
}
实验总结:
这次与前面的某次实验的内容差不多,用到了知识点是指针,字符串。
实验六
实验名称:
指针强化2
【实验1】实现库函数atoi
已知C标准库函数atoi实现将字符串转换为整数的功能,如:
charstr[]="123456";
printf("对应的整数为:
%d\n",atoi(str));
自定义函数:
intatoi(char*str),使其实现同名标准库函数的功能。
实验思路:
先考虑最简单的情况,字符串中只有数字,如果是负数,字符串第一个元素是负号。
定义变量sign,若字符串中第一个元素是'﹣',则sign值为-1,并让字符串指针指向下一元素。
指针指向字符串“-123456”的第一个数字字符'1',将其转换为对应数字1,放入变量t中,指针下移至后一元素'2',再将其转换为对应数字2,将t中1变成10,再加2,如此循环,至字符串结束。
返回变量t*sign即可。
程序代码:
#include
#include
intatoi(char*str);
intmain()
{
charstr[100];
printf("请输入字符串:
");
gets(str);//此处不能否替换成scanf()!
printf("对应的整数为:
%d\n",atoi(str));
return0;
}
intatoi(char*str)
{
inti=0,a,s=0,sign=0,p=1;
for(i=0;*(str+i)!
='\0'&&p;i++)
{
if(*(str+i)=='-'&&(*(str+i+1)>=48&&*(str+i+1)<=57||i==0))
sign=-1;
if(*(str+i)>=48&&*(str+i)<=57)
{
a=*(str+i)-48;
s=s*10+a;
if(*(str+i+1)<=48&&*(str+i+1)>=57&&p)
p=0;
}
}
if(sign)
s*=sign;
returns;
}
【实验2】译码
编写change函数实现:
将大于0小于1000的阿拉伯数字转换为罗马数字输出。
阿拉伯数字和罗马数字对应关系如下:
并编写相应的主函数测试该函数。
实验思路:
先考虑最简单的情况,字符串中只有数字,如果是负数,字符串第一个元素是负号。
定义变量sign,若字符串中第一个元素是'﹣',则sign值为-1,并让字符串指针指向下一元素。
指针指向字符串“-123456”的第一个数字字符'1',将其转换为对应数字1,放入变量t中,指针下移至后一元素'2',再将其转换为对应数字2,将t中1变成10,再加2,如此循环,至字符串结束。
返回变量t*sign即可。
程序代码:
#include
/*定义数据结构code存储罗马字符*/
typedefstruct
{
chars[3];//别忘了'\0'
inta;
}COD;
intchange(COD*code,intnum);
intmain()
{
CODcode[13]={{"M",1000},{"CM",900},{"D",500},{"CD",400},{"C",100},{"XC",90},{"L",50},{"XL",40},{"X",10},{"IX",9},{"V",5},{"IV",4},{"I",1}};
intx;
printf("请输入一个阿拉伯数字:
");
scanf("%d",&x);
if(x>0&&x<4000)
change(code,x);
else
printf("输入的阿拉伯数字超出范围!
!
!
\n");
return0;
}
intchange(COD*code,intnum)
{
inti,a,last=0;
while(num)
{
a=num/(*(code+last)).a;
if(a<=0)last++;
else
{
for(i=0;iprintf("%s",(*(code+last)).s);
num%=(*(code+last)).a;//有点类似进制型问题
}
}
putchar(10);
return0;
}
实验总结:
这次实验译码实验给我的印象比较深,开始在算法上有点纠结,后来想到了以上程序中的算法,其实是个逐减和取余的问题,另外还用到了结构体,指针等知识,综合性还是比较大的。
但算法是面向过程程序设计的灵魂,想到算法就好办了。
实验七
实验名称:
模拟1
简单题:
计算卡片的最大数量
将一摞卡片按照图1所示叠放,使其中一部分悬于桌外(卡片数量为n,每张卡片长度为1)。
当n=1时,仅有一张卡片,其最大可悬空长度为1/2;当n=2时,置于底部的那张卡片其悬空长度是1/3,而置于顶部的卡片其悬空长度是1/2,故悬于桌外的总长度是1/2+1/3=5/6。
可以推断,当有n张卡片时,悬空部分的总长度是:
1/2+1/3+1/4+...+1/(n+1)。
从键盘输入一个最大悬空长度值,判断该长度下最多能叠放几张卡片。
图1卡片最大可悬空长度示意图
程序代码:
#i