《c++程序设计》课程设计报告
班级:2018级4班 学号:2018212775
报告人姓名:王兆伟
实验地点: 东校区教学楼414
完成起止日期:2019.01.02----2019.01.04
第一题
1:题意:去掉一个最高分和一个最低分,然后计算平均得分,输出选手的得分。
2:思路:先将所有成绩从小到大排序,然后从第二大元素加到倒数第二大的元素,用这个和除以n-2,就是平均值了
3:原码:
#include<iostream>
#include <algorithm>
using namespace std;
int main()
{
int n,i,j;
int a[100];
double sum;
while(cin>>n)
{
sum=0.0;
for(i=0;i<n;i++)
{
cin>>a[i];
}
sort(a,a+n);
for(j=1;j<n-1;j++)
{
sum+=a[j];
}
printf("%.2f\n",sum/(n-2));
}
return 0;
}
第二题
1:题意:一头母牛,每年年初生一头小母牛,每头小母牛从第四个年头起,每年年初也要生一头小母牛,第N年有多少头。
2:思路:假设第一头母牛在第n个年头,她就能够生出n个子牛,同时母牛的第一个子牛,会在第n-5个年头产出其子牛,第一个子牛产生的第一个子子牛,则会在n-10个年头产出其子牛,随后,子子牛则会在n-15个年头产出其子牛。
3:原码:#include<stdio.h>
int main()
{
int n,i;
int s[55];
while(scanf("%d",&n)!=EOF)
{
s[1]=1;
s[2]=2;
s[3]=3;
if(n==0) break;
else
if(n==1) printf("%d\n",s[1]);
else
if(n==2) printf("%d\n",s[2]);
else
if(n==3) printf("%d\n",s[3]);
else
{
for(i=4;i<=n;i++)
{
s[i]=s[i-1]+s[i-3];
}
printf("%d\n",s[n]);
}
}
return 0;
}
第三题
1:题意: 按照绝对值从大到小排序后输出,所有的数的绝对值都不相等。
2:思路:条件语句中利用fabs判断绝对值大小,再对原数进行排序。
3:原码:#include<stdio.h>
#include<math.h>
int main()
{
int i,j,n,t;
int a[100];
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(fabs(a[j])>fabs(a[i]))
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
for(i=0;i<n-1;i++)
{
printf("%d ",a[i]);
}
printf("%d\n",a[i]);
}
return 0;
}
第四题
1:题意:将数m插入排列好序列中,并使新的序列仍然有序。
2:思路:对n个数,令m为第n+1个数,将所有数进行排序。输出前n个时,每个后面输出空格,第n+1个不用输出空格。
3:原码:#include<stdio.h>
int main()
{
int n,m,k,i;
while(scanf("%d%d",&n,&m),n!=0||m!=0)
{
int a[100];
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
a[n]=m;
for(i=n-1;i>=0;i--)
{
if(a[i]>a[i+1])
{
k=a[i];
a[i]=a[i+1];
a[i+1]=k;
}
else
break;
}
for(i=0;i<=n;i++)
{
if(i==n)
printf("%d",a[i]);
else
printf("%d ",a[i]);
}
printf("\n");
}
return 0;
}
第五题
1:题意:工资都是正整数,人民币一共有100、50、10、5、2和1元六种,准备多少张,才不用找零?
2:题意:将工资逐个除以面值100,50,10,50,2,1的金额,并记一次数,余数继续处,直至余数为0,也就将工资用这6中数额拼凑好了。
3:原码:#include<stdio.h>
int main()
{
int n,i;
while(scanf("%d",&n),n!=0)
{
int m,s=0;
for(i=0;i<n;i++)
{
scanf("%d",&m);
s+=m/100; m=m%100;
s+=m/50;m=m%50;
s+=m/10;m=m%10;
s+=m/5;m=m%5;
s+=m/2;m=m%2;
s+=m;
}
printf("%d\n",s);
}
return 0;
}
第六题
1:题意:请写一个程序判断读入的字符串是否是“回文”。
2:思路:回文串最基本的判定法是将一个字符串扫一遍,判断第i个字符和倒数第i个字符是否相同,不相同则返回false。
3:原码:#include<stdio.h>
#include<string.h>
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int i,j,len;
char s[100];
getchar();
while(n--)
{
gets(s);
len=strlen(s);
i=0;
j=len-1;
while(i<j)
{
if(s[i]!=s[j])
break;
else
i++;
j--;
}
if(i>=j)
printf("yes\n");
else
printf("no\n");
}
}
return 0;
}
第七题
1:题意:将十进制数N转换成R进制数输出。
2:思路:除R取余法,将十进制的数n除以R取其余数,这里得到的余数是R进制数的最后一位。特别的10到16进制的转化,因为字母的引入,不能直接对于数组进行直接的输出,这里可以使用if语句。
3:原码:
#include<stdio.h>
int main()
{
long n;
int r,a,j,k;
int s[10000];
while(scanf("%ld%d",&n,&r)!=EOF)
{
k=0;
if(n<0)
{
n=-n;
printf("-");
}
if(n==0)
printf("0");
while(n>0)
{
a=n%r;
s[k++]=a;
n=n/r;
}
k=k-1;
for(j=k;j>=0;j--)
{
if(s[j]==10) printf("A");
else if(s[j]==11) printf("B");
else if(s[j]==12) printf("C");
else if(s[j]==13) printf("D");
else if(s[j]==14) printf("E");
else if(s[j]==15) printf("F");
else printf("%d",s[j]);
}
printf("\n");
}
return 0;
}
第八题
1:题意:两个时间A和B都是由3个整数组成,求两组时间相加。
2:思路:每组从后两位开始相加,除以60取余进1,依次类推。
3:原码:#include<stdio.h>
int main()
{
int a,b,c,d,e,f,g,h,i;
int n;
while(scanf("%d",&n)!=EOF)
{
while(n--)
{
g=0;
h=0;
i=0;
scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f);
i=c+f;
if(i>60)
{
h++;
i=i-60;
}
h+=b+e;
if(h>60)
{
g++;
h=h-60;
}
g+=a+d;
printf("%d %d %d\n",g,h,i);
}
}
return 0;
}
第九题
1:题意:求A的B次方的最后三位数表示的整数。
2:思路:当A,B很大时,数据会溢出。 最后三位数的乘积最多只与三位数的运算有关,故进行以下取数,当c大于1000时,对1000取余数。
3:原码:
#include<stdio.h>
#include<math.h>
int main()
{
int n,m,t,i;
while(scanf("%d%d",&n,&m),n!=0||m!=0)
{
t=1;
for(i=1;i<=m;i++)
{
t=(t*n)%1000;
}
printf("%d\n",t);
}
return 0;
}
第十题
1:题意:请编程蜜蜂从蜂房a到蜂房b的可能路线数。
2:思路:观察给出的图,以s[i]表示相隔距离为i 的两个房间之间的路线数;我们发现,若要到达第i个房间,则会通过第i-1,i-2号房间,而从i-1和i-2房走到第I号房有分别只有一种路线;所以,s[i]=s[i-1]+s[i-2]。
3:原码:#include<stdio.h>
int main()
{
int n;
int a,b,i;
long long s[60];
scanf("%d",&n);
s[0]=1;
s[1]=1;
s[2]=2;
for(i=3;i<=50;i++)
{
s[i]=s[i-1]+s[i-2];
}
while(n--)
{
scanf("%d %d",&a,&b);
printf("%lld\n",s[b-a]);
}
return 0;
}
第十一题
1:题意:Ai=(Ai-1+Ai+1)/2-Ci;给出A0,An1和C1,C2…Cn,A1=?
2:思路:
A1 = 1/2 * A0 + 1/2 * A2 - C1;......................1式
A2 = 1/2 * A1 + 1/2 * A3 - C2; ......................2式
将1式代入2式,得到:A2 = 1 / 3 * A0 + 2 / 3 * A3 - 2/3 * C1 - 4 / 3 * C2;....................3式
将3式代入1式,得到:A1 = 2 / 3 * A0 + 1 / 3 * A3 - 4 / 3 * C1 - 2 / 3 * C2.
......以此类推:
可以得到一个通式:对于An+1。 A1 = n / (n + 1) * A0 + 1 / (n + 1)* An+1 - 2*n / (n + 1)* C1 - (2*n - 2)/(n + 1)* C2 - ........2 / (n + 1)* Cn-1。
3:原码:#include<stdio.h>
int main()
{
double a0,a1,an1,c[3006];
int i,n;
while(scanf("%d",&n)!=EOF)
{
scanf("%lf%lf",&a0,&an1);
for(i=1;i<=n;i++)
{
scanf("%lf",&c[i]);
}
a1=n*a0+an1;
for(i=1;i<=n;i++)
{
a1=a1-2*(n-i+1)*c[i];
}
a1=a1/(n+1);
printf("%.2lf\n",a1);
}
return 0;
}
第十二题
1:题意:不知道末二位的整数被另一个整数除尽了,求末二位。
2:思路:对于代码的实现,首先,要用到多组数据,该题目,主要找到原数就可以了,这里的a是原数的前几位,而原数的后两位没有给出,即,只要a*100+后两位数就是原数;这里的后两位数,可以用个for循环去实现,也就是说,将a*100+(for循环控制00~99),然后,原数满足可以被b整除,找到满足的数,即可;当a和b都为0的时候程序结束;最后行末尾没有空格。
3:原码:#include<stdio.h>
int main()
{
int a,b;
while(scanf("%d %d",&a,&b),a!=0||b!=0)
{
int i,k,l;
l=0;
for(i=0;i<=99;i++)
{
k=a*100+i;
if(k%b==0)
{
if(l)
printf(" ");
printf("%02d",i);
l++;
}
}
printf("\n");
}
return 0;
}
第十三题
1:题意:求一个偶数拆成两个不同素数的和的拆法。
2:思路:如果单纯考虑只拆为两个数字的和,那么就从1 + n-1,2 + n-2,3 + n-3.....
那么只需将i从n=2开始判断(1不是素数)i和n-i是否为素数,前提是i<n/2,因为n是偶数。
判断是否为素数,判断到sqrt(n)。
3:原码:#include<stdio.h>
#include<math.h>
int isPrime(int n)
{
int i;
for(i=2;i<=sqrt(n);i++)
{
if(n%i==0)
return 0;
}
return 1;
}
int main()
{
int n,k,i;
while(scanf("%d",&n),n!=0)
{
k=0;
for(i=2;i<n/2;i++)
{
if(isPrime(i)&&isPrime(n-i))
k++;
}
printf("%d\n",k);
}
return 0;
}
第十四题
1:题意:判断是否是Sky数。
2:思路:编译一个函数,如输入的数n,进制r,每次n除r求余,令n除r的整数为n,余数相加,循环。
3:原码:#include<stdio.h>
int H(int n,int r)
{
int sum=0,i,s;
for(i=1;n!=0;i++)
{
s=n%r;
n=n/r;
sum+=s;
}
return sum;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF && n!=0)
{
if(H(n,10)==H(n,12) && H(n,10)==H(n,16))
printf("%d is a Sky Number.\n",n);
else
printf("%d is not a Sky Number.\n",n);
}
return 0 ;
}
第十五题
1:题意:x+y=9.x·y=15,x,y是否存在。
2:思路:在条件循环下,判断i和n-i是否满足,这样可以防止溢出。
3:原码:#include<stdio.h>
int main()
{
int n,m,i,s;
while(scanf("%d%d",&n,&m),n!=0||m!=0)
{
s=0;
for(i=-1000;i<1000;i++)
{
if((n-i)*i==m)
s=1;
}
if(s==1)
{
printf("Yes\n");
}
else
printf("No\n");
}
return 0;
}
C语言知识点大总结
第一章 概述
1. C语言的特点
①语言简洁、紧凑,使用方便、灵活。共有32个关键字,9种控制语句。
②运算符丰富,公有34种运算符。
③数据结构丰富,数据类型有:整型、实型、字符型、数组、指针、结构体、共用体等。
④具有结构化的控制语句(如if…else、while、do…while、switch、for)
⑤语法限制不太严格,程序设计自由度大。
⑥允许直接访问物理地址,能进行位(bit)操作,可以直接对硬件操作。
⑦生成目标代码质量高,程序执行效率高。
⑧可移植性好。
2. C语言的用途
C虽不擅长科学计算和管理领域,但对操作系统和系统实用程序以及对硬件进行操作方面,C有明显的优势。现在很多大型应用软件也用C编写。
第二章 数据类型、运算符与表达式
1. C的数据类型
C的数据类型包括:整型、字符型、实型或浮点型(单精度和双精度)、枚举类型、数组类型、结构体类型、共用体类型、指针类型和空类型。
2. 常量与变量
常量其值不可改变,符号常量名通常用大写。变量其值可以改变,变量名只能由字母、数字和下划线组成,且第一个字符必须为字母或下划线。否则为不合法的变量名。变量在编译时为其分配相应存储单元。
3. 整型数据
整型常量的表示方法:十进制不用说了,八进制以0开头,如0123,十六进制以0x开头,如0x1e。
整型变量分为:基本型(int)、短整型(short int)、长整型(long int)和无符号型。不同机器上各类数据所占内存字节数不同,一般int型为2个字节,long型为4个字节。
4. 实型数据
实型常量表示形式:十进制形式由数字和小数点组成(必须有小数点),如:0.12、.123、123.、0.0等。指数形式如123e3代表123×10的三次方。
实型变量分为单精度(float)和双精度(double)两类。在一般系统中float型占4字节,7位有效数字,double型占8字节,15~16位有效数字。
5. 字符型数据
字符变量用单引号括起来,如a,b等。还有一些是特殊的字符常量,如//n,//t等。分别代表换行和横向跳格。
字符变量以char 来定义,一个变量只能存放一个字符常量。
字符串常量是由双引号括起来的字符序列。这里一定要注意a和"a"的不同,前者为字符常量,后者为字符串常量,c规定:每个字符串的结尾加一个结束标志,实际上"a"包含两个字符:a和。
6. 数值型数据间的混合运算
整型、字符型、实型数据间可以混合运算,运算时不同类型数据要转换成同一类型再运算,转换规则:
char,short -> int -> unsigned -> long -> double <- float
7. 运算符和表达式
c运算符包括:
算数运算符( + - * / % )
关系运算符( > < == >= <= != )
逻辑运算符( ! && || )
位运算符( << >> ~ | ^ & )
赋值运算符( = )
条件运算符( ? : )
逗号运算符( , )
指针运算符( * & )
求字节数( sizeof )
强制类型转换(类型)
分量运算符( . -> )
下标运算符( [ ] )
其它运算符( 如函数调用运算符( ) )
自增自减运算符( ++ -- )注意:++i和i++的不同之处,++i使用i之前先使i加1,i++使用i之后,使i加1。
逗号表达式的求解过程:先求解表达式1,再求解表达式2,整个表达式的值是表达式2的值。
第三章 最简单的c程序设计
1.c的9种控制语句:
if() ~ else~
for()~
while()~
do~while()
continue
break goto
return
程序的三种基本结构:顺序结构,选择结构,循环结构
2.数据输出
c语言不提供输入输出语句,输入输出操作是由c的库函数完成。但要包含头文件stdio.h。
putchar( ) 向终端输出一个字符
printf( )的格式字符:
① d格式符 用来输出十进制整数
%d 按整型数据的实际长度输出
%md 使输出长度为m,如果数据长度小于m,则左补空格,如果大于m,则输出实际长度
%ld 输出长整型数据
② o格式符 以八进制形式输出整数
③ x格式符 以十六进制形式输出整数
④ u格式符 用来输出unsigned型数据,以十进制形式输出
⑤ c格式符 用来输出一个字符
⑥ s格式符 输出一个字符串
%s 输出实际长度字符串
%ms 输出的串占m列,如果串长度小于m,左补空格,如果大于m,实际输出
%-ms输出的串占m列,如果串长度小于m,右补空格,
%m.ns 输出占m列,但只取字符串中左端n个字符并靠右对齐
%-m.ns m、n含义同上,靠左对齐,如果n>m,则m自动取n值
⑦ f格式符 以小数形式输出实数
%f 整数部分全部输出,小数部分输出6位
%m.nf 输出数据共占m列,其中有n位小数。如果数值长度小于m,左补空格
%-m.nf 同上,右补空格
⑧ e格式符 以指数形式输出实数
%e 系统指定6位小数,5位指数(e+002 )
⑨ g格式符 输出实数,根据数值大小,自动选f格式或e格式
3.数据输入
getchar( ) 从终端输入一个字符
scanf( 格式控制,地址列表) 标准C scanf中不使用%u,对于unsigned型数据,以%d或%o或%x输入。%后的*,用来跳过它相应的数据。输入数据时不能规定精度如scanf( "%7.2f", &a );是不合法的。
第四章 逻辑运算和判断选取控制
1. 关系运算符:
c提供6种关系运算符(> < <= >= == != )前四种优先级高于后两种。
2. If语句
C提供了三种形式的if语句
If(表达式) 语句
If(表达式) 语句1 else 语句2
If(表达式1) 语句1
Else if(表达式2) 语句2
…
else 语句n
3. 条件运算符
(a>b)?a:b 条件为真,表达式取值a,否则取值b
4.tch语句
{
case 常量表达式1:语句1; break;
case 常量表达式2:语句2; break;
…
case 常量表达式n:语句n; break;
default :语句n+1;
}
第五章 循环控制
1. 几种循环语句
goto语句(现已很少使用)
while语句 先判断表达式后执行语句
do-while语句 先执行语句后判断表达式
for语句
2. Break语句和continue语句
Break语句用于跳出循环,continue用于结束本次循环。
第六章 数组
1. 一维数组
c规定只有静态存储(static)和外部存储(extern)数组才能初始化。给数组初始化时可以不指定数组长度。
2. 二维数组
3. 字符数组
部分字符串处理函数
puts(字符数组) 将一个字符串输出到终端。
gets(字符数组) 从终端输入一个字符串到字符数组,并且得到一个函数值,为该字符数组的首地址
strcat(字符数组1,字符数组2) 连接两个字符数组中的字符串,数组1必须足够大。
Strcpy(字符数组1,字符串2) 将字符串2拷贝到字符数组1中。
Strcmp(字符串1,字符串2) 比较字符串,相等返回0,字符串1>字符串2,返回正数,小于返回负数。
Strlen(字符数组) 求字符串长度。
Strlwr( 字符串) 将字符串中的大写字母转换成小写
Strupr( 字符串) 将字符串中的小写字母转换成大写
以上是一些比较常用的字符串处理函数。
回顾学习情况
上学期刚学习C语言时,一脸懵逼了,题不会做,连最简单的HelloWorld都不会,当时看着别人会做,我非常苦恼,不过,幸好我没有放弃,慢慢的会做一些基础的题,但这样还是不够的,遇到思路难得题还是不行。所以我下定决心利用这个寒假将C语言快速提升,不是嘴上说说,而是真的采取行动,希望下学期有个崭新的自己。最后希望老师能在这给予鼓励,谢谢老师!