哈工大C语言--SSE改错02

改错20题

*四位整数的可逆素数

下面程序的功能是求所有四位整数的可逆素数(可逆素数指一个素数将其各位数字的顺序倒过来构成的反序数也是素数),目前程序中存在错误,请修改正确。并按照给出的程序运行结果示例检查修改后的程序。

#include <stdio.h>
#include <stdlib.h>

/*
    函数功能:判断某数是否为素数
    函数入口参数: 任意正整数
    函数返回值: 若该数为素数返回函数值为真
                 若不是素数返回函数值为假
*/

int  IsPrime(int x)
{
    int i;

    if(x==1)
    {
        return 0;
    }

    if(x==2)
    {
        return 1;
    }

    if(x>2)
    {
        for(i=2; i*i<=x+1; i++)
        {
            if(x%i==0)
            {
                return 0;
            }
        }
    }

    return 1;
}


/*
    函数功能:   求将任意正整数各位数字的顺序倒过来构成的反序数
    函数入口参数: 任意正整数
    函数返回值:  正整数的反序数

*/
int  Palindrome (int x)
{
    int sum,y,m;
    sum=0;

    do
    {
        sum=10*sum;
        m= x%10;
        sum=sum+m;
        x=x/10;
    }
    while (x/1!=0||m!=0);

    y=sum/10;

    return y;
}


int main()
{
    int i,n;

    for(i=1000; i<10000; i++)
    {
       if(!IsPrime(i))                                         
        {
           n = Palindrome(i);
           if(IsPrime(n))
               printf("%d\n",i);                    
        }
    }

    return 0;
}

正确运行结果: 1009 1021 1031 1033 1061 ', '

本来想直接打表的,后来看了一下还是很好改啊', '', '', '', '', '', '', '

#include <stdio.h>
#include <stdlib.h>

int  IsPrime(int x)
{
    int i;

    if(x==1)
    {
        return 0;
    }

    if(x==2)
    {
        return 1;
    }

    if(x>2)
    {
        for(i=2; i*i<=x+1; i++)
        {
            if(x%i==0)
            {
                return 0;
            }
        }
    }

    return 1;
}

int  Palindrome (int x)
{
    int sum,m;
    sum=0;

    while (x!=0)
    {
        sum=10*sum;
        m= x%10;
        sum=sum+m;
        x=x/10;
    }

    return sum;
}


int main()
{
    int i,n;

    for(i=1000; i<10000; i++)
    {
       if(IsPrime(i))                                         
        {
           n = Palindrome(i);
           if(IsPrime(n))
               printf("%d\n",i);                    
        }
    }

    return 0;
}

', 42),

(414, 324, '324', 'Q3008', '

*学生信息

将如下程序中的错误改正:

#include <stdio.h>
struct MYDATE
{  
    int  year,month,day;
}; 
struct STUDENT
{   char *name[20];
    int age;
    MYDATE BirthDate;
};
int prtSt(STUDENT *p);
int main()
{  
    STUDENT  st;

    gets(st.name);	    
    scanf("%d %d %d",&st.BirthDate.year, &st.BirthDate.month, &st.BirthDate.day);

    prtSt(&st);
    return 0;
}

int prtSt(STUDENT *pSt){ 

    printf("%s,%d,%d\n",pSt.name,pSt.age,pSt.year); 

    return ;
}

', '', '', '', '', '', '', '

#include <stdio.h>

struct MYDATE
{
    int  year;
    int month;
    int day;
};
struct STUDENT
{
    char name[20];//1
    int age;
    struct MYDATE BirthDate;//1
};
int prtSt(struct STUDENT *p);//1
int main()
{
    struct STUDENT  st;

    gets(st.name);
    scanf("%d %d %d", &st.BirthDate.year, &st.BirthDate.month, &st.BirthDate.day); //1

    st.age = 2015 - st.BirthDate.year;

    prtSt(&st);
    return 0;
}

int prtSt(struct  STUDENT *pSt)
{

    printf("%s,%d,%d\n", pSt->name, pSt->age, pSt->BirthDate.year); //1

    return 0;
}

', '', 20),

(422, 324, '324', 'Q280', 'Q280.(10分)

*海军节礼炮

在海军节开幕式上,有A、B、C三艘军舰要同时开始鸣放礼炮各21响。

已知A舰每隔5秒放1次,B舰每隔6秒放1次,C舰每隔7秒放1次。

假设各炮手对时间的掌握非常准确,

请编程计算观众总共可以听到几次礼炮声。

下面给出的程序有错误,请找到错误并改正之。

注意:请将修改正确后的完整源程序拷贝粘贴到答题区内。

对于没有错误的语句,请不要修改,修改原本正确的语句也要扣分。

当且仅当错误全部改正,且程序运行结果调试正确,才给加5分。

**输入输出格式要求:不要改变以下代码的输入输出格式。

', '', '', '', '', '', '', '', '

#include <stdio.h>
main()
{
    int  n, t;
    for (t=0; t<20*7; t++);
    {
        if (t%5 = 0 && t < 20*5);
        {
            n++;
        }
        if (t%6 = 0 && t < 20*6);
        {
            n++;
        }
        if (t%7 = 0);
        {
            n++;
        }
    }
    printf("n=%d\n", n);
}

#include <stdio.h>
main()
{
    int  n=0, t;
    for (t=0; t<=20*7; t++)
    {
        if (t%5 == 0 && t <= 20*5)
        {
            n++;
        }
        else if (t%6 == 0 && t <= 20*6)
        {
            n++;
        }
        else if (t%7 == 0)
        {
            n++;
        }
    }
    printf("n=%d\n", n);
}

', 4),

(461, 324, '324', 'Q3077', '

*两符号各异整数

程序改错-3 从键盘任意输入两个符号各异的整数,直到输入的两个整数满足要求为止,然后打印这两个数。请通过测试找出下面这个程序存在的问题(不止一个问题哦),并改正。同时用下面给出的运行结果示例检查修改后的程序。

#include <stdio.h>
int main()
{
    int x1, x2;
    do
    {
        printf("Input x1, x2:");
        scanf("%d,%d", &x1, &x2);
    }
    while (x1 * x2 > 0);
    printf("x1=%d,x2=%d\n", x1, x2);
    return 0;
}

程序正确的运行结果示例:

Input x1, x2: a,s↙

Input x1, x2: a,1↙

Input x1, x2: 2,s↙

Input x1, x2: 1,2↙

Input x1, x2: -1,-2↙

Input x1, x2: 0,3↙

Input x1, x2: 1.2,3.4↙

Input x1, x2: 1.2,5↙

Input x1, x2: -1,3↙

x1=-1,x2=3

输入格式: "%d,%d"

输入提示信息:"Input x1, x2:\n"

输出格式:"x1=%d,x2=%d\n"', '', '', '', '', '', '', '', '

#include <stdio.h>
int main()
{
    int x1=0, x2=0;
    char s[100];
    do
    {
        printf("Input x1, x2:\n");
        if (scanf("%d,%d", &x1, &x2)!=2)
        gets(s);
    }
    while (x1 * x2 >= 0);
    printf("x1=%d,x2=%d\n", x1, x2);
    return 0;
}

', 20),

(476, 324, '324', 'Q153', '(5分)

*统计字符

附加题:改错题:输入一行字符,统计其中的英文字符、数字字符、

空格及其它字符的个数。下面程序中存在比较隐蔽的错误,

请通过分析和调试程序,发现并改正程序中的错误。对于没有错误的语句,请不要修改,修改原本正确的语句也要扣分。

注意:将修改后的完整的源程序写在答题区内。

当且仅当错误全部改正,且程序运行结果调试正确,

才给加5分,如果只改正了部分错误,则不加分。

**输入输出格式要求:输入不要有任何提示信息,直接输入字符串;输出格式见以下代码的输出。

#include <stdio.h>
#define ARR_SIZE = 80;
main()
{
    char str[ARR_SIZE];
    int  len, i, letter, digit, space, others;	
        scanf("%s",&str);
        len = strlen(str);    
    for (i=0; i<len; i++)
    {		
      if (''a'' <= str[i] <= ''z'' || ''A'' <= str[i] <= ''Z'');   
            letter = letter ++;               
         else if (0 <= str[i] <= 9)   
                digit = digit ++;                 
         else if (str[i] = '' '' )                           
                space = space ++;              
         else 
        others = others ++;             
       }
    printf("English character:  %d\n", letter);
  printf("digit character:  %d\n", digit);
  printf("space:  %d\n", space);
    printf("other character:  %d\n", others);
}

', 'gets和scanf的区别。。。自行百度', '', '', '', '', '', '', '

#include <stdio.h>
#define ARR_SIZE 80
main()
{
    char str[ARR_SIZE];
    int  len, i, letter = 0, digit = 0, space = 0, others = 0;
    gets(str);
    len = strlen(str);
    for (i = 0; i < len; i++)
    {
        if (''a'' <= str[i] && str[i] <= ''z'' 
        	|| ''A'' <= str[i] && str[i] <= ''Z'')
            letter ++;
        else if (''0'' <= str[i] && str[i] <= ''9'')
            digit ++;
        else if (str[i] == '' '' )
            space ++;
        else
            others ++;
    }
    printf("English character:  %d\n", letter);
    printf("digit character:  %d\n", digit);
    printf("space:  %d\n", space);
    printf("other character:  %d\n", others);
}

', 3),

(491, 324, '324', 'Q313', '(5分)

*奥运会国名顺序

请用指针数组编程实现按奥运会参赛国国名,在字典中的顺序对其入场次序进行排序。

假设参赛国不超过150个。

下面程序中存在比较隐蔽的错误,请通过分析和调试程序,发现并改正程序中的错误。

注意:请将修改正确后的完整源程序拷贝粘贴到答题区内。

对于没有错误的语句,请不要修改,修改原本正确的语句也要扣分。

当且仅当错误全部改正,且程序运行结果调试正确,才给加5分。

经教师手工核对后,如果未用指针数组做函数参数编程,那么即使做对也不给分。

改错时不能改变程序原有的意图,不能改变函数原型。

#include  <stdio.h>
#define   MAX_LEN  10
#define   N         150
void SortString(char *ptr[], int n);
main()
{
    int    i, n;
    char   *pStr[N];
    printf("How many countries?\n");
    scanf("%d",&n);
    printf("Input their names:\n");
    for (i=0; i<n; i++)
    {
        gets(pStr[i]);
    }
    SortString(pStr[i], n);
    printf("Sorted results:\n");
    for (i=0; i<n; i++)
    {
        puts(pStr[i]);
    }
}

void SortString(char *ptr[], int n)
{
    int    i, j;
    char  temp;
    for (i=0; i<n-1; i++)
    {
        for (j = i+1; j<n; j++)
        {
            if (ptr[j] < ptr[i]);
            {
                temp = ptr[i];
                ptr[j] = ptr[i];
                ptr[j] = temp;
            }
        }
    }

#include  <stdio.h>
#include <string.h>
#define   MAX_LEN  10
#define   N         150
void SortString(char *ptr[], int n);
main()
{
    int    i, n;
    char   name[N][MAX_LEN];
    char *pStr[N];
    printf("How many countries?\n");
    scanf("%d",&n);
    getchar();
    printf("Input their names:\n");
    for (i=0; i<n; i++)
    {
        pStr[i]=name[i];
        gets(pStr[i]);
    }
    SortString(pStr, n);
    printf("Sorted results:\n");
    for (i=0; i<n; i++)
    {
        puts(pStr[i]);
    }
}

void SortString(char *ptr[], int n)
{
    int    i, j;
    char  *temp=NULL;
    for (i=0; i<n-1; i++)
    {
        for (j = i+1; j<n; j++)
        {
            if (strcmp(ptr[j],ptr[i])<0)
            {
                temp = ptr[i];
                ptr[i] = ptr[j];
                ptr[j] = temp;
            }
        }
    }
}

', 1);

(492, 324, '324', 'Q3069', 'Q3069.(10分)

*百分制成绩转换为5分制成绩

程序改错v1.0

下面代码的功能是将百分制成绩转换为5分制成绩,具体功能是:

如果用户输入的是非法字符或者不在合理区间内的数据(例如输入的是a,或者102,或-45等),则程序输出 Input error!,否则将其转换为5分制输出。

目前程序存在错误,请将其修改正确。并按照下面给出的运行示例检查程序。

#include<stdio.h>
   int main()
   {
       int score;
       char grade;
       printf("Please input  score:");
       scanf("%d", &score);
       if (score < 0 || score > 100)   
             printf("Input error!\n");
        else if (score >= 90) 
             grade = ''A’;
        else if (score >= 80)
             grade = ''B'';   
        else if (score >= 70)
             grade = ''C'';  
        else if (score >= 60)
             grade = ''D''; 
        else
             grade = ''E''; 
        printf("grade:%c\n", grade);
        return 0;
}

程序运行结果示例1: Please input score: -1↙ Input error!

程序运行结果示例2: Please input score: 95↙ grade: A

程序运行结果示例3: Please input score: 82↙ grade: B

程序运行结果示例4: Please input score: 72↙ grade: C

程序运行结果示例5: Please input score: 66↙ grade: D

程序运行结果示例6: Please input score: 32↙ grade: E

程序运行结果示例7: Please input score: 127↙ Input error!

输入格式: "%d" 输入提示信息:"Please input score:\n"

输入错误提示信息:"Input error!\n"

输出格式:"grade: %c\n" (注意:%c前面有一个空格)', '', '', '', '', '', '', '

#include<stdio.h>
int main()
{
    int score;
    char grade;
    printf("Please input score:\n");
    if (scanf("%d", &score) == 1)
    {
        if (score < 0 || score > 100)
            printf("Input error!\n");
        else
        {
            if (score >= 90)
                grade = ''A'';
            else if (score >= 80)
                grade = ''B'';
            else if (score >= 70)
                grade = ''C'';
            else if (score >= 60)
                grade = ''D'';
            else
                grade = ''E'';
            printf("grade: %c\n", grade);
        }
    }
    else printf("Input error!\n");
    return 0;
}

', 15),

(494, 324, '324', 'Q1127', 'Q1127.(10分)

*数列之和

求2/1,3/2,5/3,8/5,13/8,21/13,.....前20项之和。请改正程序中的错误,使它能得出正确的结果。

#include <stdio.h>

main()
{
    int i, s1 = 2, s2 = 1;
    float x, sum = 0;

    for (i = 1; i <= 20; i++)
    {
        sum += s1 / s2;
        x = s1;
        s1 += s2;
        s2 = x;
    }
    printf("sum = %9.6f\n", sum);
}

', '', '', '', '', '', '', '', '

#include <stdio.h>

main()
{
    int i, s1 = 2, s2 = 1;
    float x, sum = 0;

    for (i = 1; i <= 20; i++)
    {
        sum += (float) s1 / s2;
        x = s1;
        s1 += s2;
        s2 = x;
    }
    printf("sum = %9.6f\n", sum);
}

', 4),

(499, 324, '324', 'Q3076', 'Q3076.(10分)

*判断素数

程序改错-2

从键盘任意输入一个正整数,编程判断它是否是素数,若是素数,输出“Yes!”,否则输出“No!”。

已知负数、0和1都不是素数。请找出下面程序的错误并改正之,同时按照给出的运行示例检查修改后的程序。

#include <stdio.h>
#include <math.h>
int main()
{
    int n, i;
    printf("Input n:\n");
    scanf("%d", &n);
    for (i = 2; i <= sqrt(n); i++)
    {
        if (n % i = 0)
        {
            printf("No!\n");
        }
    }
    printf("Yes!\n");
    return 0;
}

程序的运行结果示例1: Input n: -3↙ No!

程序的运行结果示例2: Input n: 0↙ No!

程序的运行结果示例3: Input n: 1↙ No!

程序的运行结果示例4: Input n: 6↙ No!

程序的运行结果示例5: Input n: 7↙ Yes!

输入格式: "%d"

输出格式:

输入提示信息: "Input n:\n"

是素数: "Yes!\n"

不是素数: "No!\n"', '', '', '', '', '', '', '', '

#include <stdio.h>
#include <math.h>
int main()
{
    int n, i;
    printf("Input n:\n");
    scanf("%d", &n);
    if (n<=1) printf("No!\n");
    else
    {
    for (i = 2; i <=(int) sqrt(n); i++)
    {
        if (n % i == 0)
        {
            printf("No!\n");break;
        }
    }
    if (i==(int)sqrt(n)+1) printf("Yes!\n");
    }
    return 0;
}

', 17),

(500, 324, '324', 'Q3075', 'Q3075.(10分)

*百鸡问题

我国古代的《张丘建算经》中有这样一道著名的百鸡问题:“鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何?”其意为:公鸡每只5元,母鸡每只3元,小鸡3只1元。用100元买100只鸡,问公鸡、母鸡和小鸡各能买多少只?

目前程序运行结果有误,请问为什么会比正确答案多出三个解?不仅要找出错误和修正错误,还要求利用以前学过的知识分析错误的原因。

#include <stdio.h>
int main()
{
    int x, y, z;
    for (x = 0; x <= 20; x++)
    {
        for (y = 0; y <= 33; y++)
        {
            z = 100 - x - y;
            if (5 * x + 3 * y + z / 3 == 100)
            {
                printf("x=%d, y=%d, z=%d\n", x, y, z);
            }
        }
    }
    return 0;
}

程序目前的运行结果:

x=0, y=25, z=75

x=3, y=20, z=77

x=4, y=18, z=78

x=7, y=13, z=80

x=8, y=11, z=81

x=11, y=6, z=83

x=12, y=4, z=84

程序正确的运行结果:

x=0, y=25, z=75

x=4, y=18, z=78

x=8, y=11, z=81

x=12, y=4, z=84

输入格式: 无

输出格式:"x=%d, y=%d, z=%d\n"', '', '', '', '', '', '', '', '

#include <stdio.h>
int main()
{
    int x, y, z;
    for (x = 0; x <= 20; x++)
    {
        for (y = 0; y <= 33; y++)
        {
            z = 100 - x - y;
            if (5 * x + 3 * y + z / 3 == 100 && z % 3 == 0)
            {
                printf("x=%d, y=%d, z=%d\n", x, y, z);
            }
        }
    }
    return 0;
}

', 16),

(505, 325, '325', 'Q3009', '

*删除非英文字母

下面的程序功能是将读入的字符串中的所有非英文字母字符删除,并输出删除字符的数量、删除的结果,请改正程序中的错误。

#include <stdio.h>
int DelNonAlphabet(char *pStr);
int main()
{  
    char str[200];
    int n;
    gets(str);
    n = DelNonAlphabet(str) ;  
    printf("Delete %d, result is:%s",n,str);
    return 0;
}

int DelNonAlphabet(char *pStr){
        int n;
    char *p = pStr,q;

    while( p != ''\0'')
    {
        if( !(  ( *p >= ''A'' && *p <= ''Z'')||
                ( *p >= ''a'' && *p <= ''z'')))
         {
            q = p+1;
            while( *q!= ''\0'')
            {
                *(q-1) = *q;
                q++;
             }
             *(q-1) = *q;
             ++n;
          }	

          ++p;	 
    }
    return n;
}

', '', '', '', '', '', '', '', '

#include <stdio.h>
int DelNonAlphabet(char *pStr);
int main()
{
    char str[200];
    int n;
    gets(str);
    n = DelNonAlphabet(str) ;
    printf("Delete %d, result is:%s",n,str);
    return 0;
}

int DelNonAlphabet(char *pStr){
        int n=0;
    char *p = pStr,*q=NULL;

    while( *p != ''\0'')
    {
        if( !(  ( *p >= ''A'' && *p <= ''Z'')||
                ( *p >= ''a'' && *p <= ''z'')))
         {
            q = p+1;
            while( *q!= ''\0'')
            {
                *(q-1) = *q;
                q++;
             }
             *(q-1) = *q;
             ++n;
          }

          if (( *p >= ''A'' && *p <= ''Z'')||( *p >= ''a'' && *p <= ''z'')) ++p;
    }
    return n;
}

', 29),

(509, 324, '324', 'Q894', 'Q894.(10分)

*数组元素倒置

下面程序的功能是将数组元素倒置 ,找出其中的4处错误并改正之。

#include "stdio.h"
#define M 5; 
main()
{   int a[M]={1,2,3,4,5};
    int i,j,*t; 
    i=0;j=M-1;
    while(i)
    {   
        t=*(a+i);
        *(a+i)=*(a+j);
        *(a+j)=t;
        i++;j++ 
    }
    for(i=0;i<M;i++) printf("%d",(a+i));
}

', '', '', '', '', '', '', '', '

#include "stdio.h"
#define M 5
main()
{   int a[M]={5,4,3,2,1};
    int i,j,*t;
    i=0;j=M-1;
    while(i<j)
    {
        t=*(a+i);
        *(a+i)=*(a+j);
        *(a+j)=t;
        i++;j--;
    }
    for(i=0;i<M;i++) printf("%d",*(a+i));
}

', 4),

(510, 324, '324', 'Q3048', 'Q3048.(5分)

*截取n个字符

下面程序的功能是实现字符串前端截取n个字符,例如从键盘输入字符串helloworld,然后输入要截取的字符个数5,则程序获取子串hello,并按如下指定格式输出。

目前程序中存在错误,请修改正确。

**字符串输入提示:"input a string:"

**字符串输入格式:"%s"

**截取字符个数输入提示:"input n:"

**截取字符个数输入格式:"%d"

**输出格式:"new string=%s\n"

运行示例:

input a string:helloworld

input n:5

new string=hello

#include <stdio.h>

char *left_string(char *str1,char *str2,int n)               
{
    int i;
    for(i=0;*(str1+i)!=''\0'';i++)
        *(str2+i)=*(str1+i);
    return *str2;
}
int main()
{
    char str1[100],str2[100];
    int n;                        
    printf("input a string:");
    scanf("%s",&str1);
    printf("input n:");
    scanf("%d",&n);                            
    left_string(char *str1,char *str2,int n);                      
    printf("new string=%s\n", str2);           
    return 0;
}

', '', '', '', '', '', '', '', '

#include <stdio.h>

char left_string(char *str1,char *str2,int n)
{
    int i;
    for(i=0;i<n;i++)
        *(str2+i)=*(str1+i);
    *(str2+i)=''\0'';
    return *str2;
}
int main()
{
    char str1[100],str2[100];
    int n;
    printf("input a string:");
    scanf("%s",&str1);
    printf("input n:");
    scanf("%d",&n);
    left_string(str1,str2,n);
    printf("new string=%s\n", str2);
    return 0;
}

', 2),

(524, 324, '324', 'Q2655', '(10分)

*求完数个数

以下程序功能是实现求10000 以内的自然数中的完数及其个数(所谓完数,指它恰好等于除它本身之外的因子之和,如:6=1+2+3,28=1+2+4+7+14),并显示结果。

该程序中有8处错误,请调试并改正。不允许改变程序结构和大量地增删语句。只有全部正确才能得分。

#include <stdio.h>
#define LEN=10000;                  
int main(void)
{
    int i,k,m,n,s,p;                        
    int a(100);                     
    printf("Number as follows:");           
    for (i=2; i<= LEN; i++)          
    {
        s=0;
        m=0;
        k=1;
        while(k<=i/2);                   
        {
            if (i%k==0)
            {
                s=s+k;
                a[m]=k;
                m=m+1;
            }

        }
        if (s=i)                    
        {
            p=p+1;
            printf("\n%d=%d",s,a[0]);
            n=1;
            while (n > m)            
            {
                printf("+%d,a[n]);          
                n=n+1;
            }
        }
    }
    printf("\nTotal Num: %d",p);
    return 0;
}

', '', '', '', '', '', '', '', '

#include <stdio.h>
#define LEN 10000
int main(void)
{
    int i,k,m,n,s,p=0;
    int a[100];
    printf("Number as follew:");
    for (i=2; i<= LEN; i++)
     {
        s=0;
        m=0;
        k=1;
        while(k<=i/2+1)
        {
            if (i%k==0)
            {
                s=s+k;
                a[m]=k;
                m=m+1;
            }
            k++;
        }
        if (s==i)
        {
            p=p+1;
            printf("\n%d=%d",s,a[0]);
            n=1;
            while (n < m)
            {
                printf("+%d",a[n]);
                n=n+1;
            }
        }
    }
    printf("\nTotal Num: %d",p);
    return 0;
}

', 2),

(530, 324, '324', 'Q1368', 'Q1368.(10分)

*十数平均值

以下程序的功能是计算十个数据的平均值。找出其中的错误并改正之。

#include <stdio.h>
void main(void)
{
    int i, sum;
    float  avg;
    int    sc[10], *p = sc;

    for (i=0, i<10, i++) 
    {
            scanf("%d", p);
            p++;
            sum += *p; 
    }
    avg = sum / 10; 
    printf("avg=%f\n", avg);
}

', '', '', '', '', '', '', '', '

#include <stdio.h>
void main(void)
{
    int i, sum=0;
    float  avg;
    int    sc[10], *p = sc;

    for (i=0;i<10;i++)
    {
            scanf("%d", p);
            sum += *p;
            p++;
    }
    avg =(float)sum / 10;
    printf("avg=%f\n", avg);
}

', 3),

(541, 325, '325', 'Q880', 'Q880.(10分)

*打印结构体

以下程序有若干语法错误。请找出并改正之。

输入:无

输出:Wang,11,30

#include <stdio.h>
struct date
{   
    int  y;m;d; 
}
struct stu
{   char n[10];
    struct date b;
    int a;
}s={“Wang”,{1980,12,11},30};
main()
{   
    printf(“%c,%d,%d\n”,s.n,s.d,s.a);   
}

', '', '', '', '', '', '', '', '

#include <stdio.h>
struct date
{
    int  y,m,d;
};

struct stu
{   char n[10];
    struct date b;
    int a;
}s={"Wang",{1980,12,11},30};

int main()
{
    printf("%s,%d,%d\n",s.n,s.b.d,s.a);
}

', 3),

(544, 324, '324', 'Q1282', '

*矩阵中找最大数

程序改错。在一个3x4矩阵中找出最大数及最大数所在元素的下标。

#include <stdio.h>
#define M 3
#define N 4
int FindMax(int (*p)[N],int m,int n, int *pRow, int *pCol) 
main()
{
    int score[M][N], i, j, maxScore, row, col;
    for ( i=0; i<M; i++ )
    {
          for ( j=0; j<N; j++ )
          {
               scanf("%d", &score[i][j]);
          }
    }
    maxScore = FindMax(*score, M, N, &row, &col);
    printf("%d %d %d\n", maxScore, row+1, col+1);
}

int FindMax( int (*p)[N], int m, int n, 
int *pRow, int *pCol )
{
    int  i, j, max;
    max = *(p);
    pRow = 0; 
    pCol = 0; 
    for (i=0; i<m; i++)
    {
        for (j = 0; j<n; j++)
                {
            if ( *(*(p+i)+j) > max )
                        {
                max = *(*(p+i)+j) ;
                *pRow = i;
                *pCol = j;
                        }
        }
    }

}

', '', '', '', '', '', '', '', '

#include <stdio.h>
#define M 3
#define N 4
int FindMax(int (*p)[N],int m,int n, int *pRow, int *pCol);
main()
{
    int score[M][N], i, j, maxScore, row, col;
    for ( i=0; i<M; i++ )
    {
          for ( j=0; j<N; j++ )
          {
               scanf("%d", &score[i][j]);
          }
    }
    maxScore = FindMax(*score, M, N, &row, &col);
    printf("%d %d %d\n", maxScore, row+1, col+1);
}

int FindMax( int (*p)[N], int m, int n,int *pRow, int *pCol )
{
    int  i, j, max;
    max = *(*p);
    *pRow = 0;
    *pCol = 0;
    for (i=0; i<m; i++)
    {
        for (j = 0; j<n; j++)
        {
            if ( *(*(p+i)+j) > max )
                        {
                max = *(*(p+i)+j) ;
                *pRow = i;
                *pCol = j;
                        }
        }
    }
    return max;

}

', 3),

(546, 324, '324', 'Q1122', 'Q1122.(10分)

*三数相等

判断输入的三个数是否相等。算法如下,请改正程序中的错误,使它能得出正确的结果。

#include <stdio.h>

main()
{
    int a, b, c;

    scanf("%d,%d,%d", a, b, c);
    if (a = = b = = c)
        printf("The three number is equal!!!");
    else
        printf("The three number isn''t equal!!!");
}

', '', '', '', '', '', '', '', ''

#include <stdio.h>
int main()
{
    int a, b, c;
    scanf("%d,%d,%d",&a,&b,&c);
    if (a == b&&b == c)
        printf("The three number is equal!!!");
    else
        printf("The three number isn''t equal!!!");
}

', 15),

(547, 324, '324', 'Q125', 'Q125.(5分)

*查找字符串

从键盘任意输入一个字符串(字符串可以有空格), 在给定的一组字符串中寻找该输入字符串, 若找到,则打印该字符串,否则打印"Not find!"。

注意:

  1. 请将修改正确后的完整源程序拷贝粘贴到答题区内。

  2. 对于没有错误的语句,请不要修改, 修改原本正确的语句也要扣分。

  3. 当且仅当错误全部改正,且程序运行结果调试正确,才给加5分。

#include <string.h>
#include <stdio.h>
main()
{
    int i, findFlag = 1;  
    char x;              
    char *str[]={ "Pascal","Basic","Fortran", "Java","Visual C", "Visual Basic" };

    printf("Input string:\n");
    gets(x);

    while (i<6 && !findFlag)
    {   
        if (x=str[i])
        {
            findFlag = 0;    
        } 
        i++;
    }
    if (!findFlag)
    {      
        printf("%s\n",x);
    }
    else
    {      
         printf("Not find!\n");
    }
}

', '', '', '', '', '', '', '', '

#include <string.h>
#include <stdio.h>
main()
{
    int i=0, findFlag = 1;
    char x[20];
    char str[6][20]={ "Pascal","Basic","Fortran", "Java","Visual C", "Visual Basic" };

    printf("Input string:\n");
    gets(x);

    while (i<6 && findFlag)
    {
        if (strcmp(x,str[i])==0)
        {
            findFlag = 0;
        }
        i++;
    }
    if (!findFlag)
    {
        printf("%s\n",x);
    }
    else
    {
         printf("Not find!\n");
    }
}

', 2),

(548, 324, '324', 'Q318', '(5分)

*删除字符串s中所出现的与变量c相同的字符

下面程序的Squeeze函数的功能是删除字符串s中所出现的与变量c相同的字符。

注意:请将修改正确后的完整源程序拷贝粘贴到答题区内。

对于没有错误的语句,请不要修改,修改原本正确的语句也要扣分。

当且仅当错误全部改正,且程序运行结果调试正确,才给加5分。

改错时不能改变程序原有的意图,不能改变函数原型。

**输入输出格式要求:不要增加输入提示信息;

按原题要求,先输入字符串s,回车换行后再输入字符c (c为任意字符)。不能修改函数原型。

#include <stdio.h>
void  Squeeze(char *s, char c);
main()
{
    char a[80],c, *s;
    scanf("%s",p);
    scanf("%c",c);
    Squeeze(char *s, char c);
    printf("%s\n",s);
}
void  Squeeze(char *s, char c);
{
    int i,j;
    for (i=0; *s+i !='' \0''; i++);
    {
        if (*s+i != ''c'')
        {
            *s+j = *s+i;
            j++;
        }
        *s+i = ''\0'';
    }
}

', '', '', '', '', '', '', '', '

#include <stdio.h>
void  Squeeze(char *s, char c);
main()
{
    char a[80], s;
    scanf("%s", a);
    scanf(" %c", &s);
    Squeeze(a, s);
    printf("%s\n", a);
}
void  Squeeze(char *s, char c)
{
    int i, j;
    int flag = 0;
    for (i = 0, j = 0; * (s + i) != ''\0''; i++)
    {
        if (*(s + i) != c)
        {
            flag = 1;
            *(s + j) = *(s + i);
            j++;
        }
    }

    if (flag)
        *(s + j) = ''\0'';
}

', 3),

(549, 324, '324', 'Q2404', 'Q2404.(10分)

*输入时顺序的逆序进行排列

下面程序用于将6个数按输入时顺序的逆序进行排列。找出其中错误,并改正之。

#include<stdio.h>
void Swap(int *x, int *y)
{
    int *temp; 
    temp = x;
    x = y;     
    y = temp; 
}
void Sort(char *p,int m)
{
  int i;
  char change,*p1,*p2;
  for(i=0;i<m/2;i++)
  {
    *p1=p+i;       
    *p2=p+(m-1-i); 
     Swap(p1,p2);
  }
}
int main( )
{
  int i;
  char  *p,num[6];
  for(i=0;i<=5;i++)
  scanf("%d",&num[i]);
  p=&num[0];
  Sort(*p,6);                  
  for(i=0;i<=5;i++)
    printf("%d",num[i]);
  return 0;
}

', '', '', '', '', '', '', '

#include<stdio.h>
void Swap(int *x, int *y)
{
    int  temp;
    temp = *x;
    *x = *y;
    *y = temp;
}
void Sort(int *p, int m)
{
    int i;
    int change, *p1, *p2;
    for (i = 0; i < m / 2; i++)
    {

        p1 = p + i;
        p2 = p + (m - 1 - i);
        Swap(p1, p2);
    }
}

int main( )
{
    int i;
    int *p, num[6];
    for (i = 0; i <= 5; i++)
        scanf("%d", &num[i]);
    p = &num[0];
    Sort(p, 6);
    for (i = 0; i <= 5; i++)
        printf("%d ", num[i]);
    return 0;
}

', '', 1),

(558, 324, '324', 'Q879', '

*输出至少一白球方案

假设某袋子中装有3个红球,5个白球,6个黑球,现从该袋子中任意取出8个球,

下面程序的功能是输出这8个球中至少有一个白球的所有方案。找出其中错误并改正之。

#include <stdio.h>
main()
{
    int i,j,k;
    for(i=0;i<=3;i++)
        for(j=0;j<=5;j++)
        {   
            k=8-i-j;
            if(0<=k<=6)
                printf(“hong=%d\t,bai=%d\t,hei=%d\t\n”,i,j,k);
        }
}

', '', '', '', '', '', '', '', '

#include <stdio.h>
main()
{
    int i,j,k;
    for(i=0;i<=3;i++)
        for(j=1;j<=5;j++)
        {   
            k=8-i-j;
            if(0<=k&&k<=6)
                printf("hong=%d\t,bai=%d\t,hei=%d\t\n",i,j,k);
        }
}

', 4),

(560, 324, '324', 'Q1283', '

*打印结构体

程序改错。以下程序用于打印输出结构体数组的所有元素。

struct s
{
    char name[10];
    int age;
}
main()
{
    struct s a[3] = {”John”,19,”Paul”,17,”Marry”,18};
    int *p; 

    for(p = a; p < 3; p++)
    {
        printf("%s,%d\n", p->name, p->age );
    }

}

', '', '', '', '', '', '', '', '

struct s
{
    char name[10];
    int age;
}
main()
{
    struct s a[3] = {"John",19,"Paul",17,"Marry",18};
    struct s *p;
    int i=0;
    for(p = a; i < 3; p++,i++)
    {
        printf("%s,%d\n", p->name, p->age );
    }

}

', 4),

(561, 324, '324', 'Q193', '

*最大最小置换

下面程序的功能是从键盘任意输入n个数,然后找出其中的最大数与最小数,并将其位置对换。

该程序中存在比较隐蔽的错误,请通过分析和调试程序,发现并改正程序中的错误。

#include  <stdio.h>
#define n = 10;
void  MaxMinExchang(int *a, int n)
{
    int  maxValue = *a, minValue = *a, maxPos, minPos;
    int  i, temp;
    for (i=0; i<n; i++)
    {
        if (*a+i > maxValue)
        {
        maxValue = *a+i;
              maxPos = i;
        }
         if (*a+i < minValue)
        {
                 minValue = *a+i;
            minPos = i;
        }
    }   
    temp = *a + maxPos;
    *a + maxPos = *a + minPos;
    *a + minPos = temp;
}
main()
{
    int a[n], i, n;
    printf("Input n(n<=10):\n");
    scanf("%d", n) ;
    printf("Input %d Numbers:\n", n);
    for (i=0; i<n; i++)
    {
        scanf("%d", a[i]);
    }
    MaxMinExchang(a, n);
    printf("After MaxMinExchange:\n");
    for (i=0; i<n; i++)
    {
            printf("%d ", a[i]);
    }
    printf("\n");
}

注意:

  1. 请将修改正确后的完整源程序拷贝粘贴到答题区内。

  2. 对于没有错误的语句,请不要修改,修改原本正确的语句也要扣分。

  3. 当且仅当错误全部改正,且程序运行结果调试正确,才给加5分。

  4. 改错时不能改变程序原有的意图,不能改变函数原型,也不要改变代码的输入输出格式。', '', '', '', '', '', '', '', '

#include  <stdio.h>
#define N 10
void  MaxMinExchang(int *a, int n)
{
    int  maxValue = *a, minValue = *a, maxPos=0, minPos=0;
    int  i, temp;
    for (i=0; i<n; i++)
    {
        if (*(a+i) > maxValue)
        {
        maxValue = *(a+i);
              maxPos = i;
        }
         if (*(a+i) < minValue)
        {
                 minValue = *(a+i);
            minPos = i;
        }
    }
    temp = *(a + maxPos);
    *(a + maxPos) = *(a + minPos);
    *(a + minPos) = temp;
}
main()
{
    int a[N], i, n;
    printf("Input n(n<=10):\n");
    scanf("%d",&n) ;
    printf("Input %d Numbers:\n", n);
    for (i=0; i<n; i++)
    {
        scanf("%d",&a[i]);
    }
    MaxMinExchang(a, n);
    printf("After MaxMinExchange:\n");
    for (i=0; i<n; i++)
    {
            printf("%d ", a[i]);
    }
    printf("\n");
}

', 3),

全部评论

相关推荐

04-17 18:34
中山大学 C++
点赞 评论 收藏
分享
评论
1
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务