国二c语言程序的改错题,例如
第1题
#include <conio.h>
#include <stdio.h>
/********found********/
IsPrime(int n);
{
int i, m;
m = 1;
/********found********/
for (i=2; i<n; i++)
if !(n%i)
{
m = 0;
break;
}
return(m);
}
main()
{
int j, k;
printf("\nplease enter an integer number between 2 and 10000:");
scanf("%d", &k);
printf("\n\nThe prime factor(s) of %d is(are):", k);
for (j=2; j<k; j++)
if ((!(k%j)) && (IsPrime(j)))
printf(" %4d,", j);
printf("\n");
}
根据提供的信息,我们可以针对每个题目进行详细的错误分析与改正建议。
### 第1题
#### 错误分析
1. **函数声明格式不正确**:在 C 语言中,如果一个函数要在其他函数(如 `main` 函数)之前被调用,那么必须先对这个函数进行声明。本例中的函数 `IsPrime` 的声明格式有误。
2. **语法错误**:`if !(n%i)` 这里的 `!` 应该放在括号外面,正确的写法应该是 `if (!(n%i))`。
#### 改正建议
1. **修正函数声明**:将 `IsPrime(intn);` 修改为 `int IsPrime(int n);`。
2. **修正 if 语句**:将 `if !(n%i)` 修改为 `if (!(n%i))`。
#### 正确代码
```c
#include <conio.h>
#include <stdio.h>
int IsPrime(int n); // 正确的函数声明
int IsPrime(int n) { // 函数定义
int i, m;
m = 1;
for (i = 2; i < n; i++) {
if (!(n % i)) { // 修正 if 语句
m = 0;
break;
}
}
return m;
}
int main() {
int j, k;
printf("\nplease enter an integer number between 2 and 10000:");
scanf("%d", &k);
printf("\n\nThe prime factor(s) of %d is(are):", k);
for (j = 2; j <= k; j++) { // 修正循环条件
if (!(k % j) && IsPrime(j))
printf(" %4d,", j);
}
printf("\n");
return 0;
}
```
### 第2题
#### 错误分析
1. **指针比较问题**:`while(*p != *q)` 这个条件无法保证两个字符串的不同。
2. **数组越界风险**:没有确保 `c` 数组不会越界。
#### 改正建议
1. **修改 while 循环条件**:使用 `*p` 和 `*q` 的 ASCII 值进行比较。
2. **添加长度检查**:确保 `c` 数组不会越界。
#### 正确代码
```c
#include <stdio.h>
#include <string.h>
void fun(char *p, char *q, char *c) {
int k = 0; // 修正初始值
while (*p || *q) { // 修改 while 循环条件
if (*p < *q) {
c[k++] = *q++;
} else {
c[k++] = *p++;
}
if (*p == '\0') {
while (*q)
c[k++] = *q++;
}
if (*q == '\0') {
while (*p)
c[k++] = *p++;
}
}
c[k] = '\0'; // 添加终止符
}
int main() {
char a[10] = "aBCDeFgH", b[10] = "ABcd", c[80] = {'\0'};
fun(a, b, c);
printf("The string a: %s\n", a);
printf("The string b: %s\n", b);
printf("The result: %s\n", c);
return 0;
}
```
### 第3题
#### 错误分析
1. **数组越界**:`s[j]` 可能访问数组越界。
2. **字符串终止符设置错误**:`s[j] = "\0";` 这里赋值方式不对。
#### 改正建议
1. **修正 for 循环**:确保不会越界。
2. **修正字符串终止**:使用 `s[j] = '\0';` 赋值。
#### 正确代码
```c
#include <stdio.h>
#include <conio.h>
void fun(char *s) {
int i, j = 0;
for (i = 0, j = 0; s[i] != '\0'; i++) {
if (s[i] >= '0' && s[i] <= '9') { // 修正条件判断
s[j++] = s[i];
}
}
s[j] = '\0'; // 修正字符串终止
}
int main() {
char item[80];
printf("\nEnter a string: ");
gets(item);
printf("\nThe string is: %s\n", item);
fun(item);
printf("\nThe string of changing is: %s\n", item);
return 0;
}
```
### 第4题
#### 错误分析
1. **参数类型声明问题**:`void fun(char *s, int a, int b)` 参数 `a` 和 `b` 应作为引用传递。
2. **指针越界风险**:没有确保 `s` 不会越界。
#### 改正建议
1. **修改参数类型**:使用指针或引用传递 `a` 和 `b`。
2. **添加长度检查**:确保 `s` 不会越界。
#### 正确代码
```c
#include <conio.h>
#include <stdio.h>
void fun(char *s, int *a, int *b) { // 使用指针传递 a 和 b
while (*s) {
if (*s >= 'A' && *s <= 'Z') {
(*a)++;
}
if (*s >= 'a' && *s <= 'z') {
(*b)++;
}
s++;
}
}
int main() {
char s[100];
int upper = 0, lower = 0;
printf("\nPlease enter a string: ");
gets(s);
fun(s, &upper, &lower);
printf("\nupper=%d lower=%d\n", upper, lower);
return 0;
}
```
### 第5题
#### 错误分析
1. **数组越界**:在 `for` 循环中,可能使数组越界。
2. **函数返回值问题**:`fun` 函数的返回值类型未指定。
#### 改正建议
1. **修正 for 循环**:避免数组越界。
2. **指定返回值类型**:显式声明 `fun` 函数的返回值类型。
#### 正确代码
```c
#include <stdio.h>
#define N 20
int fun(int *a, int n, int x) { // 指定返回值类型
int p = 0, i;
a[n] = x;
while (x != a[p]) {
p = p + 1;
}
if (p == n) {
return -1;
} else {
for (i = p; i < n - 1; i++) { // 修正循环条件
a[i] = a[i + 1];
}
return n - 1;
}
}
int main() {
int w[N] = {-3, 0, 1, 5, 7, 99, 10, 15, 30, 90}, x, n, i;
n = 10;
printf("The original data:\n");
for (i = 0; i < n; i++) {
printf("%5d", w[i]);
}
printf("\nInput x (to delete): ");
scanf("%d", &x);
printf("Delete: %d\n", x);
n = fun(w, n, x);
if (n == -1) {
printf("***Not found***\n");
} else {
printf("New length: %d\n", n);
}
return 0;
}
```
以上是对每个题目的详细分析与改进建议。通过这些改进,可以确保代码的正确性和稳定性。