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