1 求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);
}

答案

  • 很简单 s1,s2都是int类型,int类型的除法是整除得到还是int类型
  • 我们只需要使用强转即可
#include <stdio.h>

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

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

2 奥运参赛国出场次序:

输入奥运会参赛国国名,并按照字典序对其进行排序。
要求:参赛国数量不超过150个,每个国家的名字不超过9个字符。
提示:‘\0’占一个字符。
要求:请找出下面程序的错误并改正。

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

答案

  • 一开始以为错是 数组char str[][MAX_LEN] ,但其实并不是

可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以指定所有维数的大小,也可以省略第一维的大小说明,但不可以省略第二位或更高维如:
void Func(int array[ ][ ]) 错误
void Func(int array[3][10]) 正确
void Func(int array[][10]) 正确

  • 后面是字符串对比上面出了问题,不能简单的相减比较
#include <string.h>
#include <stdio.h>
 
#define N 150
#define MAX_LEN 10
void SortString(char str[][MAX_LEN], int n);
 
int main()
{
    int i, n;
    char name[N][MAX_LEN]; 
 
    printf("How many countries?");
    scanf("%d",&n);     
    getchar();
    printf("Input their names\n");
 
    for(i=0;i<n;i++)
        gets(name[i] );      
 
    SortString(name, n);   
    printf("Sorted results:\n");
    for(i=0;i<n;i++)
    {
        puts(name[i]);      
    }
    return 0;
 
}
 
void SortString(char str[][MAX_LEN], int n)     
{
    int i,j;
    char temp[MAX_LEN];
 
    for(i=0;i<n;i++)
    {
        for(j=i+1;j<n;j++)
        {
            if(strcmp(str[i],str[j]) > 0)        //错误 字符串比较
            {
                strcpy(temp,str[i]);
                strcpy(str[i],str[j]);
                strcpy(str[j],temp);
            }
        }
    }
}

3 下面程序的功能是将数组元素逆序输出 ,找出其中的错误并改正之。

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

答案

  • 三处地方
  • 一、循环部分发生了越界
  • 二、数组a[M]里面,a 表示数组a地址,a+i 代表a[i]的地址,我们要输出a[i],就得在地址前面加 *访问地址得到数据
  • 三、差点漏了#include "stdio.h"
#include <stdio.h>                 //错误3
#define M 5
int main()
{
    int a[M] = {1, 2, 3, 4, 5};
    int i;
    for (i = M - 1; i >= 0; i--)  //错误1
        printf("%d ", *(a + i));   //错误2
    return 0;
}

4 下面程序的功能是删除字符串中第一次出现的a字符。

其中有两处错误,请改正并使程序正确执行。

#include <stdio.h>
#include <string.h>
void fun(char *s,int n,int *t)
{
    int i,k=0;
    s[n]='a';
    s[n+1]='\0';
    while(s[k]!='a') k++;
    if(k==n){*t=0;}
    else
    {
        for(i=k;i<n;i++)
            s[i]=s[i+1];
        s[i]='\0';
    }
}
main()
{
    char s[20];
    int len,t;
    printf("Input a string:");
    gets(s);
    len=strlen(s);
    fun(s,len,t);
    if(t==0) printf("Not exist!\n");
    else    printf("Result is:%s\n",s);
}

答案

  • 一、看函数void fun(char *s,int n,int *t) 注意参数t是指针,我们需要把int类型的数据的地址传给指针
  • 二、循环越界问题,长度为n的字符串经过函数有可能变成长度为n-1的字符串,所以要注意越界的问题
#include <stdio.h>
#include <string.h>
void fun(char *s,int n,int *t)
{
    int i,k=0;
    s[n]='a';
    s[n+1]='\0';
    while(s[k]!='a') k++;
    if(k==n){*t=0;}
    else
    {
        for(i=k;i<n-1;i++)//错误2
            s[i]=s[i+1];   
        s[i]='\0';
    }
}
main()
{
    char s[20];
    int len,t;
    printf("Input a string:");
    gets(s);
    len=strlen(s);
    fun(s,len,&t);       //错误1
    if(t==0) printf("Not exist!\n");
    else    printf("Result is:%s\n",s);
}

5 判断输入的三个数是否相等。

算法如下,请改正程序中的错误,使它能得出正确的结果。

#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!!!");
}

答案

  • 一、scanf注意后面参数是赋给地址
  • 二、不存在三元符 == ==,需要分开 利用上逻辑符号&&
#include <stdio.h>
 
main()
{
    int a, b, c;
 
    scanf("%d,%d,%d", &a, &b, &c);   //错误1
    if (a == b &&  b == c)  //错误2
        printf("The three number is equal!!!");
    else
        printf("The three number isn't equal!!!");
}