C语言程序设计实验课习题报告代码
2016-11-23 21:47
796 查看
实验题目1:已知摄氏温度( ℃ )与华氏温度( F )的转换关系式是:。编写一个摄氏温度与华氏温度的转换程序, 输入摄氏温度( C ), 输出华氏温度( F )。
唯一要注意的就是不要忘记整型数之间的除法得到的结果还是整型数,故作除法之前要先作类型转换。
实验题目2:编写程序,打印如图形式的数字金字塔。
[b]实验题目3:编程序,输入m、n的值,计算并输出:m!/(n!*(m-n)!)
[/b]
由于要多次用到计算阶乘的代码片段,故将其抽取成一个函数,要注意输入不一定都符合阶乘计算的要求。
实验题目4:编一个函数,把给定一维数组的诸元素循环右移 j 位。
这是一个比较有意思的题目,可以用纯模拟的方法,用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:使用指针编写程序,求字符串长度。
字符串中'\0'位置的地址减去首地址即为字符串的长度。
#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/C++实现Socket聊天程序(代码+实验报告)
- 异质树的实现——代码+实验报告
- 多项式相加实验代码和报告
- java实验三 实验报告代码
- 使用C/C++实现Socket聊天程序(代码+实验报告)
- Java 2实用教程(第三版)实验指导与习题解答and实验模版代码及答案(一)
- 第六周实验报告(任务二)【补充代码】
- “Linux内核分析”实验报告(一)分析汇编代码理解计算机是如何工作的
- CRC校验实现-实验报告(附主要实现代码)
- 用多线程实现“生产者-消费者问题”(代码+实验报告)
- 《C++第六周实验报告2-1》----按要求将缺少的代码填进去
- Java 2实用教程(第三版)实验指导与习题解答and实验模版代码及答案 (三)
- 行人统计 —— AdaBoost头部分类器的训练 实验报告 代码 样本
- 第六周实验报告 任务2程序填空:按要求将缺少的代码填进去
- c语言程序设计第三次上机实验报告
- 异质树的实现——代码+实验报告
- 最优化方法的实验报告程序代码
- c语言程序设计第三次上机实验报告
- Java 2实用教程(第三版)实验指导与习题解答and实验模版代码及答案 (二)