文章目录苏小红主编C语言程序设计配套资源,题目来自http://sse.hit.edu.cn/ :edoc26265144541703426777m1 部分容易题目不再记录
- 常见错误总结
- 题目集
- 分支和循环
- 算术表达式、数据类型和输入输出
- 函数
- 字符串
- 数组 - 查找与排序
- 指针与结构体
- 宏定义变量冲突;
- 未定义的变量;
- 不该写的分号:define,while循环,for循环,函数开头;
- 少写的括号、分号、逗号和引号:语句块,结构体结尾,printf,do while 语句后;
- 分号和引号写成中文标点符号,减号写成破折号,头文件尖括号写成圆括号,语句结束分号写成逗号;
- 错误的判断条件:判断时少写一个等号,或者大于小于弄反,或者和、或条件弄反,或者写成位运算,或者将指针与数值比较,或者取余使用除号;
- 分支关系复杂时没有使用标志变量;
- scanf参数没加“&”,或写错数组首地址;
- 没有在scanf中用"n"或使用getchar吸收回车;
- 输入有空格的字符串错误地使用了scanf而不是gets;
- 使用getchar错误地把输入字符当做参数而不是返回值;
- 忘了把循环变量或者标志变量或者临时变量声明或初始化为0或-1,或者初始化错误;
- 忘了循环变量自增,或者累加,或者累加步长错误;
- continue和break搞混;
- 逻辑错误,如使用了错误的数组名或变量,或者执行顺序错误;
- 数组定义没用中括号,或使用未初始化变量;
- 忘记数组下标是0-based;
- 二维数组行列弄反,如矩阵相乘时;
- 调用数组多写了中括号,调用指针时错误地进行了解引用或者没有取地址;
- 数组指针解引用错误,没加括号或者括号不对;
- 使用行乘以总列数加列来获取数组元素时,注意总列数是不是提前宏定义的;
- 交换两个数要通过指针,交换指针指向的内容不能交换指针本身;
- 链表头指针、前指针与当前指针赋值关系混乱;
- 使用malloc, free等函数时没有引用头文件stdlib.h,使用sqrt等函数时没有引用math.h;
- 数据类型错误,如整数和浮点数计算,输入字符或浮点数用了"%d",输出整数用了"%3f",输出字符用了"%s",返回浮点数但函数定义为int型,结构体指针赋值给了整型指针,数据赋值给了指针,计算浮点数绝对值使用abs而不是fabs;
- 浮点数比较相等直接使用==而不是fabs(a-b)<1e-3;
- sizeof使用出错;
- 非void函数忘记返回;
- 函数参数数量或类型不正确;
- 折半查找法下标弄错;
- 字符串常量没有加引号;
- 比较字符串相等没有使用string.h中的strcmp函数;
- 忽略字符串中空格和结束符都需要占用空间,初始化大小不够;
- 结构体定义缺少struct关键字
- 以下程序功能是实现求10000 以内的自然数中的完数及其个数(所谓完数,指它恰好等于除它本身之外的因子之和,如:6=1+2+3,28=1+2+4+7+14),并显示结果。该程序中有8处错误,请调试并改正。不允许改变程序结构和大量地增删语句。只有全部正确才能得分。
#include#define LEN=10000; // #define LEN 10000 int main(void) { int i,k,m,n,s,p; // int i,k,m,n,s,p=0; int a(100); //int a[100]; printf("Number as follows:"); //答案的follows改成了follew,答案错了 for (i=2; i<= LEN; i++) { s=0; m=0; k=1; while(k<=i/2); //while(k<=i/2) { if (i%k==0) { s=s+k; a[m]=k; m=m+1; } //k++; } if (s=i) // if (s==i) { p=p+1; printf("n%d=%d",s,a[0]); n=1; while (n > m) // while (n < m) { printf("+%d,a[n]); //printf("+%d",a[n]); n=n+1; } } } printf("nTotal Num: %d",p); return 0; }
- 求100~200间的全部素数(即质数),要求每行输出10个素数。
#include//#include main() { int m,k,i,n; //int m,k,i,n=0; for(m=101;m<=200;m+=2) { if(n%10==0) printf("n"); //实际上这个if应该移到下面的if里面,答案没有考虑 k=sqrt(m); for(i= 1;i<=k;i++) if(m%i==0) continue; //break; if(i==m%10) //if(i>k) { printf("%d ",m);//printf("%d ",m); 分号 n++; } } }
- ※利用泰勒级数sin(x) = x - x^3/3! + x^5/5! - x^7/7! + x^9/9! … 计算sin(x) 的值。
要求最后一项的绝对值小于10^(-5),并统计出此时累加了多少项。
#include#include main() { int n = 1,count = 1; float x; double sum , term; printf("Input x: "); scanf("%d", &x); //scanf("%f", &x); sum = x; term = x; do { term = -term*x*x/(n+1)*(n+2); //term = -term*x*x/(n+1)/(n+2); sum = sum + term; n++; //n+=2; count++; }while (fabs(term) <= 1e-5); //}while (fabs(term) > 1e-5); printf("sin(x) = %f, count = %dn", sum, count); }
- 下面程序用于输入三角形的三条边a,b,c,判断它们能否构成三角形,若能,则指出是何种三角形:等腰三角形、直角三角形、等腰直角三角形,一般三角形。若不能,则输出“不是三角形n”。允许的浮点数计算误差在0.1范围内。
请修改下面程序,使其运行结果完全正确。只有全部错误都修改正确才给分,部分错误修改正确不给分。允许修改和增加语句,但是不允许删除语句,也不要修改变量的类型。
#include算术表达式、数据类型和输入输出#define LIMIT = 1e-1; //#define LIMIT 1e-1 int main() { float a, b, c; //int flag=1; scanf("%d, %d, %d", a, b , c); // scanf("%f, %f, %f", &a, &b , &c); if (a + b > c || b + c > a || a + c > b) // if (a + b > c && b + c > a && a + c > b) { if (fabs(a - b) <= LIMIT | fabs(b - c) <= LIMIT | fabs(c - a) <= LIMIT)//if (fabs(a - b) <= LIMIT || fabs(b - c) <= LIMIT || fabs(c - a) <= LIMIT) 有相似题目的错误是此处直接写成了相等 { printf("等腰"); //flag=0; } else if (fabs(a * a + b * b - c * c) <= LIMIT //if (fabs(a * a + b * b - c * c) <= LIMIT 有相似题目的错误是此处直接写成了相等 && fabs(a * a + c * c - b * b) <= LIMIT //|| fabs(a * a + c * c - b * b) <= LIMIT && fabs(c * c + b * b - a * a) <= LIMIT) //|| fabs(c * c + b * b - a * a) <= LIMIT) { printf("直角"); //flag=0; } else //if(flag) { printf("一般"); } printf("三角形n"); } else { printf("不是三角形n"); } return 0; }
- 有关输入输出问题。
输入为:
1↙
2↙
a↙
b↙
运行结果为:1,2,a,b,123.300000,65535
请改正程序中的错误,使它能得出正确的结果。
#includemain() { int b; //double b; 注意改成float精度不够 unsigned short a = 65535; short k = a; char c, d; int f, g; b = (1234.0 - 1) / 10; scanf("%c", &c); scanf("%c", &d); //scanf("n%c", &d); scanf("%d", &f); //scanf("n%c", &f); scanf("%d", &g); //scanf("n%c", &g); printf("%c,%c,%c,%c,%f,%d", c, d, f, g, b, a); //原题写了一半,手动补全 }
- 马克思手稿中有一道趣味数学题:有30个人,其中可能有男人、女人和小孩,在一家饭馆里吃饭共花了50先令,每个男人各花3先令,每个女人各花2先令,每个小孩各花1先令,问男人、女人和小孩各有几人?
假设男人为x人,女人为y人,小孩为z人,则有以下方程组:
{ x + y + z = 30 3 x + 2 y + z = 50 begin{cases}x+y+z=30\3x+2y+z=50end{cases} {x+y+z=303x+2y+z=50
//#includemain() { int x,y,z; printf("Man t Women t Childernn"); for (x=0; x<16; x++) //for (x=1; x<16; x++) for (y=0; y<25; y++) //for (y=1; y<25; y++) { z = 30 – x - y; //z = 30 - x - y; 魔鬼吧! if (3 * x + 2 * y + z = 50) //if (3 * x + 2 * y + z == 50) printf("%3ft %5ft %8fn",x,y,z); // printf("%3dt %5dt %8dn",x,y,z); } }
- 比较两个字符的大小,按由小到大输出。运行时输入数据:34↙
请改正程序中的错误,使它能得出正确的结果。
#includemain() { char t, c1, c2; getchar(c1), getchar(c2); //c1=getchar();c2=getchar(); if (c1 > c2) //if (c1 > c2){ t = c1; c1 = c2; c2 = t; //} printf("%c,%c", c1, c2); }
- 利用pi/2=2/1 *2/3 *4/3 *4/5 *6/5 6/7…的前100项之积,编程计算pi的值。
#includemain() { double term, result; //double term, result=1; int n; for (n=2, n<=100, n++) //for (n=2; n<=100; n+=2) { term = (n * n) / ( n - 1) * ( n + 1); //term = (n * n) / ( n - 1.0) / ( n + 1); result = result * term; } printf("result=%fn", 2 * result); }
- 求输入两个数的和、差、积、商和余数(如果是浮点数,则需将其强转为整型后计算余数)。请改正程序中的错误,使它能得出正确的结果。
#include函数main() { float a, b; float sum, minus, product, quotient; int remainder; printf("n请输入两个数:n"); scanf("%fn%f", a, &b); // scanf("%fn%f", &a, &b); sum = a + b; minus = a - b; product = a * b; quotient = a / b; remainder = a % b; // remainder = (int)a % (int)b; 注意强制转换,数据类型要加括号 printf("和为:%.2fn", sum); printf("差为:%.2fn", minus); printf("积为:%.2fn", product); printf("商为:%.2fn", quotient); printf("余数为:%dn", remainder); }
- 求1+2+…+n之和。请改正程序中的错误,使它能得出正确的结果。
#includeunsigned long fun(int n); main() { int n; unsigned long sum = 0; printf("Input n:"); scanf("%d", &n); while (n) { sum = fun(n--); //sum += fun(n--); } printf("The sum is :%u", sum); } unsigned long fun(int n) //这个函数什么意思至今不懂 { unsigned long m_sum = 0; m_sum += n; return m_sum; }
#includeunsigned long Factorial(unsigned int n); //unsigned long Factorial(unsigned int n) { if (n < 0) { printf("data error!"); return 0; } else if (n==0 && n==1) //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); //scanf("%d", &n); x = Factorial(n); printf("%d!=%ldn", n, x); }
- 按如下函数原型用函数编程解决如下的日期转换问题(要求考虑闰年的问题):
输入某年某月某日,计算并输出它是这一年的第几天。
int DayofYear(int year, int month, int day);
下面程序中存在比较隐蔽的错误,请通过分析和调试程序,发现并改正程序中的错误。
#includeint DayofYear(int year, int month, int day); int dayTab[2][13] = { {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} }; main() { int year, month, day; printf("Please enter year, month, day:"); scanf("%d,%d,%d", year, month, day); // scanf("%d,%d,%d", &year, &month, &day);// printf("yearDay = %dn" DayofYear(year, month, day)); //printf("yearDay = %dn" ,DayofYear(year, month, day));// } int DayofYear(int year, int month, int day); { int i, leap; leap = year / 4 = 0 & year / 100 != 0 | year / 400 = 0; //leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0; for (i = 0, i < month, i++); //for (i = 0, i < month, i++) { day = day - dayTab[leap][i]; //day = day + dayTab[1-leap][i]; } //return day; }
- 函数fun()功能是:将所有大于1小于整数m的素数存入xx所指向的数组中,素数的个数通过k传回。
例如输入25,则应输出 :
There are 9 prime numbers less than 25:
2 3 5 7 11 13 17 19 23
#includevoid fun(int m, int *k, int xx[]) { int i,j,t; int n; //int n=0; for(i=2;i
- 对N行N列二维数组的每一行排序,偶数行(0当作偶数)由小到大排序,奇数行由大到小排序。
#include#define N 4 void swap(int *p1, int *p2) { int p; p=p1;p1=p2;p2=p; //p=*p1;*p1=*p2;*p2=p; } void sort(int a[N][N]) { int i,j,k; for(i=0;i
- 阅读程序,fun函数功能是:交换数组aa中最大和最小两个元素的位置,结果依然保存在原数组中,其他元素的位置不变。注:数组中没有相同元素。
#include#include #define N 10 int main() { int i; int aa[N] = {44, 55, 62, 42, 35, 52, 78, 95, 66, 73}; printf("n***original list***n"); for (i = 0; i < N; i++) printf("%4d", aa[i]); Fun(aa); printf("n***new list***n"); for (i = 0; i < N; i++) { printf("%4d", aa[i]); } return 0; } void Fun(int aa[]) { int i, t; int max = aa[0]; // int max = 0; int min = aa[0]; // int min = 0; for (i = 1; i < N; i++) { if (aa[i] < aa[max]) //if (aa[i] > aa[max]) max = i; else if (aa[i] > aa[min]) // else if (aa[i] < aa[min]) min = i; } t = aa[max]; aa[min] = aa[max]; //aa[max] = aa[min]; aa[min] = t; }
- 下面程序的功能是将数组元素倒置 ,找出其中的4处错误并改正之。
#include "stdio.h" //可以这样写 #define M 5; //#define M 5 main() { int a[M]={1,2,3,4,5}; int i,j,*t; //t实际应为int,但不改结果不错 i=0;j=M-1; while(i) //while(i指针与结构体
- 创建动态链表并打印链表内容。要求通过键盘读入学生的学号和分数,当输入的学号为0时表示链表创建结束,并将读入的学生学号和成绩打印输出。
#include// #include #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; //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; //p1=head; while (p1 != NULL) { printf("num:%dtscore:%.2fn", p1->num, p1->score); p1 = p1->next; } } return 0; }
- 下面程序用于将6个数按输入时顺序的逆序进行排列。找出其中错误,并改正之。
//本题主要是把指针、地址等概念全部搞混了 #includevoid Swap(int *x, int *y) { int *temp; //int temp; temp = x; //temp = *x; x = y; //*x = *y; y = temp; //*y = temp; } void Sort(char *p,int m)//void Sort(int *p,int m) { int i; char change,*p1,*p2;//int change,*p1,*p2; for(i=0;i
- 在下面使用指针数组的程序中存在一个错误,试分析这个程序,并上机运行,观察运行结果,找到这个错误,并分析出错的原因。
#includevoid Print(char *arr[], int len); int main(void) { char *pArray[] = {"Fred","Barrey","Wilma","Betty"}; int num = sizeof(pArray) / sizeof(char); //int num = sizeof(pArray) / sizeof(pArray[0]); printf("Total string numbers = %dn", num); Print(pArray, num); return 0; } void Print(char *arr[], int len) { int i; for (i=0; i
- 程序改错。以下程序用于打印输出结构体数组的所有元素。
struct s { char name[10]; int age; } //}; main() { struct s a[3] = {”John”,19,”Paul”,17,”Marry”,18};//struct s a[3] = {"John",19,"Paul",17,"Marry",18}; int *p; //struct s *p; for(p = a; p < 3; p++) //for(p = a; p < a+3; p++) { printf("%s,%dn", p->name, p->age ); } }
- 编程统计候选人的得票数。设有3个候选人,Li,Zhang,Fun。
要求输入投票总数n,然后每次输入一个得票的候选人的名字(区分大小写),若选民输错候选人姓名,则按废票处理。
选民投票结束后程序自动显示各候选人的得票结果。#includestruct person { char name[20]; int count; } //}; person leader[3] = {"Li", 0, "Zhang", 0, "Fun", 0};//struct person leader[3] = {"Li", 0, "Zhang", 0, "Fun", 0}; int main() { int i, j; char leader_name[20]; //int n; scanf("%dn", &n); for (i = 0; i < n; i++) { scanf("%s", leader_name); for (j = 0; j < 3; j++) if (leader_name == leader[j].name)//if (!strcmp(leader_name,leader[j].name)) leader[j].count++; } printf("n"); for (i = 0; i < 3; i++) printf("%5s:%dn", leader[i].name, leader[i].count); return 0; } 欢迎分享,转载请注明来源:内存溢出
评论列表(0条)