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

 

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

                     

 

 

班级:20184               学号: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:题意:工资都是正整数,人民币一共有1005010521元六种,准备多少张,才不用找零?

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进制数的最后一位。特别的1016进制的转化,因为字母的引入,不能直接对于数组进行直接的输出,这里可以使用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:题意:两个时间AB都是由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:题意:求AB次方的最后三位数表示的整数。

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-1,i-2号房间,而从i-1i-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,An1C1,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整除,找到满足的数,即可;当ab都为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-23  +  n-3.....
那么只需将in=2开始判断(1不是素数)in-i是否为素数,前提是i<n/2,因为n是偶数。
判断是否为素数,判断到sqrtn)。

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,每次nr求余,令nr的整数为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=15x,y是否存在。

2:思路:在条件循环下,判断in-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语言快速提升,不是嘴上说说,而是真的采取行动,希望下学期有个崭新的自己。最后希望老师能在这给予鼓励,谢谢老师!

 

 

 

 

 

 

           

 

 

 

 

 


 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值