哈工大 sse-改错

Q1113.(10分数, 语言: C)输入一个字符串保存到数组str中,将str中的数字字符存储到数组tOrigin中,并将其转换为整数输出,用k记录字符串中数字字符的个数。例如:用户输入字符串1243abc3,则将12433取出以整数形式输出。阅读程序,找出其中的错误,并改正之(允许改变数据类型)。

#include <math.h>
#include <stdio.h>

void fun(char *s, char *t, int k)
{
    int i;
    k = 0;
    for (i = 0; s[i]; i++)
        if (0 <= s[i] && s[I] <= 9)
        {
            t[*k] = s[i];
            *k += 1;
        }
--
}
void main()
{
    char str[100], tOrigin[9];
    long int n;
    int i, k;
    printf("Please enter string s:");
    scanf("%s", str);
    fun(str, tOrigin, &k);
    for (i = 0; i < k; i++)
        n += (tOrigin [k - 1 - i] - '0') * pow(10, i);
    printf("The result is: %d", n);
}

 答案:

#include <math.h>
#include <stdio.h>

void fun(char *s, char *t, int *k)
{
    int i;
//this
    *k = 0;
    for (i = 0; s[i]; i++)
//this
        if ('0' <= s[i] && s[i] <= '9')
        {
            t[*k] = s[i];
            *k += 1;
        }
//this
    t[*k] = '\0';
}
void main()
{
    char str[100], tOrigin[9];
    long int n;
    int i, k;
    printf("Please enter string s:");
    scanf("%s", str);
//this
    fun(str, tOrigin, &k);
    for (i = 0; i < k; i++)
        n += (tOrigin [k - 1 - i] - '0') * pow(10, i);
    printf("The result is: %d", n);
}

Q202.(10分数, 语言: C)请用指针数组编程,依照国名的字典序,对将进行外交访谈的国家进行排序。
假设外交访谈的国家不超过150个,且国名不超过9个字符。
下面程序中存在比较隐蔽的错误,请通过分析和调试程序,发现并改正程序中的错误。

#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;
            }
        }
    }
}


注意:
(1)请将修改正确后的完整源程序拷贝粘贴到答题区内。
(2)对于没有错误的语句,请不要修改,修改原本正确的语句也要扣分。
(3)当且仅当错误全部改正,且程序运行结果调试正确,才给加5分。
(4)改错时不能改变程序原有的意图,也不要改变代码的输入输出格式。
(5)经教师手工核对后,如果未使用指针数组做函数参数编程,那么即使运行结果正确也不给分。
#include  <stdio.h>
#include <string.h>
#define   MAX_LEN  10
#define   N         150
void SortString(char *ptr[], int n);
main()
{
    int    i, n;
    //this
    char  a[N][MAX_LEN];
    char   *pStr[N];
    printf("How many countries?\n");
    scanf("%d",&n);
    //this
    getchar();
    printf("Input their names:\n");
    for (i=0; i<n; i++)
    {
        //this
        pStr[i] = a[i];
        gets(pStr[i]);
    }
    //tihs
    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;
    //tihs
    char  *temp=NULL;
    for (i=0; i<n-1; i++)
    {
        for (j = i+1; j<n; j++)
        {
            //tihs
            if (strcmp(ptr[j],ptr[i])<0)
            {
                temp = ptr[i];
                ptr[i] = ptr[j];
                ptr[j] = temp;
            }
        }
    }
}
Q582.(10分数, 语言: C)现要求大家设计程序,通过键盘读入选调生的学号和分数,当输入的学号为0时表示链表创建结束,并将读入的选调生生学号和成绩打印输出。创建动态链表并打印链表内容。下面程序中存在比较隐蔽的错误,请通过分析和调试程序,发现并改正程序中的错误。改错时不能改变程序原有的意图。
注意:将修改后的完整的源程序写在答题区内。

#include <stdio.h>
#define SIZE sizeof(struct node)
struct node
{
    long num;
    float score;
    struct node *next;
}
int main()
{
    int n = 0;
    struct node *head = NULL, *p1, *p2;
    p1 = p2 = (struct node*)malloc(SIZE);
    printf("Input %d node data:\n", n + 1);
    scanf("%d%f", &p1->num, &p1->score);
    while (p1->num != 0)
    {
        if (++n == 1)
            head = p1;
        else
            p2->next = p1;
        p1 = p2;
        p1 = (struct node*)malloc(SIZE);
        printf("Input %d node data:\n", n + 1);
        scanf("%d%f", &p1->num, &p1->score);
    }
    free(p1);
    printf("Prit list:\n");
    p2->next = NULL;
    if (head != NULL)
    {
         p2=head;     
         while (p1 != NULL)
        {   
            printf("num:%d\tscore:%.2f\n", p1->num, p1->score);
            p1 = p1->next;
        }
    }
    return 0;
}
#include <stdio.h>
#define SIZE sizeof(struct node)
struct node
{
    long num;
    float score;
    struct node *next;
};

int main()
{
    int n = 0;
    struct node *head = NULL, *p1, *p2;
    p1 = p2 = (struct node*)malloc(SIZE);
    printf("Input %d node data:\n", n+1);
    scanf("%d%f", &p1->num, &p1->score);
    while (p1->num != 0)
    {
        if (++n == 1)
            head = p1;
        else
            p2->next = p1;
            p2 = p1;
            p1 = (struct node*)malloc(SIZE);
            printf("Input %d node data:\n", n+1);
            scanf("%d%f", &p1->num, &p1->score);
    }
    free(p1);
    printf("Prit list:\n");
    p2->next = NULL;
    if (head != NULL)
    {
         p2=head;     
         while (p2 != NULL)
        {   
            printf("num:%d\tscore:%.2f\n", p2->num, p2->score);
            p2 = p2->next;
        }
    }
    return 0;
}
Q3515.(10分数, 语言: C)下面程序用于计算两个30位正整数的和。在sum和main函数(input和output函数中没有错误不需要修改)中有若干错误,请修改错误。注意:改错不能增减语句!

输入输出样例:
输入:123456789012345678901234567890+999999999999999999999999999999
输出:=1123456789012345678901234567889


#include <stdio.h>
#define MAX 30
#define CMAX 31
void input(int A[],int B[]);
void output(int A[],int B[], int C[]);
void sum(int A[], int B[], int C[]);
 
int main(){
    int A[MAX]={0}, B[MAX]={0}, C[CMAX]={0};
 
    input(A, B);
    sum(A, B, C);
    output(A, B, C);
 
    return 0;
}
 
void sum(int A[], int B[], int C[])
{
    int i;
    int c;
    for(i=0; i<=MAX; i++)
    {
        c = A[i] + B[i];
        C[i] = c/10 ;
        C[i+1] = c%10;
    }
}
void input(int A[],int B[])
{
    int i;
    for(i=MAX-1; i>=0; i--)
        scanf("%1d",&A[i]);
    getchar();
    for(i=MAX-1; i>=0; i--)
        scanf("%1d",&B[i]);
}
void output(int A[],int B[], int C[]){
    int i;
    printf("=") ;
    for(i=(C[MAX] == 0? MAX-1:MAX ) ; i>=0; i--)
        printf("%1d", C[i]) ;
}

#include <stdio.h>
#define MAX 30
#define CMAX 31
void input(int A[],int B[]);
void output(int A[],int B[], int C[]);
void sum(int A[], int B[], int C[]);
 
int main(){
    int A[MAX]={0}, B[MAX]={0}, C[CMAX]={0};
 
    input(A, B);
    sum(A, B, C);
    output(A, B, C);
 
    return 0;
}
 
void sum(int A[], int B[], int C[])
{
    int i;
    int c;
    for(i=0; i<MAX; i++)
    {
        c = A[i] + B[i]+C[i];
        C[i+1] = c/10 ;
        C[i] = c%10;
    }
}
void input(int A[],int B[])
{
    int i;
    for(i=MAX-1; i>=0; i--)
        scanf("%1d",&A[i]);
    getchar();
    for(i=MAX-1; i>=0; i--)
        scanf("%1d",&B[i]);
}
void output(int A[],int B[], int C[]){
    int i;
    printf("=") ;
    for(i=(C[MAX] == 0? MAX-1:MAX ) ; i>=0; i--)
        printf("%1d", C[i]) ;
}
Q176.(10分数, 语言: C)#include <stdio.h>
unsigned long Factorial(unsigned int n);
{	
	if (n < 0)
	{
		printf("data error!");
		return 0;
	}
	else if (n==0 && n==1)
	{
		return 1;
	}
	else 
	{
		return n * Factorial(n-1); 
	}
} 
main()
{
        int n;
	unsigned long x;
	printf("Input n:\n");
	scanf("%d", n);
	x = Factorial(n);
	printf("%d!=%ld\n", n, x);
}

#include <stdio.h>
unsigned long Factorial( int n)
{	
	if (n < 0)
	{
		printf("data error!");
		return 0;
	}
	else if (n==0 || n==1)
	{
		return 1;
	}
	else 
	{
		return n * Factorial(n-1); 
	}
} 
main()
{
    int n;
	unsigned long x;
	printf("Input n:\n");
	scanf("%d", &n);
	x = Factorial(n);
    if(x!=0){
        printf("%d!=%ld\n", n, x);
    }
	
}
Q1581.(10分数, 语言: C)给下面程序改错。程序功能是输入10个数,按从小到大顺序排序。

#include  <stdio.h>
#define SIZE 10;
main( )
{ int  i, j, t, a[SIZE];
   printf("input  10  numbers: \n");
   for(i = 1;i <= SIZE;i++) 
         scanf("%d", a[i]); 
   printf("\n");
   for (i = 0; i< SIZE; i++) 
       for (j = SIZE - 1; j >= i + 1; j--)
           if (a[j] > a[j-1])  
           {
		t=a[j];  
		a[j-1]=a[j]; 
		a[j]=t;    
	    }
   for (i = 0; i < SIZE; i++)
      printf("%d\n", a[i]);
}
注意:
(1)请将修改正确后的完整源程序拷贝粘贴到答题区内。
(2)对于没有错误的语句,请不要修改,修改原本正确的语句也要扣分。
(3)当且仅当错误全部改正,且程序运行结果调试正确,才给加5分。
(4)改错时不能改变程序原有的意图,也不要改变代码的输入输出格式。
#include  <stdio.h>
#define SIZE 10
main( )
{
    int  i, j, t, a[SIZE];
    printf("input  10  numbers: \n");
    for (i = 0; i < SIZE; i++)
        scanf("%d", &a[i]);
    printf("\n");
    for (i = 0; i < SIZE; i++){
        for (j = SIZE - 1; j >=  1; j--){
            if (a[j] < a[j - 1])
            {
                t = a[j-1];

                a[j - 1] = a[j];

                a[j] = t;
            }
        }
    }
        
            
    for (i = 0; i < SIZE; i++)
        printf("%d\n", a[i]);
}
Q390.(10分数, 语言: C)编写程序对读入的国家名称按字典顺序排序(最多20个国名,且长度不超过40)。要求:需排序的国家个数在主函数读入,调用Input函数读入需排序的国名,调用Sort函数对国名按字典顺序排序,调用Print函数打印按字典顺序排序的国名。Input、Sort、Print函数原型如下:
void Input(char *p[], int n);
void Sort(char *p[], int n);
void Print(char *p[], int n);
下面程序中存在比较隐蔽的错误,请通过分析和调试程序,发现并改正程序中的错误。
#include<stdio.h>
void Input(char *p[], int n);
void Sort(char *p[], int n);
void Print(char *p[], int n);
int main()
{
    char str[40][20];
    int i, n;

    printf("Input n(n<=20):\n");
    scanf("%d", &n);
--
    Input(str, n);
    Sort(str, n);
    printf("Results:\n");
    Print(str, n);

    return 0;
}
void Input(char *p[], int n)
{
    int i;

    for (i = 0; i < n; i++)
    {
        gets(p[i]);
    }
}
void Sort(char *p[], int n)
{
    char t;
    int i, j;

    for (i = 0; i < n - 1; i++)
    {
        for (j = 1; j < n; j++)
        {
            if (p[j] < p[i]) )
            {
                t = p[i];
                p[i] = p[j];
                p[j] = t;
            }
        }
    }
}
void Print(char *p[], int n);
{
    int i;

    for (i = 0; i < n; i++)
    {
        printf("%s\n", p[i]);
    }
}
注意:
(1)请将修改正确后的完整源程序拷贝粘贴到答题区内
(2)对于没有错误的语句,请不要修改,修改原本正确的语句也要扣分
(3)当且仅当错误全部改正,且程序运行结果调试正确,才给加分
(4)改错时不能改变程序原有的意图,也不要改变代码的输入输出格式
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
void Input(char *p[], int n);
void Sort(char *p[], int n);
void Print(char *p[], int n);
int main()
{
    char str[20][40];
    int i, n;
    char *pstr[20];

    printf("Input n(n<=20):\n");
    scanf("%d", &n);
    getchar();

    for (int i = 0; i < n; i++)
    {
        pstr[i] = str[i];
    }

    Input(pstr, n);
    Sort(pstr, n);
    printf("Results:\n");
    Print(pstr, n);

    return 0;
}
void Input(char *p[], int n)
{
    int i;

    for (i = 0; i < n; i++)
    {
        gets(p[i]);
    }
}
void Sort(char *p[], int n)
{
    char *t;
    int i, j;

    for (i = 0; i < n - 1; i++)
    {
        for (j = i + 1; j < n; j++)
        {
            if (strcmp(p[j] , p[i]) < 0 )
            {
                t = p[i];
                p[i] = p[j];
                p[j] = t;
            }
        }
    }
}
void Print(char *p[], int n)
{
    int i;

    for (i = 0; i < n; i++)
    {
        printf("%s\n", p[i]);
    }
}
Q3077.(10分数, 语言: C)程序改错-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;
}

#include <string.h>

int x;

x = scanf("%d,%d", &x1, &x2);

        while(getchar()!='\n');

while (x!=2 || x1 * x2 >= 0 );//顺序 一定不能换

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值