秉着方便后来人的理念,刁肥宅已经将程序设计的所有实验上传到CSDN资源、豆丁文库与百度文库了,但是在CSDN上下载所有资源都至少需要1个积分,百度狗逼总会暗地里把刁肥宅设置的“免积分”改为2到8个积分,其中几个我昨天晚上都已经修改了,唯独8个积分的那个文档一直改不掉——百度真恶心!豆丁也是亦步亦趋。因此,刁肥宅索性花点时间将所有程序设计的作业与实验贴在此处,以供参考!参考的朋友请注意了,有一些题目刁肥宅已明显发现那么写是错的,但由于懒的原因有一些没有修正,大家自己注意哈。另外,每一届的作业内容多少都会有些不同,这一点万请注意~~~
这些内容都很简单,但对于好学的初学者来说,刁肥宅愿意热情地为你们解答疑惑,欢迎直接联系刁肥宅Email:[email protected]!
作业1
2.21 设计一个程序,从键盘输入一个小写字母,将它转换成大写字母。
#include <stdio.h>
int main()
{
int c,ans;
scanf("%c",&c);
ans=c-32;
printf("%c",ans);
return 0;
}
2.22 设计一个程序,从键盘输入一个圆的半径,求其周长和面积。
#include <stdio.h>
#define PI 3.14
int main()
{
double r;
scanf("%lf",&r);
printf("%lf\n%lf\n",2*PI*r,PI*r*r);
return 0;
}
作业2
3.7 编写一个程序,测试十进制、八进制、十六进制格式整数值的输入,并分别按照3种不同的基数输出,测试数据为10、010、0x10。
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("%d %o %x\n",10,10,10);
printf("%d %o %x\n",010,010,010);
printf("%d %o %x\n",0x10,0x10,0x10);
return 0;
}
3.8 编写一个程序,分别用不同的域宽打印出整数12345和浮点数1.2345。当域宽小于数值的实际需要的域宽时,会发生什么情况?
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("%1d\n%2d\n%3d\n%4d\n%5d\n%9d\n",12345,12345,12345,12345,12345,12345);
printf("%.1f\n%.2f\n%.3f\n%.4f\n%.5f\n%.9f\n",1.2345,1.2345,1.2345,1.2345,1.2345,1.2345);
return 0;
}
3.11 设计一个程序,判断从键盘输入的整数的正负性和奇偶性。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a,b;
scanf("%d%d",&a,&b);
if(a>0)
{
if(a%2==0)
printf("a(%d) is a positive even number\n",a);
else
printf("a(%d) is a positive odd number\n",a);
}
else if(a<0)
printf("a(%d) is a negative number\n",a);
else
printf("a(%d) = 0(even)\n",a);
if(b>0)
{
if(b%2==0)
printf("b(%d) is a positive even number\n",b);
else
printf("b(%d) is a positive odd number\n",b);
}
else if(b<0)
printf("b(%d) is a negative number\n",b);
else
printf("b(%d) = 0(even)\n",b);
//if(
return 0;
}
3.12 编写一个程序,记录5个班的学生成绩,每个班有10个学生。要求用cin函数输入数据,然后按行列格式打印该表。
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <iomanip>
using namespace std;
int main()
{
int s[5][10];
memset(s,0,sizeof(s));
//srand(time(NULL));
for(int i=0;i<5;i++)
for(int j=0;j<10;j++)
//s[i][j]=(rand()%((100-0+1)+0));
cin>>s[i][j];
for(int i=0;i<5;i++)
{
cout<<"Class "<<i+1<<":";
for(int j=0;j<10;j++)
cout<<setw(4)<<s[i][j];
//cout<<s[i][j]<<' ';
cout<<endl;
}
return 0;
}
3.13 假定你是一大学教师,需要给出10个学生的平均分数。编写一个程序,提示输入10个不同的成绩,然后将平均值显示在屏幕上。
#include <iostream>
using namespace std;
int main()
{
int s[10+1];
float ans=0.0;
for(int i=0;i<10;i++)
cin>>s[i];
for(int i=0;i<10;i++)
ans+=s[i];
cout<<ans/10<<endl;
return 0;
}
3.14 编写一个测试儿童算术的程序。要求输入两个数,然后算出第一个数加第二个数的和,当他准备好后(在告诉他怎么样做以后等着他按Enter键)打印结果,以便他核对答案。
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
double a,b,in,sum;
printf("请输入两个数,用于做加法:\n");
scanf("%lf %lf",&a,&b);
sum=a+b;
printf("请输入你的运算结果:\n");
scanf("%lf",&in);
printf("正确答案是:%lf\n",sum);
if(sum==in)
printf("恭喜你!结果正确!\n");
else
printf("很遗憾!结果错误!\n");
return 0;
}
3.16 从键盘输入一个3位数abc,从左到右用a、b、c表示各位的数字,现要求依次输出从右到左的各位数字,即输出另一个3位数cba,如输出123则输出321,试设计程序(算法提示:a=n/100,b=(n-a*100)/10,c=(n-a*100)%10,m=c*100+b*10+a)。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;
scanf("%d",&n);
printf("%d%d%d\n",n%10,n/10%10,n/100);
return 0;
}
作业3
4.10 设计一个程序,输入实型变量x和y,若x>y,则输出x-y;若x<y,则输出y-x。
#include <stdio.h>
int main()
{
float x,y;
scanf("%f%f",&x,&y);
if(x>y)
printf("%f\n",x-y);
else
printf("%f\n",y-x);
return 0;
}
4.16 输入4个整数,要求按从大到小的顺序输出。
#include <stdio.h>
int main()
{
int a,b,c,d,tmp;
scanf("%d%d%d%d",&a,&b,&c,&d);
if(a<b)
{
tmp=b;
b=a;
a=tmp;
}
if(a<c)
{
tmp=c;
c=a;
a=tmp;
}
if(a<d)
{
tmp=d;
d=a;
a=tmp;
}
if(b<c)
{
tmp=c;
c=b;
b=tmp;
}
if(b<d)
{
tmp=d;
d=b;
b=tmp;
}
if(c<d)
{
tmp=d;
d=c;
c=tmp;
}
printf("%d %d %d %d\n",a,b,c,d);
return 0;
}
3.11 编写一个程序打印如图4-19所示的图案。使用for循环分别打印每一个图案。所有星号(*)应在一条cout<<’*’的语句中打印(使星号紧靠在一起)。提示:最后两个图案要求每一行以适当空格数开始。附加部分:这4个问题的代码组合在一个程序中,利用嵌套for循环使4分图案并排打印。
//#include <stdio.h> //用printf语句就是不行 Why?
#include <iostream>
using namespace std;
int main()
{
//freopen("x1.out","w",stdout);
/*for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
if(j<=i)
printf("*");
printf("\n");
}
printf("\n");
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
if(j<10-i)
printf("*");
printf("\n");
}
printf("\n");
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
if(j<i)
printf(" ");
else
printf("*");
printf("\n");
}
printf("\n");
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
if(j<9-i)
printf(" ");
else
printf("*");
printf("\n");
}
printf("\n");*/
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
if(j<=i)
//printf("*");
cout<<"*";
else
cout<<" ";
}
cout<<"\t";
for(int j=0;j<10;j++)
if(j<10-i)
//printf("*");
cout<<"*";
else
cout<<" ";
//printf("\n");
cout<<"\t";
for(int j=0;j<10;j++)
if(j<i)
//printf(" ");
cout<<" ";
else
cout<<"*";
//printf("*");
//printf("\n");
cout<<"\t";
for(int j=0;j<10;j++)
if(j<9-i)
//printf(" ");
cout<<" ";
else
cout<<"*";
//printf("*");
//printf("\n");
cout<<"\n";
}
return 0;
}
4.29 设用100元钱买100支笔,其中钢笔每支3元,圆珠笔每支2元,铅笔每支0.5元,问钢笔、圆珠笔和铅笔可以各买多少支(每种笔至少买一支)?
提示:设钢笔、圆珠笔和铅笔各买i、j、k只,则应有下列式子成立。
3*i+2*j+0.5*k=100
i+j+k=100
用穷举法将购买钢笔、圆珠笔的数量用二重循环遍历一遍。从中找出符合上述条件的购买方案。
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
for(int i=1;i<=100;i++)
for(int j=1;j<=100;j++)
for(int k=1;k<=100;k++)
if(3*i+2*j+0.5*k==100&&(i+j+k==100))
cout<<"钢笔:"<<setw(2)<<i<<" "<<"铅笔:"<<setw(2)<<j<<" "<<"铅笔:"<<setw(2)<<k<<endl;
return 0;
}
作业四
1.、题目:
(1)从键盘上输入10个浮点数,求出它们的和以及平均值,要求用函数实现。
(2)设计一个函数,实现把输入的一个十进制数转换为十二进制数。
(3)设计一个程序,用重载函数实现计算两个数的平方和,分别实现整形和浮点数的计算。
(4)根据斐波那契数列的计算公式,用递归的方法计算该数列。
(5)写出下列程序的运算结果。
#include <iostream.h>
#define A b*b-b
#define C A-A
int main()
{
int b=1;
cout<<"C="<<C;
cout<<endl<<"The screen will be closed in 30s.";
return 0;
}
2、程序结果贴图(注意标明对应题号和进行简短说明):
3.、编程碰到的问题及总结
①适当使用全局变量可以降低编写程序的复杂度;一定要谨慎使用全局变量。
②题目(2)(习题5.6)不用数组或许也能实现,但我暂时没有想到算法。(现在想到了,递归)
③要熟悉C++的特性;阅读相关书籍,要逐渐学会灵活使用C++的新特性。
④递归可以解决的问题,都能化为循环迭代;普通的递归会消耗大量的内存与运行时间,可以考虑使用记忆化搜索等方法改进。
⑤题目(5)第一次判断时,我错判结果为0。要掌握一些基本定义与概念,在实践逐渐学会灵活运用。
4、 附源代码:
作业4.1源代码:
/*4.1*/
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
float sum();
void average(float);
float _sum=0.0;
int main()
{
sum();
average(_sum);
Sleep(1000*30);
return 0;
}
float sum()
{
float m;
int i;
for(i=0;i<10;i++)
{
scanf("%f",&m);
_sum+=m;
}
printf("%f\n",_sum);
return _sum;
}
void average(float sum_)
{
printf("%f\n",sum_/10);
printf("\nThe screen will be closed in 30s.");
}
作业4.2源代码:
version 1:
//version1:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
void DecToDuo(int);
int times(int); //空间节约一点吧
char s[536870911+1000000000];
static int _times;
int main() //十二进制 duodecimal
{
int n,i=0;
printf("n可接受的最大值为2147483647\n");
printf(" ");
scanf("%d",&n);
_times=times(n)-1;
DecToDuo(n);
printf("%d的十二进制数为:",n);
for(i=_times;i>=0;i--)
printf("%c",s[i]);
printf("\nThe screen will be closed in 30s.");
Sleep(1000*30);
return 0;
}
int times(int n)
{
int _count=0;
while(n)
{
n/=12;
_count++;
}
return _count;
}
void DecToDuo(int n)
{
int i=0,p;
char ans;
while(n)
{
p=n%12;
n/=12;
if(p==10)
ans='a';
else if(p==11)
ans='b';
else
ans=p+'0';
s[i++]=ans;
}
}
version 2:
//version2:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void f(int);
int main()
{
int n,i;
/*while(scanf("%d",&n)==1)
{
f(n);
printf("\n");
}*/
srand(time(NULL));
for(i=0;i<50;i++)
{
printf("decimal:");
n=rand()%(100000-1000)+1000;
printf("%d",n);
printf("\nduodecimal:");
f(n);
printf("\n");
}
return 0;
}
void f(int n)
{
if(n/12)
f(n/12);
if(n%12==10)
printf("A");
else if(n%12==11)
printf("B");
else
printf("%d",n%12);
}
作业4.3源代码:
#include <iostream>
#include <windows.h>
using namespace std;
void sum_square(int,int);
void sum_square(double,double);
int main()
{
int a,b;
double x,y;
//cout<<"Please enter two integers:"<<endl;
cin>>a>>b;
//cout<<"Please enter two floating point numbers:"<<endl;
cin>>x>>y;
sum_square(a,b);
sum_square(x,y);
Sleep(1000*30);
return 0;
}
void sum_square(int a,int b)
{
//cout<<"The quadratic sum of these two integers:"<<a*a+b*b<<endl;
cout<<a*a+b*b<<endl;
}
void sum_square(double a,double b)
{
cout<<a*a+b*b<<endl;
cout<<endl<<"The screen will be closed in 30s.";
}
作业4.4源代码:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int Fibonacci(int);
int main()
{
int n,i;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
printf("%20d",Fibonacci(i));
if(i%4==0)
printf("\n");
}
printf("\nThe screen will be closed in 30s.");
Sleep(1000*30);
return 0;
}
int Fibonacci(int n)
{
return n==1||n==2?1:(Fibonacci(n-1)+Fibonacci(n-2));
}
作业五
1、题目:
(1)使用结构体变量来表示每个学生的数据:姓名、学号和3门课的成绩。从键盘上输入10个学生的数据,要求打印出每个学生的姓名和3门课的平均成绩。
(2)定义描述复数类型的结构体变量,编写减法函数sub()与乘法函数mul(),分别完成复数的减法与乘法运算。在主函数中定义四个复数类型变量c1、c2、c3、c4,输入c1、c2的复数值,调用sub()完成c3=c1-c2操作,调用mul()完成c4=c1*c2操作。最后输出c3、c4复数值。
(3)定义两个操作结构worker的函数input和display。结构worker用于表示职工的信息,如姓名,工龄,工资等。函数input输入一个职工的有关数据。函数display显示这些信息。并设计一个使用这两个函数的程序,该程序可以处理10个职工的数据。
(4)回答问题:
①什么是指针?指针的值和类型与一般变量有何不同?
②指针具有哪些运算?
③给指针赋值时应注意些什么?使用没用赋过值的指针有什么危险?
④指针作为函数的参数有什么特点?
⑤一维数组和二维数组的元素如何用指针表示?
⑥试述引用和指针的异同。
⑦设有声明:
int i=50,*ip=&i;
并设变量i存放在起始地址为2500的存储单元中,则ip和*ip的值各是多少?
2. 程序结果贴图(注意标明对应题号和进行简短说明):
作业五题目(4)的解答:
①什么是指针?指针的值和类型与一般变量有何不同?
答:指针变量(简称指针)是存放另一变量地址的变量。指针的值:指针与其他变量的不同之处在于,指针所对应的存储单元存放的是地址,而不是一般的数据;指针的类型:指针存放的是某个指定类型变量的地址,即:指向某类型值的指针。
②指针具有哪些运算?
答:&运算符,称为“取地址运算符”,是一元运算符,它返回操作数的地址。*运算符,称为“间接引用运算符”、“复引用运算符”或“取目标运算符”,它返回操作数(指针)所指向的对象。算术运算:加和减。指针作为操作数每加上或减去一个整数n,其运算结果是指向指针当前指向的变量的后方或前方的第n个变量。关系运算:在关系表达式中可对相同类型的两个指针进行各种关系运算,其结果可以反映两指针所指向的地址之间的位置前后关系。赋值运算:为指针变量赋值时,赋的值必须是地址常量或变量,而不能是普通整数。
③给指针赋值时应注意些什么?使用没用赋过值的指针有什么危险?
答:为指针变量赋值时,赋的值必须是地址常量或变量,而不能是普通整数。没有分配空间的指针,即它是随机指向的,系统自动对其初始化,所谓的“野指针”,最严重的可能造成内存泄漏。
④指针作为函数的参数有什么特点?
答:主调函数和被调函数操作的是同一段内存空间(同一个地址)上的内容。传递效率高:如果所需要传的是一个很大结构体之类变量,通过地址传递因为不用向变量所属的栈拷贝数据,远比传值快得多,也比传引用快。
⑤一维数组和二维数组的元素如何用指针表示?
答:假设有如下一维数组和指向整形变量指的针定义:
int a[size]; //size为一固定正的整形变量
int *pa;
pa = a;
则可以这样表示数组元素:
*p, *(p+1),………*(p+i);
假设有如下定义:
int A[M][N], i, j, max;
int (*p)[N];
则可以这样表示二维数组的元素:
*(*(A+i)+j);
⑥试述引用和指针的异同。
同:
它们都是和地址有关系的,指针指向一块内存,而引用是一块内存的别名。
异:
a. 指针是一个实体它在栈中有自己使用的空间,但是引用没有;
b. 引用必须初始化,指针不用但是最好初始化
c. 指针使用时必须加*,引用不用;
d. 引用只能初始化一次,指针不受此限制;
e. 引用不用const去修饰,但是指针可以
f. 指针和地址运用自增(++)不同,引用是值进行自增,而指针是地址进行自增。
联系
a. 引用的内部使用指针实现的;
b. 引用是受了限制的指针。
(⑥的回答基于此CSDN博客:https://blog.csdn.net/study__linux/article/details/51352206)
⑦设有声明:
int i=50,*ip=&i;
并设变量i存放在起始地址为2500的存储单元中,则ip和*ip的值各是多少?
答:ip的值为2500,*ip的值为50。
4. 附源代码:
作业5.1源代码:
C version:
//C version:
#include <stdio.h>
#include <stdlib.h>
//name&number&the grade of 3 courses
typedef struct student
{
char name[20];
int num;
int grade[3];
}stu,*st;
st init(stu *);
//void dispaly(st);
float dispaly(st);
int main()
{
freopen("x1.in","r",stdin);
freopen("x1.out","w",stdout);
st p,q;
p=init(q);
display(p);
return 0;
}
st init(stu* p)
{
int i;
p=(stu*)malloc(sizeof(stu)*10);
for(i=0;i<10;i++)
{
//scanf("%s",p[i].name);
gets(p[i].name);//如果用上面这句话运行时就会出错
scanf("%d%d%d%d",p[i].num,p[i].grade[0],p[i].grade[1],p[i].grade[2]);
}
return p;
}
//float display(st p)
void display(st p)
{
int i;
float aver=0.0;
for(i=0;i<10;i++)
{
//aver=(p[i]->grade[i][0]+p[i]->grade[i][1]+p[i]->grade[i][2])/3;
aver=(float)(p[i].grade[0]+p[i].grade[1]+p[i].grade[2])/3;
//puts(p[i].name);
printf("%s\n",p[i].name);//上面这句话和这句话输出结果无差别
printf(" ---- %.2f\n",aver);
//printf("%s\n",p[i].name);
}
//return aver;
}
C++version:
//C++ version:
#include <cstdio>
#include <iomanip>
#include <iostream>
//#include <windows.h>
using namespace std;
//name&number&the grade of 3 courses
typedef struct student
{
char name[20];
int num;
int grade[10][3];
}stu,*st;
st init(stu *);
void display(st);
int main()
{
freopen("x1.in","r",stdin);
freopen("x1.out","w",stdout);
st p,q;
p=init(q);
display(p);
//Sleep(1000*60);
return 0;
}
st init(stu* p)
{
int i;
p=new stu[10];
for(i=0;i<10;i++)
cin>>p[i].name>>p[i].num>>p[i].grade[i][0]>>p[i].grade[i][1]>>p[i].grade[i][2];
return p;
}
void display(st p)
{
int i;
float aver=0.0;
for(i=0;i<10;i++)
{
aver=(float)(p[i].grade[i][0]+p[i].grade[i][1]+p[i].grade[i][2])/3;
cout<<p[i].name<<" "<<fixed<<setprecision(2)<<aver<<endl;
}
}
作业5.2源代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct complex_number
{
double re;
double im;
}Im_m,*Ima;
Ima sub(Im_m*,Im_m*);
Ima mul(Im_m*,Im_m*);
Ima init(Im_m*);
void display(Ima);
int main()
{
//freopen("x1.in","r",stdin);
//freopen("x1.out","w",stdout);
Ima c1=init(c1),c2=init(c2),c3,c4;
c3=sub(c1,c2);
c4=mul(c1,c2);//c3=c1-c2,c4=c1*c2
display(c3);
display(c4);
return 0;
}
Ima init(Im_m* s)
{
s=(Im_m*)malloc(sizeof(Im_m));
scanf("%lf%lf",&s->re,&s->im);
return s;
}
Ima sub(Im_m* a,Im_m* b)
{
Ima c=(Im_m*)malloc(sizeof(Im_m));
c->re=a->re-b->re;
c->im=a->im-b->im;
return c;
}
//Set two complex Numbers A= a+bi,B=c+di,where a,c is the real part,c,d is the imaginary part,
//then A¡ÁB=ac-bd+(ad+bc)i.
Ima mul(Im_m* a,Im_m* b)
{
Ima c=(Im_m*)malloc(sizeof(Im_m));
c->re=(a->re)*(b->re)-(a->im)*(b->im);
c->im=(a->re)*(b->im) + (a->im)*(b->re);
return c;
}
void display(Ima s)
{
if(s->im<0)
printf("%.2lf%.2lfi\n",s->re,s->im);
else
printf("%.2lf+%.2lfi\n",s->re,s->im);
}
作业5.3源代码:
C version:
//C version
#include <stdio.h>
#include <stdlib.h>
typedef struct worker
{
char name[20];
int work_years;
int salary;
}Worker,*PWorker;
PWorker input(Worker*);
void display(Worker*);
int main()
{
freopen("x1.in","r",stdin);
freopen("x1.out","w",stdout);
Worker* w=input(w);
display(w);
printf("%p\n",w);
free(w);
printf("%p\n",w);
/*if(w==NULL)
printf("yes\n");
else
printf("no\n");*/
return 0;
}
PWorker input(Worker* s)
{
s=(Worker*)malloc(sizeof(Worker)*10);
int i;
for(i=0;i<10;i++)
{
gets(s[i].name);
scanf("%d%d",s[i].work_years,s[i].salary);
}
return s;
}
void display(Worker* p)
{
int i;
for(i=0;i<10;i++)
{
puts(p[i].name);
printf("%d%d\n",p[i].work_years,p[i].salary);
}
free(p);
}
C++ version:
//C++ version
#include <iostream>
#include <cstdio>
//ÐÕÃû¡¢¹¤Áä¡¢¹¤×Ê
typedef struct worker
{
char name[50];
int work_years;
int salary;
}Work,*PWorker;
using namespace std;
PWorker input(Work*);
void display(Work*);
int main()
{
freopen("x1.in","r",stdin);
freopen("x1.out","w",stdout);
Work* wrk;
wrk=input(wrk);
display(wrk);
return 0;
}
PWorker input(Work* wrk)
{
wrk=new Work[10];
for(int i=0;i<10;i++)
cin>>wrk[i].name>>wrk[i].work_years>>wrk[i].salary;
return wrk;
}
void display(Work* wrk)
{
for(int i=0;i<10;i++)
{
cout<<wrk[i].name<<" "<<wrk[i].work_years<<" "<<wrk[i].salary<<endl;
}
delete wrk;
}