c语言程序设计作业


《c++程序设计》课程设计报告

 

班级:_______________数学类一班__________学号:_________2018212725____

报告人姓名:____张喆_______  

实验地点: ___________________________________

完成起止日期: __________2018年12月30日至2019年1月4日____________________

 

 

 

 

 

 

 

 


problem A
题目描述
多组数据的输入,将不同范围内的分数通过不同的字母进行表达
思路
首先通过while输入多组数据,第一组用if语句来界定其范围,之后通过else-if的来界定每一个数值所代表的范围,最后输出每个数值所代表的等级
细节
要注意while的运用时注意添加花括号,并且要用else-if来定义其数值范围,输出时要注意换行
源程序
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{    int t;
    while(scanf("%d",&t)==1)
    {if(t>=90&&t<=100)
        printf("A\n");
    else if(t>=80&&t<=89)
        printf("B\n");
    else if(t>=70&&t<=79)
        printf("C\n");
        else
    if(t>=60&&t<=69)
        printf("D\n");else
    if(t>=0&&t<=59)
        printf("E\n");
problem B
题目描述
输出一个三位数,其各位数字的立方和等于这个数,例如1^3+5^3+3^3=153(水仙花数),要求输出在指定范围内的水仙花数。
思路
首先定义两个数组,将数组中的各位数字都定义出来,判断是否是符合水仙花数的标准,将水仙花数放在一个数组中,找到水仙花数后再界定范围,在指定范围内循环,将原来数组中的水仙花数在指定范围的数组中排好序,然后输出
细节
注意输出时的数字要从小到大排序,而且注意要用空格隔开所输出的数据。
源程序
#include <iostream>
using namespace std;
int f[1010],g[1010];
int main()
{
    int m,n,a,b,c;
        for(int i=100;i<=900;i++)
        {   a=i/100;
            b=(i-a*100)/10;
            c=(i-a*100-b*10);
            if(i==a*a*a+b*b*b+c*c*c)
            f[i]=i;
            }
    while(cin>>m>>n)
    {
          int d=0;
          for(int i=m;i<=n;i++)
         {
             if(f[i]!=0)
             g[d++]=f[i];
             }
            if(d==0)
            cout<<"no"<<endl;
            else
            {
                for(int i=0;i<d-1;i++)
                cout<<g[i]<<" ";
                cout<<g[d-1]<<endl;}
                }
    return 0;
}

 

 

 

 

 

 

 

 

 

 

 

 


problem C
题目描述
求一组数据中奇数的乘积
思路
首先,定义一个数组,通过循环中加入if条件语句找出这组数据中的奇数,在将所有奇数的乘积赋为一个变量,最后输出。
细节
定义了循环n次的数组输出时需要换行
源程序
#include <iostream>
#define N 1000+10
using namespace std;
int a[N];
int main()
{
    int n;
    while(cin>>n)
    {
        int x=1;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
            if(a[i]%2!=0)
            x*=a[i];
        }
        cout<<x<<endl;
    }
    return 0;
}

problem D
题目描述
判断表达式范围内的值是否都为素数
思路
首先,先定义一个数组,这个数组中经过循环后,将循环中所有的素数赋值为一个数字,不是素数的赋值为一个数字,然后在界定范围,再在范围之内通过表达式来判断是否都为素数。
细节
要注意范围的x,y都等于零时要单独跳出,而且输出的时候记得需要换行。若是不知道数组的范围就尽量在合理的单位下放大。
源程序
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int a[11000];
int main()
{
    int i,j,x,y,flag=1,s=0;
    for(i=2;i<11000;i++)
    {
        a[i]=1;
        for(j=2;j<=sqrt(i);j++)
        {
            if(i%j==0)
            a[i]=0;
        }
    }
    while(cin>>x>>y)
    {
        flag=1;
        if(x==0&&y==0)
        break;
        else
        {
            for(i=x;i<=y;i++)
            {
                s=i*i+i+41;
                if(!a[s])
                {
                    flag=0;
                    break;
                }
            }
            if(flag)
            cout<<"OK"<<endl;
            else    
            cout<<"Sorry"<<endl;
        }
    }
    return 0;
}  

 

 

 

 

 

 

 

 


 problem G
题目描述
求一组数据中去掉最高值和最低值之后的平均分
思路
首先,用while将这一组评委打分的数据先输入,然后再通过sort将这一组数据进行排序,排序之后在进行循环累加(循环除了最左侧和最右侧的两个数),然后求出平均值。
细节
一定要注意输入的评委人数不能是零,sort进行的排序是前开后闭,因此一定要注意范围,输出时也要注意需要保留两位小数,最后输出结果还要换行。
源程序
#include <stdio.h>
#include <math.h>
#include <algorithm>
using namespace std;
int main()
{
    int n,i;
    double sum=0,m[110],s;
    while (scanf("%d",&n)!=EOF)
    {
        sum=0;
        for (i=0;i<n;i++)
        {
            scanf("%lf",&m[i]);
        }
            sort(m,m+n);
        for (i=1;i<n-1;i++)
        {
            sum=sum+m[i];
        }
        s=sum/(n-2);


    printf("%.2lf\n",s);
    }
    return 0;
}

 


problem H
题目描述
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
思路
首先,这道题作为应用题,是有一定的规律的,我们找到规律后再进行编程,通过寻找规律可知,每四年一个周期,除了前四年只有大母牛之外,以后的时间每四年为一个周期a[i]=a[i-1]+a[i-3],先定义一个数组,然后while将数据输入,最后输出数组中对应的数字即可。
细节
注意要避免n等于0的这种情况时不做处理,其输出结果也需要换行
源程序
#include <cstdio>
int a[60];
int main()
{
    int n;
    a[1] = 1;
    a[2] = 2;
    a[3] = 3;
    a[4] = 4;
    for(int i=5;i <= 60;i++)
        a[i] = a[i-1] + a[i-3];
    while(scanf("%d",&n) && n != 0)
    {
        printf("%d\n",a[n]);
    }
    return 0;
}

 


problem i
题目描述
输入一组数据,将这一组数据按照绝对值由大到小排列,所有数的绝对值不等。
思路
首先先定义一个数组,将数组输入后通过冒泡排序将数组内的数据进行排序,最后输出其按照绝对值排序之后变化的原来的数组。
细节
要注意输出后的结果排序时之间需要空格,最后的输出结果需要换行,注意n=0时的时候是不做处理的。
源程序

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int a[110];
int main()
{
    int n,q,k;
    while(cin>>n&&n!=0)
    {
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];   }
        for(int i=1;i<=n-1;i++)
        for(int j=1;j<=n-i;j++)
            if(a[j]*a[j]<a[j+1]*a[j+1])
            {
                q=a[j];
                a[j]=a[j+1];
                a[j+1]=q;
                }
            for(k=1;k<=n-1;k++)
            cout<<a[k]<<" ";
            cout<<a[n]<<endl;}
    return 0;
}

 

 

 


problem J
题目描述
有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数x,请将该数插入到序列中,并使新的序列仍然有序。
思路
首先,我们定义了一个数组以后,将这个数组的最后一项定义为我们要插入的那个数,然后用sort对这个数组中的数进行排序。得到的新的排序之后的就是我们要的数组。
细节
注意n不等于零,并且sort前开后闭,注意其所对应的范围。除了要注意数据之间的空格,还要注意换行。
源程序

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int a[110];
int main()
{
    int n,x;
    while(cin>>n>>x)
    {
        if(n==0&&x==0)
        break;
        else
        {
            for(int i=0;i<n;i++)
            cin>>a[i];
            a[n]=x;
            sort(a,a+n+1);
            for(int i=0;i<n;i++)
            cout<<a[i]<<" ";
            cout<<a[n]<<endl;
            }
            }
            return 0;
}


problem K
题目描述
老师的工资都是正整数,单位元,人民币一共有100元、50元、10元、5元、2元和1元六种。最少需要准备多少张人民币,才能在给每位老师发工资的时候都不用老师找零呢?
思路
首先,可以通过不同的钱数分出不同的情况,比100大的,比50大的……假设165元的话,我们可以先将这100的工资发给她,然后以此类推,再发50,再发10块,这样发到最后就会把这人民币的张数得出来了
细节
注意要用else-if来界定其判定条件,然后采用累加的方式将票数算出,到最后不能让钱数>=1,直接等于1时就直接输出即可。
源程序
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int a[110];
int main()
{  int n,sum;
    while(cin>>n)
    {  sum=0;
          if(n==0)
          break;
        for(int i=1;i<=n;i++)
        {   cin>>a[i];
           while(a[i])
        {    if(a[i]>=100)
                {a[i]=a[i]-100;
                sum=sum+1;}
            else if(a[i]>=50)
                {a[i]=a[i]-50;
                sum=sum+1;}
            else if(a[i]>=10)
                {a[i]=a[i]-10;
                sum=sum+1;}
            else if(a[i]>=5)
                {a[i]=a[i]-5;
                sum=sum+1;}
            else if(a[i]>=2)
                {a[i]=a[i]-2;
                sum=sum+1;}
            else if(a[i]==1)
                {a[i]=a[i]-1;
                sum=sum+1;} }   }
                cout<<sum<<endl;  }
            return 0;
}
problem L
题目描述
写一个程序判断字符串是否是回文串
思路
首先定义一个数组,先定义这个数组的长度,然后知道长度之后,将数组从前从后同时进行循环,如果循环的过程中有一个不相同,就不是回文串,若都相同,则为回文串。
细节
用strlen(s)来定义字符串长度,如果不相同的话,首先要跳出循环,然后再继续进行后面的程序。
源程序
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int main()
{
    int n,i,len,j;
    char s[100];
    while(cin>>n)
    {
        getchar();
        while(n--)
        {
            gets(s);
            len=strlen(s);
            i=0;j=len-1;
            while(i<j)
            {
                if(s[i]!=s[j])
                break;
                i++;
                j--;
            }
            if(i>=j)
            cout<<"yes"<<endl;
            else
            cout<<"no"<<endl;
        }
    }
}


problem M
题目描述
输入一个十进制数N,将它转换成R进制数输出
思路

十进制数在转换成任何进制数时,均为除其进制取余
细节
注意n与r不能等于0,注意输出的换行
源程序
#include<stdio.h>
#include<string.h>
int main()
{
    int n,r,i;
    while(scanf("%d %d",&n,&r)!=EOF)
    {
        if(n<0)
        {
            printf("-");n=-n;
        }
        if(n==0){printf("0\n");}
        int c=0,a[100];
        while(n)
        {
            a[c]=(n%r);
            c++;
            n/=r;
        }
        for(i=c-1;i>=0;i--)
        {
            if(a[i]>=10)
            {
                printf("%c",'A'+a[i]-10);
            }
            else printf("%d",a[i]);
        }
        printf("\n");
    }
}

 

 

 

 

 

problem N
题目描述
A和B不是简单的整数,而是两个时间,A和B 都是由3个整数组成,分别表示时分秒,比如,假设A为34 45 56,就表示A所表示的时间是34小时 45分钟 56秒。对于每个测试实例,输出A+B,每个输出结果也是由时分秒3部分组成,同时也要满足时间的规则
思路
首先将A和B的时,分,秒定义出来,然后根据满60进一的选择,进行加和,若秒满六十,分加一,若分满六十,时加一,以此类推,最后输出B,因为最后的B是加上A之后的。
细节
注意数据的合法性,并且注意数据之间的空格,每个相加的时间都是需要换行的。
源程序
#include<stdio.h>
int main()
{
    int n;
    int AH,AM,AS,BH,BM,BS,SH,SM,SS;
    scanf("%d",&n);
    while(n--)
    {
        SH=SM=SS=0;
        scanf("%d %d %d %d %d %d",&AH,&AM,&AS,&BH,&BM,&BS);                              
        SS=AS+BS;
        if(SS>=60)
        {
            SS-=60;
            SM+=1;
        }     
        SM=SM+AM+BM;
        if(SM>=60)  
        {
            SM-=60;
            SH+=1;      
        }          
        SH=SH+AH+BH;
        printf("%d %d %d\n",SH,SM,SS); 
    }       
    return 0;    

 

problem O
题目描述
集合的减法,求集合的差集,两个集合的差集排序输出,若是空集输出NULL
思路
用两个数组表示集合,如果集合A中的元素B中没有,则将元素赋值给另一个数组储存,并将元素的个数通过累加记录,最后排序输出,如果累加和为零,则输出NULL
细节
sort函数前闭后开排序时后面写的第一个是无效数据。注意多组输入,累加每一次都重新赋值为零。
源程序
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int a[110],b[110],c[210];
int main()
{
    int i,x,y,j,k,sum;
    while(cin>>x>>y)
    {
        if(!x&&!y)
        break;
        else
        {
            for(i=0;i<x;i++)
            cin>>a[i];
            for(i=0;i<y;i++)
            cin>>b[i];
            k=0;
            for(i=0;i<x;i++)
           {  
                sum=0;
                   for(j=0;j<y;j++ )
                {  
                    if(a[i]==b[j])
                       sum++;
                } 
                 if(sum==0)
                c[k++]=a[i];
            }
               if(k==0)    
            cout<<"NULL";
            else        
             { sort(c,c+k);
                 for(i=0;i<k;i++)
                  { 
                   cout<<c[i]<<" ";
                } }  }
        cout<<endl;}}
problem S
题目描述
有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。
其中,蜂房的结构如下所示。

思路
首先,这是一道应用题,假设到蜂房6,那么到蜂房6的路线数就是到蜂房5和蜂房4的和,到蜂房4就是到2和3的路线和,到蜂房5就是到3和4的路线和,以此类推,从而输出总共的路线数。由此我们分为两种情况,当两个蜂房的距离为1时,路线数就是1,大于等于2时就按照以上顺序输出。
细节
注意要用long long int,因为只用int的话数据会溢出,输出的数据要记得换行
源程序
#include<stdio.h>
int main()
{
    long long int c=1,d=1,M,N,i,j,t=0,a,b;
    while(scanf("%lld",&N)!=EOF)
    {
        for(i=1;i<=N;i++)
        {
            scanf("%lld %lld",&a,&b);
            M=b-a;
            if(M<2)
            {
                c=1;
                d=1;
            }
            if(M>=2)
            {
                for(j=1;j<=M-1;j++)
                {
                    t=c;
                    c=c+d;
                    d=t;
                }
            }
            printf("%lld\n",c);
            c=1;
            d=1;
        }
    }
    return 0;
}


problem U
题目描述
假设所有的短号都是是 6+手机号的后5位,比如号码为13512345678的手机,对应的短号就是645678。
现在,如果给你一个11位长的手机号码,你能找出对应的短号吗?
思路
首先将手机号定义在一个数组里,这个数组中的每一项都代表了手机号的一个位数,通过while将数组输入后,先输出6再将手机号的后六位依次输出,从而得到结果。
细节
记得循环时是从第七项开始,其默认a[0]为第一项,并且输出时记得换行。
源程序
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
char a[12];
int main()
{
        int N;
        cin>>N;
        while(N--)
        {
        scanf("%s",a);
        cout<<6;
        for(int j=6;j<11;j++)
        cout<<a[j];
        puts("");
        }
            return 0;
}

 

 

 

 

 

总结
在编写各类单片机功能程序时,不要急于书写,一定要先想出一个很好的结构和方法,虽然你写出来的程序可以正常运行,但是你是否想到了它的可维护性,可阅读性等等一些很重要的因素呢?所以一定要先想出一个很好的架构在来开始编写。
     程序是用特殊的编程语言写出来表达如何解决问题的 
 不是用编程语言来和计算机交谈、而是描述要求它如何做事的过程和方法 
 要多敲代码,只有写过足够多的代码才能熟练的运用,一开始我总是去看而不是自己动手,这样等到自己真正要用到的时候才发现有些东西只是自己以为懂了,真正用到的时候根本写不出来,十分尴尬。
     自学很重要。不论是老师讲的例题还是书上或是自己找的项目都要自己动手做,不会的尽量自己思考,百度查。如果要问别人尽量定位好自己不能解决的问题,而不是直接让人帮你看代码。
     要学会给自己的代码写注释,因为过了一段时间后可能自己想不起来当时的思路,这时注释可以帮助我们更好的复习自己的代码,同时在请求别人帮组的时候也更方便。
寻求最简的解法,用最简单的程序和最少的时间去解决问题,这应该是我们所追求的最高境界。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值