C++课程设计

                    C++课程设计 

第一题:
题意:求两个点分别和原点连线的夹角的大小,两点坐标分别为a(x1,y1),b(x2,y2)。 思路: 可以利用余弦定理ab=|a||b|cos&,ab=x1x2+y1y2; 也可以用a2=b2+c^2+2bccoS&; 再配合数学函数acos(),即&=acos(ab/(|a||b|)),&是弧度值,需要转化为角度,即再乘上180.0/PI,PI是定义的宏常量π,其值为acos(-1.0);向量的乘积ab=(x1x2+y1y2),向量的模|a|=sqrt(x1x1+y1y1),|b|=sqrt(x2x2+y1y2)。 细节处理: 用while语句实现可以输入多组数据;必须将x1,x1,y1,y2赋值成double类型;另外题目要求最后保留两位小数,可以printf(“%.2lf”,a)形式输出。 总结: C语言编程与数学思想天然密不可分!通过数学方法,数学公式可以使程序编程变得简洁高效,在编程中多运用数学公式,总结规律。
第二题: 题意:n^2+n+41,n在(x,y)内取值,判断表达式的值是否为素数。 思路: 这个题的关键在于如何能快速准确的判断素数,为此我们可以先编写一个判断素数的函数;素数是除了1和他本身外不能被任何数整除的数,首先1,3是素数,被6除不余1或余5的数不是素数;i=5,i依次加6,若n%i0或n%(i+2)0,n不是素数。判断素数的函数如下 bool prime(int n) { if(n2 || n3) return 1; if(n%6!=1 && n%6!=5) return 0; for(int i=5;i
i<=n;i=i+6) { if(n%i==0 || n%(i+2)==0) return 0; } return 1; } 细节处理: 1不是素数,应该从2开始判断;素数是整数定义为int型;当x=0且y=0时,return 0结束操作。 总结: 明确素数的定义;素数是除了1和他本身外不能被任何数整除的数; 利用函数的思想,使程序变的更简洁。
第三题:
题意:有一组数据,去掉一个最高分,去掉一个最低分,再求平均值
思路:
要想找出最大值,最小值就要把数据先进行排序,可以用排序函数sort(a,a+n),其中a表示数组首项,a+n表示第一个没有定义的项,在头文件algorithm中,这种方法求的是升序;求降序的函数需要自己定义,如下:
bool complare(int a,int b)
{
return a>b;
}
Sort(a,a+n,conplare)
在这个题当中先定义一个一维数组,排序后去掉首项和未项,再求平均值。
细节处理:
最后的结果需要保留两位小数,因此需要用到数据类型的强制转换,把整型转换为实型后,保留两位小数;数据的个数>=3,注意循环的次数。
总结:
Sort排序函数是升序,降序函数可以在此基础上自己编写;注意题目条件,保留正确的位数。
#include
#include<stdio.h>
#include
using namespace std;
int a[150];
int main()
{
int n,i,m;
double z;
while(cin>>n)
{
for(i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+n+1);
m=0;
for(i=2;i<=n-1;i++)
{
m=m+a[i];
}

    z=(double)m/(n-2);
    printf("%.2lf\n",z);
    
}
return 0;

}

第四题
题意:
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。在第n年的时候,共有多少头母牛
思路:
此题需要先写出前几年的头数寻找规律,
第1年 第2年 第3年 第4年 第5年 第6年
1 2 3 4 6 9
可得第n年的头数f(n)=f(n-1)+f(n—2)
题目中到55年,可以利用数组求出前60年的,再输出任意n年的即可
细节处理:
前三项以后才有规律,数组赋值从第四年开始
总结:
有时候问题的规律不好找,需要耐下心来,与数学方法相联系才能找到。
#include
using namespace std;
int a[150]={};
int main()
{
int n,i;

while(cin>>n)
{
    if(n==0)
    {
        return 0;
    }
    a[1]=1;
    a[2]=2;
    a[3]=3;
    for(i=4;i<=n;i++)
    {
        a[i]=a[i-3]+a[i-1];
    }
    cout<<a[n]<<endl;

}
return 0;

}
第五题
题意:输入n(n<=100)个整数,按照绝对值从大到小排序后输出。题目保证对于每一个测试实例,所有的数的绝对值都不相等。
思路:
这个题的难度在于把数据排序后,输出原先排序的数列,这就用到三个数组,数组一储存原先的数列,数组二储存数组一的绝对值 顺序不变,数组三将数组二进行排序,之后若数组三中某元素与数组二中相等,输出数组一中该位置的元素。
细节处理:
数组二是为了数组三元素原先的位置;因此要输出数组一。
总结:;
问题较复杂时,可以利用多组数组,储存多个数据。
#include
#include
using namespace std;
bool complare(int a,int b)
{
return a>b;
}
int a[130],b[120],c[130],e[130];
int main()
{
int n,i,j;
while( cin>>n)
{
if(n==0)
{
return 0;

   }


for(i=1;i<=n;i++)
{
    cin>>a[i];
    b[i]=a[i];
}
for(i=1;i<=n;i++)
{
    if(a[i]<0)
    a[i]=-a[i];
    c[i]=a[i];
}
sort(a+1,a+n+1,complare);
for(i=1;i<=n;i++)
{
    for(j=1;j<=n;j++)
    {


      if(a[i]==c[j])
         e[i]=b[j];
    }
}
for(i=1;i<n;i++)
{
    cout<<e[i]<<" ";
}
cout<<e[n]<<endl;

}

}
第六题:
题意:
如果每个老师的工资额都知道,最少需要准备多少张人民币,才能在给每位老师发工资的时候都不用老师找零呢?
这里假设老师的工资都是正整数,单位元,人民币一共有100元、50元、10元、5元、2元和1元六种。
思路:
在这个题中主要用到了求余的思想,整除的思想,工资n先除100
除数即为100的张数,余数再除以50,除数即为50的张数,余数再除以10 ,依次进行,记录总张数。
细节处理:
在这个题中,一共有n位老师,需要将每位老师的人民币张数加和。

必须从100开始除。
总结:
这也是一个规律题,要耐下心来寻找规律,并善于总结规律。
#include
using namespace std;
int a[150],b[1000000],c[3000];
int main()
{
int n,i,t;

while(cin>>n)
{
    t=0;
    if(n==0)
    {
        return 0;
    }
    for(i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    for(i=1;i<=n;i++)
    {
        b[1]=a[i]/100;
        a[i]=a[i]%100;
        b[2]=a[i]/50;
        a[i]=a[i]%50;
        b[3]=a[i]/10;
        a[i]=a[i]%10;
        b[4]=a[i]/5;
        a[i]=a[i]%5;
        b[5]=a[i]/2;
        a[i]=a[i]%2;
        b[6]=a[i]/1;
        a[i]=a[i]%1;
        c[i]=b[1]+b[2]+b[3]+b[4]+b[5]+b[6];
    }
    for(i=1;i<=n;i++)
    {
       t=t+c[i];
    }
    cout<<t<<endl;
}
return 0;

}
第七题
题意:回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。请写一个程序判断读入的字符串是否是“回文
思路:】
方法一:在定义一个反转后的数组,将该数组与原数组比较
方法二:将数组的尾项与首相依次比较;
细节处理:
先求出字符串的长度
字符串可以定义为string 类型,用puts输入或用printf输入
总结
字符串的处理和数组类似,类比运用即可。
#include
#include
using namespace std;
char a[300];
int main()
{
int n,l,j,i,t,f;
string s;
cin>>n;
for(i=1;i<=n;i++)
{
t=0;
f=1;
cin>>s;
l=s.length();
for(j=1;j<=l;j++)
{
a[j]=s[t++];
}

    if(l%2!=0)
    {
        for(j=1;j<=(l-1)/2;j++)
        {
            if(a[j]!=a[l+1-j])
            {
                f=0;
               break;
            }



        }
    }
    if(l%2==0)
    {
        for(j=1;j<=l/2;j++)
        {
            if(a[j]!=a[l+1-j])
            {
                f=0;
               break;
            }



        }
    }
    if(f==0)

    cout<<"no"<<endl;

    if(f==1)
    cout<<"yes"<<endl;


}
return 0;

}

第八题
题意:
输入一个十进制数N,将它转换成R进制数输出。
思路:用到了求余的思想,整除的思想;将除数 ,余数分别储存;
从后向前依次输出即可。
细节处理:
大于10的数用字母A,B,C,D,。。。。表示
当值为负数时,不要忘了输出负号,
总结:、
此题考察总结规律,通过将余数储存倒叙输出思想,书写程序。
#include
#include
using namespace std;
void turn(int n,int a);
char ch[6]={‘A’,‘B’,‘C’,‘D’,‘E’,‘F’};

int main()
{
int n,a;
while(cin>>n>>a)
{
turn(n,a);
}

}
void turn(int n,int a)
{
int x[170],i,j,k=0;
if(n<0)
{
cout<<’-’;
}
j=abs(n);

    do
    {
        k++;
        i=j%a;
        j=j/a;
        x[k]=i;
    }while(j!=0);
    for(int h=k;h>=1;--h)
    {
        if(x[h]<10)
    {
        cout<<x[h];
    }
    else
    {
        cout<<ch[x[h]-10];
    }
    }
    cout<<endl;

}

第九题
题意:求A^B的最后三位数表示的整数。
说明:A^B的含义是“A的B次方”
思路:
直接计算a的b次方会超限;因此必须换一种思路,在该题中要求计算后三位数字,因此再循环中可以只关注后三位数字的变化。
细节处理:
For循环中计算一次保留一次后三位数字,直到循环结束;
总结:
做题时要读懂题意,该题中要求输出后三位表示的整数,只关注后三位即可。
#include
using namespace std;
int main()
{
int n,m,s,w,i;
while(cin>>n>>m)
{
w=n;
if(n0 && m0)
{
return 0;
}

    for(i=1;i<m;i++)
    {
       s=n%1000;
       n=w*s;
    }
    n=n%1000;
    cout<<n<<endl;





}
return 0;

}
第十题
题意:
算菜价,输入含有一些数据组,每组数据包括菜种(字串),数量(计量单位不论,一律为double型数)和单价(double型数,表示人民币元数)。
思路:
解题的关键是将菜价依次加和储存,输入字符的方法
细节处理:
这个题的结束是ctrl+z,并且注意要用四舍五入的方法去掉分头。
Printf(“%.1”,a) 自动为四舍五入。
总结:
要注意数值的类型,菜种和数量均为double类型;并注意四舍五入的方法。
#include
#include<stdio.h>
#include
using namespace std;

int main()
{
string s;
double x,y,t=0;
while(cin>>s>>x>>y)
{

    t=t+x*y;
}
printf("%.1lf\n",t);
return 0;

}
第十一题
题意:同的字符表示不同的花纹,整数n表示等腰三角形的高。显然其底边长为2n-1
输出
X
XXX
 
A
A A
A A
A A
A A
A A
AAAAAAAAAAAAA
思路:利用二维数组,类比于矩阵,可以输出该图形
但要注意输出格式。
细节处理:
由题意,输出的两个图形要空一行,并且吸收空格和换行
总结:
输出图形时,要注意输出的形式,不可输出多余的空格和换行
#include <stdio.h>
#include <string.h>
int main()
{
char a;
int b,i,j,k=0;
while((a=getchar())!=’@’)
{
++k;
getchar();
scanf("%d",&b);
getchar();
if(k!=1)
printf("\n");

    for(i=1;i<b;i++)
    {
        for(j=1;j<=b+(i-1);j++)
         {
             if(j==b-(i-1)||j==b+(i-1))
                printf("%c",a);
             else
                printf(" ");
         }
        printf("\n");
    }
    for(i=0;i<2*b-1;i++)
      printf("%c",a);
    printf("\n");
}
return 0;

}
第十二题
题意:把一个偶数拆成两个不同素数的和,有几种拆法呢?
思路:
判断素数可以用函数实现,为防止超时,不可以从1到n依次判断
若一个数为i则另一个数为n-i。
细节处理:
这两个素数不相等。
总结:
用函数实现部分功能,使程序更简练方便,同时可以避免超时
#include
using namespace std;
bool prime(int n)
{
if(n2 || n3)
return 1;
if(n%6!=1 && n%6!=5)
return 0;
for( int i=5;i*i<=n;i=i+6)
{
if(n%i==0 || n%(i+2)0)
return 0;
}
return 1;
}
int main()
{
int n,i,t;
while(cin>>n)
{
t=0;
if(n
0)
{
return 0;
}
for(i=2;i<=n/2;i++)
{
if(prime(i)==1 && prime(n-i)==1 && i!=n-i)
t++;

    }
    cout<<t<<endl;
}

}

第十三题
题意:第一天悟空吃掉桃子总数一半多一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。聪明的你,请帮悟空算一下,他第一天开始吃的时候桃子一共有多少个呢?
思路:
题目要求第一天的桃子,因此想到从第n天逆推回去;具体用数组实现
细节处理

a[i-1]=(a[i]+1)*2
i从n到2
即可得出第一项

#include
#include<stdio.h>
#include
using namespace std;

int a[3000];
int main()
{
int i,n;
while(cin>>n)
{
a[n]=1;
for(i=n;i>=2;i–)
{
a[i-1]=(a[i]+1)*2;
}
cout<<a[1]<<endl;

}

}
第十四题
题意
大家都知道,手机号是一个11位长的数字串,同时,作为学生,还可以申请加入校园网,如果加入成功,你将另外拥有一个短号。假设所有的短号都是是 6+手机号的后5位,比如号码为13512345678的手机,对应的短号就是645678。
现在,如果给你一个11位长的手机号码,你能找出对应的短号吗?
思路:
十一位的号码如果定义为整型显然会超限,因此要把它定义为字符
只需输出后六位 即可。
实现细节:
第一位为6,需要单独输出
注意字符型的头文件
总结:
在不进行运算的前提下,数字也可以定义为字符型
方便问题的处理
#include
#include<stdio.h>
using namespace std;
char a[100];
int main()
{
long long int n,i,j,h;
cin>>n;
for(i=1;i<=n;i++)
{

  cin>>a;
  cout<<"6";
  for(j=6;j<=10;j++)
  {
      cout<<a[j];
  }
  cout<<endl;
}

}
第十五题
题意:
有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。
其中,蜂房的结构如下所示。

思路:
这也是一个找数学规律的题,写出前三项后即可往以后递推
F(n)=f(n-1)+f(n-2)
细节处理:
这个公式的实现需要用到数组,但到了三项以后才出现规律
因此数组要从第三项开始。
总结:
编程与数学有天然的关系,许多数学公式都可以用程序实现和证明,将数学方法运用到编程中,有助于问题的解决。
#include
using namespace std;
long long int a[55]={0,1,2};
int main()
{
long long int n,i,j,h,g;
cin>>n;
for(i=1;i<=n;i++)
{
for(j=3;j<=55;j++)
{
a[j]=a[j-1]+a[j-2];
}
cin>>h>>g;
cout<<a[g-h]<<endl;
}
}

猜你喜欢

转载自blog.csdn.net/qq_43643582/article/details/85840003