程序设计报告

第一组
1

第21题

题目概括:

求6+手机号码后五位。

输入数据的第一行是一个N(表示有N个数据),接下来的N行每一行为一个11位的手机号码。输出应包括N行,每行包括一个对应的短号,保证顺序一致。
代码

#include<stdio.h>

int main()

{

long long int a,i,b,n=0;

scanf("%lld",&a);

for(i=1;i<=a;i++)

{

    scanf("%lld",&b);

    n=600000+b%100000;

    printf("%d\n",n);

}

return 0;

}

解析:令b为手机号码,令a为数字的上限。

总结:其实这道题并不难,但是就是好几次都不对。当一个一个试的时候即b%10;b%100……

后来才发现是格式错误,应该用longlongint

一开始只用了int。

2

第24题

题目概括:

帮妈妈求每天买菜的菜价,即为数量乘单价相加。输入含有一些数据组,每组数据包括菜种(字串),数量(计量单位不论,一律为double型数)和单价(double型数,表示人民币元数)。在支付的时候采用四舍五入的方法把分头去掉。

代码:

#include <stdio.h>

int main()

{

double n, p, sum;

while (~scanf("%*s%lf%lf", &n, &p))

sum += n * p;

printf("%.1lf\n", sum);

return 0;

}

解析:

令n,p,分别为菜的数量和单价。因为n,p的值都是可变的,即不断改变n,p的值,所以用while输入。最后在相乘并求和。

总结:

这道题解题思路并不难,主要难点在于菜名字符串的输入与定义。

3

第23题

题目概括:

对于每次给出的一个牌照区间号,去掉带有4和62的车牌号,推断出交管局今次又要实际上给多少辆新的士车上牌照了。

代码:

#include<stdio.h>

int main()

{

 int n,m,i,j=0,a;

 while(scanf("%d %d",&n,&m)!=EOF)

 {

      if(n==0&&m==0)

         {

             break;

         }

     for(i=n;i<=m;i++)

     {

         j++;

         for(a=i;a>=1;a=a/10)

         {

             if(a%10==4)

             {

                 j--;

                 break;

             }

             if(a%100==62)

             {

                 j--;

                 break;

            }

         }

     }

     printf("%d\n",j);

     j=0;

 }

 return 0;

}

解析:

n,m即为题目中的描述的牌照区间号。a为车牌号号码,每次以a/10作为循环的下一次开始,一位一位的判断是否含有数字4,a%100以没两位为判断是否含有62。j为牌照数量的循环。两次break保证没有重复的相减。

总结:

这道题我觉得有些难,一开始卡a数位减少的循环在62的判断。思路很是混乱,而且还没有想到break。经过同学的指点,才完成了这道题。

4

第7题

题目概括:

评委会给选手打分,去掉一个最高分和一个最低分,然后计算平均得分。

代码:

#include<stdio.h>

int main()

{

int n,i,x;

double a=0,b=100,c=0,d=0;

while(scanf("%d",&n)!=EOF)

{

for(i=1;i<=n;i++)

{

scanf("%d",&x);

c=c+x;

if(a<x)

{

a=x;

}

if(b>x)

{

b=x;

}

}

d=(c-a-b)/(n-2);

printf("%.2lf\n",d);

c=0;

a=0;

b=100;

}

return 0;

}

解析:一个循环,两个if。不断的比较a与x的大小,并将x的赋值给a,最终求出a为最大值。不断的比较b与x的大小,并将x的值赋值给b,最终求出b为最小值。最后别忘了,将c,a,b全都化为初始值。

总结:难点在于最大值和最小值的判断。

5

第1题

题目概括:

输入一个百分制的成绩t,将其转换成对应的等级,具体转换规则如下:

90100为A;8089为B;7079为C;6069为D 0~59为E;

代码:

#include<stdio.h>

int main()

{

int b;

while(scanf("%d",&b)!=EOF)

{

if(b>=90&&b<=100) printf(“A”);

if(b>=80&&b<=89) printf(“B”);

if(b>=70&&b<=79) printf(“C”);

if(b>=60&&b<=69) printf(“D”);

if(b>=0&&b<=59) printf(“E”);

if(b<0||b>100) printf(“Score is error!”);

printf("\n");

}

return 0;

}

解题思路:

输入一个数,用if判断是否在其区间内。

总结:

这道题并不难,但是因为这道题我再也不会忘记加EOF了,一开始是死循环,后来检查了好多遍才发现是忘记加EOF。

6

第17题

题目概括:

两个数中任何一个数都是另一个数的真约数之和,则这两个数就是亲和数。 判断给定的两个数是否是亲和数。

代码:

#include<stdio.h>

int main()

{

int a,b,sum,c,i,j,m;

scanf("%d",&m);

for(k=1;k<=m;i++)

{

scanf("%d%d",&a,&b);

sum=0;

for(i=1;i<a;i++)

{

if(a%i==0)

sum=sum+i;

}

c=0;

for(i=1;i<b;i++)

{ if(b%i==0)

c=c+i;}

if(ac&&bsum)

printf(“YES\n”);

else

printf(“NO\n”);

}

return 0;

}

解析:

先用一个大循环使其符合一共m个例子。然后嵌套使用循环寻找a的因子,相加得sum。并列使用循环寻找b的因子,相加得c。根据亲和数的定义,用if语句进行判断。

总结:(易错点)

别忘记加大循环,判断一共有几个例子的。

7

第8题

题目概括:有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初生一头小母牛。求在第n年的时候,共有多少头母牛。

代码:

#include

using namespace std;

int main()

{

int n,i,j;

int a[56] ;

a[1]=1;

a[2]=2;

a[3]=3;

int maxIndex = 2;

while(cin>>n)

{

if(n == 0)

{

break;

}

if(n <= maxIndex + 1)

{

cout<<a[n - 1]<<endl;

}

else

{

for(i = maxIndex + 1;i < n;i++)

{

a[i] = a[i - 1] + a[i - 3];

}

maxIndex = n - 1;

cout<<a[n - 1]<<endl;

}

}

}

解析:

f(n)=1 0<n<4 f(n)=f(n-3)+f(n-1) n>3

f(n)是第n年有的牛数。

第四年后,牛的数量由两部分构成。去年的所有牛f(n-1)。由于不是所有牛都能生小牛,只有3牛以前的老牛才会生小牛,而每只老牛只生一只小牛,第n年所生牛的数量就应该是f(n-3)。

总结:

递推原则,定义函数。

8

第13题

题目概括

输入一个十进制数N,将它转换成R进制数输出。

代码

错误代码

#include<stdio.h>

int main()

{

int n,a,m,i;

while(scanf("%d%d",&n,&m)!=EOF)

{

    while(n)

    a+=n%m;

    n=n/m;

    printf("%d",a);

}

return 0;

}

错题分析&解题分析

当时做这道题的时候想到例如10进制转换为16进制的方法一个10进制数除以16.连续除.每次的余数即为这个数的16进制数。

9

第12题

题目概括

“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。请写一个程序判断读入的字符串是否是“回文”。

代码

#include<stdio.h>

#include<math.h>

#include<string.h>

int main(void)

{

int n,l,i,j;

char s[100];

while(scanf("%d",&n)!=EOF)

{

    getchar();

    while(n--)

    {

        gets(s);

        l=strlen(s);

        i=0;

        j=l-1;

        while(i<j)

        {

            if(s[i]!=s[j])

            break;

i++;

            j--;

        }

        if(i>=j)

        printf("yes\n");

        else

        printf("no\n");

    }

    return 0;

}

}

错误代码

#include<stdio.h>
int main()
{
int c,n=0,i;
char a;
char b[1001];
while(scanf("%d",&c)!=EOF)
{
for(i=1;i<=1000;i++)
{
scanf("%c",&a);
b[i]=a;
n++;
}
printf("%d",n);
}
for(i=1;i<=n;i++)
{
if(b[i]==b[n-i+1])
printf(“yes”);
else
printf(“no”);
}
return 0;
}

错误分析&解题分析

本来是想将单词分解成字母,从第一字母开始与最后一个字母进行比较。但是如果是这样的话最后的结果也将会是字母的形式出现而非是一个单词。

第二组
10

第一题

题目概括:

第一天吃掉桃子总数一半多一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。求第一天开始吃的时候桃子一共有多少个。

代码:

#include<stdio.h>

int main()

{

int n,a=1,i,j;

while(scanf("%d\n",&n)!=EOF)

{

for(i=(n-1);i>=1;i--)

{

    a=(a+1)*2;

}

printf("%d\n",a);

a=1;

}

return 0;

}

解析:

while循环输入n天,根据题意分析可得,第n天的桃子数量等于后一天的数量加1然后再乘2。

注意n和a都要换行。

总结:

一般格式错误都是没有换行。

11

第8题

题目概括:

把一个字符三角形掏空。不同的字符表示不同的花纹,整数n表示等腰三角形的高。显然其底边长为2n-1。如果遇到@字符,则结束。

代码:

#include <stdio.h>

int main()

{

int n;

char a;

int t=0;

while(scanf("%c",&a)!=EOF)

{

    if (a=='@') break;

    if (t++) printf("\n");

    scanf("%d",&a);

    for(int i=1;i<n;i++) printf(" "); printf("%c\n",a);

    for(int i=1;i<n;i++)

    {

        for(int j=1;j<=a-i-1;j++) printf(" ");

        printf("%c",a);

        for(int j=1;j<=2*i-1;j++)

         if (i==n-1) printf("%c",a); else printf(" ");

        printf("%c\n",a);

    }

}

return 0;

}

解析:

循环输入字符,即花纹。内部进行空心三角形的循环。先是遇到@符号break跳出。然后用if进行行数增加时的换行。然后根据行数和最后一行花纹数量,进行空格和花纹的输入。

总结:

@符号不要忘了加‘’单引号。

这种题目经常出现变换。其实我还没有很清楚怎么输入空格和花纹。

12

第六题

题目概括:

一个数的十进制数表示,其四位数字之和为2+9+9+2=22,它的十六进制数BB0,其四位数字之和也为22,同时它的十二进制数表示1894,其四位数字之和也为22。命名其为Sky数。判断任何一个十进制的四位数,是否为Sky数。

代码.:

#include<stdio.h>

int main()

{

int a;

while(scanf("%d",&a),a)

{

int x,y=0,z=0,t;

x=a%10+a/10%10+a/100%10+a/1000;

    t=a;

while(t)

{

y+=t%16;

t/=16;

}

if(y!=x)

{

printf("%d is not a Sky Number.\n",a);

}

else

{

t=a;

while(t)

{

z+=t%12;

t/=12;

}

if(x!=z)

printf("%d is not a Sky Number.\n",a);

else

printf("%d is a Sky Number.\n",a);

}

}

return 0;

}

题目解析:

本题即为一个转换进制的问题。突破点在于掌握10进制转换为16和12进制的方法。即为将一个10进制数除以16.连续除.每次的余数即为这个数的16进制数。

13

第七题

题目概括:

代码:

#include

#include

#include

using namespace std;

int main(){

int n,m;

int x,y,a,b;

while(cin>>n>>m){

    if(n==0&&m==0)break;

    x=n*n-4*m;

    if(x<0)cout<<"No"<<endl;

    else{

        y=sqrtf(x);

        if(y*y!=x)cout<<"No"<<endl;

        else{

            a=n+y;

            b=n-y;

            //cout<<a/2<<" "<<b/2<<endl;

            if(a%2!=0||b%2!=0)cout<<"No"<<endl;

            else cout<<"Yes"<<endl;

        }

    }

}

return 0;

}

错误代码

#include<stdio.h>

#include<math.h>

int main()

{

int n,m,i,j,x=0;

while(scanf("%d %d",&n,&m)!=EOF)

{

    if(m==0&&n==0) break;

    for(i=-10001;i<=10000;i++)

    {

        for(j=-10001;j<=10000;j++)

        {

            if(i*j==m&&i+j==n)

            x++;

        }

    }

        if(x!=0)

        printf("YES");

        else

        printf("NO");

}

return 0;

}

解题步骤&错题解析:

m和n的数字太大了,运行时间太长。

重新分析题意,可以改成一个公式,即联立x+y=n;xy=m------>x^2-xn+m=0;

有两个不同解条件是nn-4m>0

两个根x1=(n+sqrt(nn-4m))/2;x2=(n-sqrt(nn-4m))/2;

此时只要判断x1, x2是否为整数。

14

第5题

题目概括:

把一个偶数拆成两个不同素数的和,求有几种拆法。输入包含一些正的偶数,其值不会超过10000,个数不会超过500,若遇0,则结束。

对应每个偶数,输出其拆成不同素数的个数,每个结果占一行。

代码:

#include<stdio.h>

#include<math.h>

int main()

{

long n,i,j,f,count;

while(scanf("%ld",&n)!=EOF)

{ if(n==0)break;

for(i=3,count=0;i<=n/2;i+=2)

{

for(j=2,f=0;j<=sqrt(i);j++)

if(i%j==0){f=1;break;}

if(f==0)

for(j=2,f=0;j<=sqrt(n-i);j++)

if((n-i)%j==0){f=1;break;}

if(f==0&&i!=(n-i))

{ count++;

}

}

printf("%ld\n",count);

}

return 0;

}

错误代码:

#include<stdio.h>

int main()

{

int k,i,m[501],n[501],j,a,b;

while(scanf("%d",&b)!=EOF)

{

    for(k=1;k<=b;k++)

    {

       for(i=1;i<=500;i++)

       {

           scanf("%d %d",&m[i],&n[i]);

         for(j=1;j<=500;j++)

         {

            if(m[i]==n[j])

            a++;

            if(m[i]==0||n[j]==0)

            break;

         }

       }

      printf("%d",&a);

    if(m[i]==0||n[j]==0)

    break;

    }

}

}

错题分析和解题思路:

循环出了问题,例如m[i]=7,这个循环将会循环很多次,而非我们想象的一样。

而且判断素数是其难点,即利用循环判断n是否可以被2到n-1整除。

15

第一题

题目概括:只让找到partner的人去坐过山车,其他的人也不可以。求最多有多少对组合可以坐上过山车。

代码:#include<stdio.h>

#include<string.h>

int a[1100], b[1100], map[1100][1100],mark[1100], m, n;

int path(int x)

{

int y;

for(y = 1; y <= n; y++)

{

if(map[x][y] && !mark[y])

{

mark[y] = 1;

if( b[y] == -1 || path(b[y]))

{

a[x] = y;

b[y] = x;

return 1;

}

}

}

return 0;

}

int main()

{

int i, j, k, x, y, sum;

while(scanf("%d", &k) != EOF && k)

{

memset(a, -1, sizeof(a));

memset(b, -1, sizeof(b));

memset(map, 0, sizeof(map));

scanf("%d%d", &m, &n);

for(i = 0; i < k; i++)

{

scanf("%d%d", &x, &y);

map[x][y] = 1;

}

sum = 0;

for(i = 1; i <= m; i++)

{

if(a[i] == -1)

{

memset(mark, 0, sizeof(mark));

sum += path(i);

}

}

printf("%d\n", sum);

}

return 0;

}

错题分析&解题分析

当时的想法是只是单纯看女生的那一列,计算每个数字出现了多少次并输出出现次数最多的数字的次数。但是这是解题方法出现了问题,后经百度看到了匈牙利算法,这次程序设计报告以这道题收录这道题,并以这道题结尾,以拓宽以后的解题方法,

匈牙利算法,是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径。

总结
经过这一个学期c++的学习,真的对它有很大的感触。自认为这课要比数学难。它不仅仅要顾及算法还要顾及一些c语言的语法。学习过程中遇到过很多很多的难题,也不断的想要放弃,现在想想也没有什么真正意义上的难,不过是自己对于这门从未接触过的课的抵触。但是它也确实给我打开了一扇通往物联网的门,让我了解到更广阔的天地。虽然我的c语言成绩不好,虽然我不想再在下一学期继续选择这门课。但是真的特别感谢老师,感谢c语言,感谢在c语言学习过程中发现了新世界和新的我。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CSU 大一上 C语言实验报告 (1)教材第2章编程题第2题:编计算球体体积的程序。 说明:本题声明适当变量,用户键入数据,运算并输出结果,较简单。 (2)教材第2章编程题第8题:编程序计算第一、第二、第三月还贷后剩余贷款金额。 说明:本题要求用户输入总额、利率、每月还贷净额,输出每月剩余,对输入输出、类型定义考查。 (3)教材第3章编程题第2题:编程序实现对用户输入的产品信息进行格式化。 说明:本题考查格式化输入输出、转义字符的运用。 (4)教材第4章编程题第4题:编程序实现将输入的整数按八进制输出。 说明:本题重在考查简单的运算符和表达式运用。 (5)用户输入一个三位数,输出各位数字之和。 说明:本题重在考查如何从一个整数中取出每一个数字。 (6)教材第5章编程题第5题:编程序计算用户输入所得额的税金。 说明:本题考查简单的选择结构。 (7)教材第5章编程题第11题:编程序实现将用户输入的两位数转化为英文。 说明:本题考查switch语句的应用。 (8)教材第6章编程题第8题:编程序显示单月日历,用户指定这个月的天数和该月起始日是星期几。 说明:本题考查循环结构和选择结构的综合应用,判断是否一个星期最后一天,换行符。 (9)教材第6章编程题第11题:编程序实现利用无穷级数法估计e的值。 说明:本题考查根据公式设计循环结构并实现。 (10)因子之和等于其本身的数称为完数,如28的因子为1、2、4、7、14,而28=1+2+4+7+14,因此28为完数。编程序找出2~5000中的完数。 说明:本题利用变量i在2~5000中变化,判断其是否是完数。 (11)教材第7章编程题第12题:编程计算从左至右求值的表达式的值。 说明:本题考查对运算符和操作数的判断。 (12)教材第7章编程题第14题:编程序用牛顿计算法计算浮点数平方根。 说明:本题考查对循环结构的掌握,对表达式的合理运用,对基本类型的理解。 (13)教材第8章编程题第14题:编程序颠倒句子中单词的顺序。 说明:本题考查对字符数组的处理,对一些循环选择结构的理解。 (14)教材第8章编程题第15题:编程序实现凯撒密码加密。 说明:本题考查对字符数组的掌握,对字符处理的理解。 (15)编程序实现将用户输入的数字字符串转化为整数输出。 说明:本题考察对字符、整数关系的掌握与理解,对循环结构的熟练运用。 (16)教材第9章编程题第1题:编选择排序的函数,并递归调用。 说明:本题利用函数简化程序、使得结构更清晰、熟练掌握。 (17)教材第9章编程题第7题:编计算xn的函数。 说明:本题考查函数定义、调用,并初步考察递归运用。 (18)教材第10章编程题第6题:编程序实现逆波兰运算。 说明:本题考查对程序每部分的理解、掌握,外部、内部变量,主函数,小函数的编与应用。初步了解栈的一些实现函数。 (19)编程序找出2~5000中满足条件的数x:x是素数且x的每位数字是素数、每位数字之和是素数,如23、223、2333等。 说明:本题考查函数方法与循环选择结构的综合运用。 (20)教材第11章编程题第3题:用指针变量编简化一个分数的函数。 说明:本题用来解决函数无法传回传递的实际参数,指针变量。 (21)教材第12章编程题第2题:编函数读入用户输入的一条消息,检测是否是回文,分别用数组、指针来解决。 说明:本题可以体会到数组与指针的特点,利用指针的便利。 (22)利用指针编程序,实现从键盘键入字符串,将此字符串从m个字符开始的n个字符复制成另一个字符串。 说明:本题用指针指向字符串,进行跟踪和复制操作。 (23)教材第13章编程题第5题:编程序实现对输入命令行参数求和。 说明:本题加深对命令行参数的理解、考查知识的综合应用。 (24)教材第16章编程题第5题:用结构变量解决搜索离用户输入时间最近的航班信息,并输出。 说明:本题考查结构与数组的结合运用,有助于理解结构。首先,定义一个存储起飞、到达时间的结构,再定义一个该类型的数组,循环搜索即可。 (25)教材第17章编程题第5题:用指针数组存储键入的字符串,对数组排序。 说明:本题应用动态分配内存、数组排序,考查综合能力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值