您的位置:首页 > 编程语言 > C语言/C++

C语言程序设计实验课习题报告代码

2016-11-23 21:47 796 查看
实验题目1:已知摄氏温度( ℃ )与华氏温度( F )的转换关系式是:。编写一个摄氏温度与华氏温度的转换程序, 输入摄氏温度( C ), 输出华氏温度( F )。

#include <stdio.h>

int main()
{
double c,f;
scanf("%lf",&c);
f = 9*c/5.0+32;
printf("%.2f",f);
return 0;
}


唯一要注意的就是不要忘记整型数之间的除法得到的结果还是整型数,故作除法之前要先作类型转换。

实验题目2:编写程序,打印如图形式的数字金字塔。



#include <stdio.h>

int main()
{
int i,j,num;
const int first = 1;
for (i=1;i<=10;i++) {
printf("%*d ",(11-i)*2,first);
for (j=2;j<=i-1;j++) {
printf("%d ",j%10);
}
for (j=i;j>=2;j--) {
printf("%d ",j%10);
}
if (i != 1) {
printf("1\n");
} else {
printf("\n");
}
}
return 0;
}
用到了一个printf函数中的一个小技巧,通过*标识符可以把变量用于格式控制,从而避免了使用循环语句输出空格的不美观的代码。

[b]实验题目3编程序,输入m、n的值,计算并输出:m!/(n!*(m-n)!)
[/b]



#include <stdio.h>

int Fact(int n)
{
int i,sum=1;
for (i = 2;i <= n; i ++) {
sum *= i;
}
return sum;
}

int main()
{
int m,n,i,d1=1;
scanf("%d%d",&m,&n);
if (m<0 || n<0 || m-n<0) {
printf("ERROR!\n");
return -1;
}
double ret = 1.0*Fact(m)/Fact(n)/Fact(m-n);
printf("%.2f\n",ret);
return 0;
}


由于要多次用到计算阶乘的代码片段,故将其抽取成一个函数,要注意输入不一定都符合阶乘计算的要求。





实验题目4编一个函数,把给定一维数组的诸元素循环右移 j 位。

#include <stdio.h>
#define MAX 1000

typedef struct{
int n,tag;
int arr[MAX+1];
}  CQueue;

void Trans(CQueue* p,int m)
{
int trans = m;
m = m%p->n;
while (trans --) {
p->arr[p->tag] = p->arr[(p->tag+p->n)%(p->n+1)];
p->tag = (p->tag+p->n)%(p->n+1);
}
}

int main()
{
printf("请输入需要右移的元素个数以及右移位数:\n");
int n,i,m;
CQueue a={0,0};
scanf("%d%d",&a.n,&m);
if (a.n>1000) {
printf("Error!");
return -1;
}
printf("请输入%d个元素:\n",a.n);
for (i=1;i<a.n+1;i++) {
scanf("%d",&a.arr[i]);
}
Trans(&a,m);
for (i=(a.tag+1)%(a.n+1);i!=a.tag;i=(i+1)%(a.n+1)) {
printf("%d",a.arr[i]);
}
return 0;
}

这是一个比较有意思的题目,可以用纯模拟的方法,用j次循环一次一次的循环移动,但这样做的时间复杂度太高,显然不合算。而另外定义一个与输入数组等大的数组通过公式计算移动之后的下标需要使用额外的空间,若要求在原数组上改变的话还需要在拷贝一遍。于是考虑到了使用循环数组。

将一维数组想象成一个首尾相接的环,一开始从数组下表为1的单元开始存储元素,一直存储到n为止。讲下标为0的单元置空,并用tag标记它的下标。规定tag的前一单元为队列头,tag的后一单元为队列尾。每进行一次右移,就是让队列头部的元素先出队再入队,同时使tag重新标记数组中为空的数组单元,使tag的前一位仍为队列头,后一位仍为队列尾。



但是在使用一位数组存储的过程中下标是线性的,所以在使用下标寻找tag标记位置的前驱和后继不能简单的使用tag+1和tag-1,tag为0时,队列头的下标是n,tag为n时,队列尾的下表是0.所以tag标记位置的前驱的下标应该是(tag+n)%(n+1),后继是(tag+1)%(n+1)。

打印时从队列的尾部开始一直到队列的头部。

把存储队列的数组,队列元素个数,和tag标记集中到一个结构体中,调用函数时只需要传入结构体指针和右移位数m即可。

实验题目5:使用指针编写程序,求字符串长度。

#include <stdio.h>

int length(char* s) ;

int main()
{
char s[1001];
printf("请输入一个字符串:\n");
scanf("%s",s);
int len = length(s);
printf("字符串长度是%d",len);
return 0;
}

int length(char* s)
{
char *ps = s;
while (*ps++) ;
return ps-1-s;
}


字符串中'\0'位置的地址减去首地址即为字符串的长度。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 循环队列