山东大学计算机导论与程序设计基础实验1-4
山东大学程序设计基础,计算机导论与程序设计OJ实验。标准数学函数使用标准输入输出及数字的机内表示今有物不知其数喝不完的啤酒输出乘法口诀表圆周率的近似值简单矩阵运算简单背包问题
A : 实验1.1 标准数学函数使用
实验要求
1.在你所创建的工程文件中,编程熟悉C程序的基本框架,以及C语言提供的标准数学函数,并按一定的格式输出程序的执行结果;
- Tips:我该怎么输出我的结果?
- 在写完程序主题之后,使用printf()函数或cout来输出题目要求的结果。
- 注意:
- 不要在输出的结果中添加任何多余的文字,否则oj会判错!
例如:printf(“结果是%d”,outcome)是错误的! - 和浮点数(当前学习阶段可简单理解为小数)相关的题目,请使用printf()输出,使用cout会导致结果位数错误。
2.在你所创建的工程文件中,编程计算下述题目,并输出结果。
y = 1 + 1 1 + 1 1 + 1 5 y=1+\frac{1}{1+\frac{1}{1+\frac{1}{5}}} y=1+1+1+5111
- 不要在输出的结果中添加任何多余的文字,否则oj会判错!
- Tips:我该如何完成题目?
- 请在自己的开发环境中完成代码编写、测试,再将代码复制到提交框中进行提交。
3.示例:
- 请在自己的开发环境中完成代码编写、测试,再将代码复制到提交框中进行提交。
- 题目要求:请在你所创建的工程文件中,编程计算1除以2的结果并输出。
- 代码示例:
#include <stdio.h>
int main()
{
float outcome; // 声明变量,存储结果
outcome = 1.0 / 2; // 进行计算
printf("%f", outcome); // 输出结果,不要添加任何无意义的输出
}
完整答案代码
#include<stdio.h>
int main()
{
double a;
a=1+1/(1+1/(1+1/5.0));
printf("%f",a);
return 0;
}
B : 实验1.2 标准数学函数使用
实验要求
1、下载安装Dev-Cpp(Dev-C++)集成开发环境(IDE);或使用其他C语言开发环境;
2、在IDE中创建自己所需的工程文件;
3、在你所创建的工程文件中,编程熟悉C程序的基本框架,以及C语言提供的标准数学函数,并按一定的格式输出程序的执行结果;
4、在你所创建的工程文件中,编程计算下述题目,并输出结果,注意输出应为浮点数类型。
y = 3 2 + 4 2 y=\sqrt{3^2+4^2} y=32+42
完整答案代码
#include<stdio.h>
#include<math.h>
int main()
{
double a;
a=sqrt(pow(3,2)+pow(4,2));
printf("%f",a);
return 0;
}
C : 实验1.3 标准数学函数使用
实验要求
1、下载安装Dev-Cpp(Dev-C++)集成开发环境(IDE);或使用其他C语言开发环境;
2、在IDE中创建自己所需的工程文件;
3、在你所创建的工程文件中,编程熟悉C程序的基本框架,以及C语言提供的标准数学函数,并按一定的格式输出程序的执行结果;
4、在你所创建的工程文件中,编程计算下述题目,并输出结果。
y = 1 − c o s ( π / 3 ) 2 y=\sqrt{\frac{1-cos(\pi/3)}{2}} y=21−cos(π/3)
y = s i n 2 ( π / 4 ) + s i n ( π / 4 ) c o s ( π / 4 ) − c o s 2 ( π / 4 ) y=sin^2(\pi/4)+sin(\pi/4)cos(\pi/4)-cos^2(\pi/4) y=sin2(π/4)+sin(π/4)cos(π/4)−cos2(π/4)
输出格式:结果之间以换行符分隔,结果共2行
- Tips:输出多个结果请使用换行符(回车,‘\n’)分隔,不要使用空格进行分隔。
- π \pi π取值为3.1415926
完整答案代码
#include<stdio.h>
#include<math.h>
int main()
{
double a,b;
a=sqrt((1-cos(3.1415926/3))/2);
b=pow(sin(3.1415926/4),2)+sin(3.1415926/4)*cos(3.1415926/4)-pow(cos(3.1415926/4),2);
printf("%f\n",a);
printf("%f\n",b);
return 0;
}
D : 实验1.4 标准数学函数使用
实验要求
1、下载安装Dev-Cpp(Dev-C++)集成开发环境(IDE);或使用其他C语言开发环境;
2、在IDE中创建自己所需的工程文件;
3、在你所创建的工程文件中,编程熟悉C程序的基本框架,以及C语言提供的标准数学函数,并按一定的格式输出程序的执行结果;
4、在你所创建的工程文件中,编程计算下述题目,并输出结果。
y = 2 5 ( 6 + 3 ) 6 + 3 y=\frac{2\sqrt{5}(\sqrt{6}+\sqrt{3})}{6+3} y=6+325(6+3)
y = ln ( 5 ( ln 3 ) ) − ln ( 2 ) s i n ( π / 3 ) y=\frac{\ln(5(\ln3))-\ln(2)}{sin(\pi/3)} y=sin(π/3)ln(5(ln3))−ln(2)
y = e 3 + log 10 105 y=e^3+\log_{10}{105} y=e3+log10105
输出格式:结果之间以换行符进行分隔,结果共3行
- Tips: π \pi π取值为3.1415926, e e e的取值建议直接使用exp函数
完整答案代码
#include<stdio.h>
#include<math.h>
int main()
{
double a,b,c;
a=(2*sqrt(5)*(sqrt(6)+sqrt(3)))/(6+3);
b=(log(5*log(3))-log(2))/sin(3.1415926/3);
c=exp(3)+log10(105);
printf("%f\n",a);
printf("%f\n",b);
printf("%f\n",c);
return 0;
}
E : 实验1.5 标准数学函数使用
实验要求
1、下载安装Dev-Cpp(Dev-C++)集成开发环境(IDE);或使用其他C语言开发环境;
2、在IDE中创建自己所需的工程文件;
3、在你所创建的工程文件中,编程熟悉C程序的基本框架,以及C语言提供的标准数学函数,并按一定的格式输出程序的执行结果;
4、在你所创建的工程文件中,编程计算下述题目,并输出结果。
y = 3 / 4 + ( 103 除以 3 的余数 ) y=3/4+(103除以3的余数) y=3/4+(103除以3的余数)
y = 不大于 3.8 的最大整数 y=不大于3.8的最大整数 y=不大于3.8的最大整数
y = 不大于 − 3.8 的最大整数 y=不大于-3.8的最大整数 y=不大于−3.8的最大整数
y = 不小于 3.2 的最小整数 y=不小于3.2的最小整数 y=不小于3.2的最小整数
y
=
不小于
−
3.2
的最小整数
y=不小于-3.2的最小整数
y=不小于−3.2的最小整数
输出格式:结果之间以换行符进行分隔,结果共5行,输出均为浮点数类型
完整答案代码
#include<stdio.h>
#include<math.h>
int main()
{
double a,b,c,d,e;
a=3/4.0+103%3;
b=floor(3.8);
c=floor(-3.8);
d=ceil(3.2);
e=ceil(-3.2);
printf("%f\n",a);
printf("%f\n",b);
printf("%f\n",c);
printf("%f\n",d);
printf("%f\n",e);
return 0;
}
F : 实验2 标准输入输出及数字的机内表示 1
题目描述
- 使用C语言的标准输入函数scanf(),分别读取short, int, long, long long,unsigned int类型的几个数据
- 然后利用printf()输出:
将读取的short型数据输出为十进制数,
将读取的int型数据输出为无符号数,
将读取的long型数据输出为八进制数,
将读取的long long型数据输出为十六进制数,
将读取的unsigned int型数据输出为十六进制数. - 注意:输出不需要添加
l
或ll
修饰符。 - 根据输入、输出结果理解C语言整型符号数输入输出的形式,以及数据的机内存储格式;
输入格式
五个整数
输出格式
题目中对应的格式,用换行符分隔数字,十六进制中字母为大写。
完整答案代码
#include<stdio.h>
int main()
{
short a;
int b;
long c;
long long d;
unsigned int e;
scanf("%d%d%d%d%d",&a,&b,&c,&d,&e);
printf("%d\n",a);
printf("%u\n",b);
printf("%o\n",c);
printf("%X\n",d);
printf("%X\n",e);
return 0;
}
G : 实验2 标准输入输出及数字的机内表示 2
题目描述
- 分别用scanf()读取float, double类型的几个数据。
- 然后利用printf()分别输出读取的float,double类型数据的一般实数形式,指数形式。
- 根据输入、输出结果理解C语言浮点数输入输出的格式,以及数据的机内存储形式。
注意事项
因为编译器的区别,所以可能会有同学在自己电脑上测试结果和示例不同,但是不会影响对代码正确性的评测。
输入格式
两个浮点数,一个可以用float存储,一个可以用double存储。
输出格式
第一个浮点数的一般形式和指数形式。
第二个浮点数的一般形式和指数形式。
#include<stdio.h>
int main()
{
float a;
double b;
scanf("%f%lf",&a,&b);
printf("%f %e\n",a,a);
printf("%f %e\n",b,b);
return 0;
}
H : 实验2 标准输入输出及数字的机内表示 3
题目描述
- 用scanf()输入字符型数据。
- 然后利用printf()输出(字符,十进制、十六进制等)。
- 根据输入、输出结果理解C语言字符输入输出的格式,以及数据的机内存储形式,理解系统对非数值型数据的编码原理,如字符的ASCII码。
输入格式
一个字符
输出格式
题目中对应的输出格式
完整答案代码
#include<stdio.h>
int main()
{
char a;
scanf("%c",&a);
printf("%c %d %X",a,a,a);
return 0;
}
I : 实验3 今有物不知其数
题目描述
今有物,不知其数。三三数之,剩X;五五数之,剩Y;七七数之,剩Z。问:物几何?
输入
三个整数 X, Y, Z
输出
一个正整数,代表物的数量(根据题意,如有多个解则输出多个解中的最小值即可)
Hint
考点:
- 标准输入/输出
- 基本运算(取模运算、布尔运算)
- 循环语句
- 条件语句
- 枚举
完整答案代码
#include<stdio.h>
int main()
{
int a,X,Y,Z;
scanf("%d%d%d",&X,&Y,&Z);
for(a=1;;a++)
{
if(a%3==X&&a%5==Y&&a%7==Z)
{
printf("%d",a);
break;
}
}
return 0;
}
J : 实验3 喝不完的啤酒
题目描述
- 啤酒2元1瓶,2个空瓶换1瓶,4个瓶盖换1瓶,问N元钱最多可以喝几瓶,并且瓶子、瓶盖、钱分别剩余多少?(不允许赊账)
输入格式
一个整数N,为钱数
输出格式
四个整数M,X,Y,Z;M为喝的总瓶数,X为剩余瓶子数,Y为剩余瓶盖数,Z为剩余钱数。
完整代码
#include<stdio.h>
int main()
{
int n,t;
scanf("%d",&n);
int ping,kong,gai,sum;
sum=n/2;
int m=n/2;
int l=n/2;
kong=m;
gai=l;
if(n%2==0){
t=0;
}else{
t=1;
}
while(kong>=2||gai>=4){
kong=m;
gai=l;
ping=kong/2+gai/4;
m=ping+m%2;
l=ping+l%4;
sum=sum+ping;
}
printf("%d %d %d %d",sum,kong,gai,t);
return 0;
}
K : 实验3 输出乘法口诀表
题目描述
- 输出乘法口诀表,格式如下:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
…
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 … 9*9=81
- 要求:
- 使用循环结构;
- 位置对齐可在printf中使用”\t”;
输入格式
一个整数N,N<=10
输出格式
对应行数的乘法口诀表
完整答案代码
#include<stdio.h>
int main()
{
int n,i,j;
scanf("%d",&n);
for(i=1;i<=n;i++){
for(j=1;j<=i;j++){
printf("%d*%d=%d\t",j,i,i*j);
if(j==i){
printf("\n");
}
}
}
return 0;
}
L : 实验3 圆周率的近似值
题目描述
- 按要求计算圆周率的近似值;
π = 4 ( 1 − 1 3 + 1 5 − 1 7 + 1 9 − 1 11 + ⋯ ) π = 4(1 - \frac{1}{3} + \frac{1}{5} - \frac{1}{7} + \frac{1}{9} - \frac{1}{11} + \cdots) π=4(1−31+51−71+91−111+⋯)
- 系统会给出一个整数n(n<9),当某一项的绝对值小于等于 1 0 − n 10^{-n} 10−n时,忽略掉当前项以及以后的项。
- 提示:为提高程序的执行效率,不要使用 ( − 1 ) 2 n (-1)^{2n} (−1)2n=1这种方法(n为自然数);可以考虑:一个数n,连续乘以-1,n的符号会正负相间;
测试用例
- 当最后一项的绝对值小于等于时 1 0 − 6 10^{-6} 10−6,π=3.141591,大约循环50万次;(有的环境输出π=3.14159)
- 当最后一项的绝对值小于等于时 1 0 − 7 10^{-7} 10−7,忽略掉以后的项,则π=3.141592,大约循环500万次;
- 当最后一项的绝对值小于等于时 1 0 − 8 10^{-8} 10−8,忽略掉以后的项,则π=3.141593,大约循环5000万次;
输入格式
一个整数
输出格式
一个浮点数
输出格式
一个浮点数
完整答案代码
#include<stdio.h>
#include<math.h>
int main()
{
double pi,fm,sign;
sign=1.0;
fm=1.0;
int n;
scanf("%d",&n);
while(fabs(sign/fm)>pow(10,-n))
{
pi+=sign/fm;
sign=-sign;
fm+=2;
}
printf("%f",pi*4);
return 0;
}
M : 实验4 简单矩阵运算
题目描述
编程实现3*3矩阵A、B的加法、减法、乘法及A的转置运算并输出。
- 其中矩阵A、B将由系统给出。
- 数字位置对齐可在printf中使用”\t”。
- 输出的每个矩阵间用"\n"分隔。
输入格式
十八个整数,为两个3*3的矩阵中的元素
输出格式
输出对应操作后的矩阵
完整代码答案
#include<stdio.h>
int main()
{
int a[3][3];
int b[3][3];
int jia[3][3];
int jian[3][3];
int cheng[3][3];
int zhuan[3][3];
int i,j,m;
for(i=0;i<3;i++){
for(j=0;j<3;j++){
cheng[i][j]=0;
}
}
for(i=0;i<3;i++){
for(j=0;j<3;j++){
scanf("%d",&a[i][j]);
}
}
for(i=0;i<3;i++){
for(j=0;j<3;j++){
scanf("%d",&b[i][j]);
}
}
for(i=0;i<3;i++){
for(j=0;j<3;j++){
jia[i][j]=(a[i][j]+b[i][j]);
}
}
for(i=0;i<3;i++){
for(j=0;j<3;j++){
jian[i][j]=(a[i][j]-b[i][j]);
}
}
for(i=0;i<3;i++){
for(j=0;j<3;j++){
for( m=0;m<3;m++){
cheng[i][j]=cheng[i][j]+(a[i][m]*b[m][j]);
}
}
}
for(i=0;i<3;i++){
for(j=0;j<3;j++){
zhuan[i][j]=a[j][i];
}
}
for(i=0;i<3;i++){
for(j=0;j<3;j++){
printf("%d\t",jia[i][j]);
}
printf("\n");
}
printf("\n");
for(i=0;i<3;i++){
for(j=0;j<3;j++){
printf("%d\t",jian[i][j]);
}
printf("\n");
}
printf("\n");
for(i=0;i<3;i++){
for(j=0;j<3;j++){
printf("%d\t",cheng[i][j]);
}
printf("\n");
}
printf("\n");
for(i=0;i<3;i++){
for(j=0;j<3;j++){
printf("%d\t",zhuan[i][j]);
}
printf("\n");
}
return 0;
}
N : 实验4 简单背包问题
实验要求
给定n种物品和一背包。物品i的重量(体积)是wi,其价值为vi,背包的容量为C。问:应如何选择装入背包的物品,使得装入背包中物品的总价值最大。
- 形式化描述
给定 C > 0 , w i > 0 , v i > 0 , 1 ≤ i ≤ n C>0,w_i>0,v_i>0,1\le i\le n C>0,wi>0,vi>0,1≤i≤n,要求找一 n n n 元向量 X = ( x 1 , x 2 , … , x n ) , x i ∈ { 0 , 1 } X=(x_1, x_2, \dots,x_n),x_i\in\{0, 1\} X=(x1,x2,…,xn),xi∈{0,1},
即:max ∑ i = 1 n v i x i s.t { ∑ i = 1 n w i x i ≤ C x i ∈ { 0 , 1 } , 1 ≤ i ≤ n \begin{array}{l} \max \sum_{i=1}^{n} v_{i} x_{i} \\ \text { s.t }\left\{\begin{array}{c} \sum_{i=1}^{n} w_{i} x_{i} \leq C \\ x_{i} \in\{0,1\}, 1 \leq i \leq n \end{array}\right. \end{array} max∑i=1nvixi s.t {∑i=1nwixi≤Cxi∈{0,1},1≤i≤n
-
请分别利用枚举法(穷举法)解决上述问题。
-
枚举法(穷举法)肯定能找到最优解。
-
要求:
- 系统给出的第一个数字是背包容量,第二个数字是物品件数,然后分别给出每件物品的重量,再分别给出每件物品的价值。
- 请依次输出装入背包的物品序号,总重量,总价值。
-
提示:
变量定义:
设 w = ( w 1 , w 2 , … , w n ) w=(w_1,w_2,\dots,w_n) w=(w1,w2,…,wn) 表示 n n n 种物品的重量, v = ( v 1 , v 2 , … , v n ) v=(v_1,v_2,\dots,v_n) v=(v1,v2,…,vn) 表示 n n n 种物品的价值;
X = ( x 1 , x 2 , … , x n ) , x i ∈ { 0 , 1 } X=(x_1, x_2, \dots,x_n),x_i\in\{0, 1\} X=(x1,x2,…,xn),xi∈{0,1}表示问题的最优解,若 x i = 1 x_i=1 xi=1,表示将第 i i i 种物品装入背包,最优解对应的背包重量为 Weight,价值为Value;初始化 Weight=0, Value=0;
C表示背包的容量(所能容纳的重量);
Y = ( y 1 , y 2 , … , y n ) , y i ∈ { 0 , 1 } Y=(y_1, y_2, \dots,y_n),y_i\in\{0, 1\} Y=(y1,y2,…,yn),yi∈{0,1}表示目前n种物品的一种装法(解法),按该装法,背包中物品的重量为CurWeight ,背包中物品的价值为CurValue ;
算法描述(伪代码):
for (i=0 to 2 n − 1 2^n-1 2n−1) {
将 i 对应的二进制数按位存放到数组Y中;
尝试按照装包方案y进行装包,则背包中物品的重量为CurWeight, 价值为CurValue;
如果CurWeight>C,则丢弃该方案,继续尝试下一种方案;否则,若该方案优于以前的方案,即如果CurValue>Value,则暂存该方案:即X=Y,Value=CurValue, Weight= CurWeight。 继续循环;
}
输出最优解X和对应的物品的相关信息, 背包中物品的价值Value,背包中物品的重量Weight;
- 测试用例:
- 背包容量 C = 150 C=150 C=150, 7 7 7 种物品,其重量 W = ( 10 , 40 , 30 , 50 , 35 , 40 , 30 ) W=(10,40,30,50,35,40,30) W=(10,40,30,50,35,40,30),价值 V = ( 35 , 30 , 6 , 50 , 40 , 10 , 25 ) V=(35,30,6,50,40,10,25) V=(35,30,6,50,40,10,25) (W与V均为整数)
- 枚举法得到的最优解:装入物品 1 , 2 , 4 , 5 1,2,4,5 1,2,4,5,背包重量 135 135 135,最大价值 155 155 155;
数据范围
C < 1000 , n < 20 C \lt 1000,n \lt20 C<1000,n<20
完整答案代码
#include<stdio.h>
int main()
{
int n,c,i,j;
scanf("%d%d",&c,&n);
int w[n];
int v[n];
int f[c+1];
int g[n][c+1];
for(i=0;i<n;i++){
for(j=0;j<=c;j++){
g[i][j]=0;
}
}
for(i=0;i<=c;i++){
f[i]=0;
}
for(i=0;i<n;i++){
scanf("%d",&w[i]);
}
for(i=0;i<n;i++){
scanf("%d",&v[i]);
}
for(i=n-1;i>=0;i--){
for(j=c;j>=w[i];j--){
if(f[j]<f[j-w[i]]+v[i]){
f[j]=f[j-w[i]]+v[i];
g[i][j]=1;
}else{
g[i][j]=0;
}
}
}
int t=c;
for(i=0;i<n;i++){
if(g[i][t]==1){
printf("%d ",i+1);
t-=w[i];
}
}
printf("%d %d",c-t,f[c]);
return 0;
}
如能打赏,不甚感激[叩谢]。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)