C语言程序设计 归类总结 哈工大考研复试

C语言程序设计 归类总结 哈工大考研复试,第1张

C语言程序设计 归类总结 哈工大考研复试

苏小红主编C语言程序设计配套资源,题目来自http://sse.hit.edu.cn/ :edoc26265144541703426777m1 部分容易题目不再记录

文章目录
      • 常见错误总结
      • 题目集
        • 分支和循环
        • 算术表达式、数据类型和输入输出
        • 函数
        • 字符串
        • 数组 - 查找与排序
        • 指针与结构体

常见错误总结
  1. 宏定义变量冲突;
  2. 未定义的变量;
  3. 不该写的分号:define,while循环,for循环,函数开头;
  4. 少写的括号、分号、逗号和引号:语句块,结构体结尾,printf,do while 语句后;
  5. 分号和引号写成中文标点符号,减号写成破折号,头文件尖括号写成圆括号,语句结束分号写成逗号;
  6. 错误的判断条件:判断时少写一个等号,或者大于小于弄反,或者和、或条件弄反,或者写成位运算,或者将指针与数值比较,或者取余使用除号;
  7. 分支关系复杂时没有使用标志变量;
  8. scanf参数没加“&”,或写错数组首地址;
  9. 没有在scanf中用"n"或使用getchar吸收回车;
  10. 输入有空格的字符串错误地使用了scanf而不是gets;
  11. 使用getchar错误地把输入字符当做参数而不是返回值;
  12. 忘了把循环变量或者标志变量或者临时变量声明或初始化为0或-1,或者初始化错误;
  13. 忘了循环变量自增,或者累加,或者累加步长错误;
  14. continue和break搞混;
  15. 逻辑错误,如使用了错误的数组名或变量,或者执行顺序错误;
  16. 数组定义没用中括号,或使用未初始化变量;
  17. 忘记数组下标是0-based;
  18. 二维数组行列弄反,如矩阵相乘时;
  19. 调用数组多写了中括号,调用指针时错误地进行了解引用或者没有取地址;
  20. 数组指针解引用错误,没加括号或者括号不对;
  21. 使用行乘以总列数加列来获取数组元素时,注意总列数是不是提前宏定义的;
  22. 交换两个数要通过指针,交换指针指向的内容不能交换指针本身;
  23. 链表头指针、前指针与当前指针赋值关系混乱;
  24. 使用malloc, free等函数时没有引用头文件stdlib.h,使用sqrt等函数时没有引用math.h;
  25. 数据类型错误,如整数和浮点数计算,输入字符或浮点数用了"%d",输出整数用了"%3f",输出字符用了"%s",返回浮点数但函数定义为int型,结构体指针赋值给了整型指针,数据赋值给了指针,计算浮点数绝对值使用abs而不是fabs;
  26. 浮点数比较相等直接使用==而不是fabs(a-b)<1e-3;
  27. sizeof使用出错;
  28. 非void函数忘记返回;
  29. 函数参数数量或类型不正确;
  30. 折半查找法下标弄错;
  31. 字符串常量没有加引号;
  32. 比较字符串相等没有使用string.h中的strcmp函数;
  33. 忽略字符串中空格和结束符都需要占用空间,初始化大小不够;
  34. 结构体定义缺少struct关键字
题目集 分支和循环
  1. 以下程序功能是实现求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;
}
  1. 求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++;
      } 
  } 
}
  1. ※利用泰勒级数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);
}
  1. 下面程序用于输入三角形的三条边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. 有关输入输出问题。
    输入为:
    1↙
    2↙
    a↙
    b↙
    运行结果为:1,2,a,b,123.300000,65535
    请改正程序中的错误,使它能得出正确的结果。
#include 

main()
{
    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); //原题写了一半,手动补全
    }
  1. 马克思手稿中有一道趣味数学题:有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​
								//#include 
main()
{ 
    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);  
        }
}
  1. 比较两个字符的大小,按由小到大输出。运行时输入数据:34↙
    请改正程序中的错误,使它能得出正确的结果。
#include 

main()
{
    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);
}
  1. 利用pi/2=2/1 *2/3 *4/3 *4/5 *6/5 6/7…的前100项之积,编程计算pi的值。
#include  
main()
{
    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);
}
  1. 求输入两个数的和、差、积、商和余数(如果是浮点数,则需将其强转为整型后计算余数)。请改正程序中的错误,使它能得出正确的结果。
#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. 求1+2+…+n之和。请改正程序中的错误,使它能得出正确的结果。
#include 

unsigned 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;
}
#include  
unsigned 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);
}
  1. 按如下函数原型用函数编程解决如下的日期转换问题(要求考虑闰年的问题):
    输入某年某月某日,计算并输出它是这一年的第几天。

    int DayofYear(int year, int month, int day);
    下面程序中存在比较隐蔽的错误,请通过分析和调试程序,发现并改正程序中的错误。
#include 
int 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;
}
  1. 函数fun()功能是:将所有大于1小于整数m的素数存入xx所指向的数组中,素数的个数通过k传回。
    例如输入25,则应输出 :
    There are 9 prime numbers less than 25:
    2 3 5 7 11 13 17 19 23
#include 

void fun(int m, int *k, int xx[])
{
    int i,j,t;
    int n;  		//int n=0;
    for(i=2;i 
  1. 对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 
  1. 阅读程序,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;
}
  1. 下面程序的功能是将数组元素倒置 ,找出其中的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 
指针与结构体 
  1. 创建动态链表并打印链表内容。要求通过键盘读入学生的学号和分数,当输入的学号为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;
}
  1. 下面程序用于将6个数按输入时顺序的逆序进行排列。找出其中错误,并改正之。
//本题主要是把指针、地址等概念全部搞混了
#include
void 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 
  1. 在下面使用指针数组的程序中存在一个错误,试分析这个程序,并上机运行,观察运行结果,找到这个错误,并分析出错的原因。
#include 
void  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 
  1. 程序改错。以下程序用于打印输出结构体数组的所有元素。
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 );
    }
     
}
  1. 编程统计候选人的得票数。设有3个候选人,Li,Zhang,Fun。
    要求输入投票总数n,然后每次输入一个得票的候选人的名字(区分大小写),若选民输错候选人姓名,则按废票处理。
    选民投票结束后程序自动显示各候选人的得票结果。
#include 
 
struct 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;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5692640.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存