C语言总结(大一学习C语言的个人易错及总结)

1. 记录循环次数使用i =i + 1

2. 字符画要及时换行

3. 使用绝对值用# include <math.h>

4.注意含有小数的除法 如:1/2的结果是0   必须1.0/2 才能得到0.5

5.比较不同数值时最好考虑到精度

6.变量的初始化!!!!!!!!!

7.m行个固定数目变量可以考虑定义数组 以及 嵌套循环

8.生成随机数用rand()

9. 赋值的时候要考虑数值对循环的检索是否有影响

10. 不要出现  if( a = 1)

                           ++i;  这种低级错误.

11. 定义数组是最好进行初始化赋值 否则会出现偶然性导致错误

12. 全局变量自动赋值为0 (注意他的应用

13. bool桶排的使用

for (m = 1; m <= n; m++)

{

        scanf("%d", &x);

        a[x] = 1;

}

for (m = 1; m <= 1000; ++m)

{        

        if(a[m])

        printf("%d ", m);

}

14. bool数据类型返回true 和 false

15. 法一: if(max>=8&&max==c[i])n=i;//找到津津不高兴的日期    可通过此方法找到

最大值所对应的天数

      法二: for(int i = 0;i < 7;++i) {//读入七组数据并处理

        scanf("%d %d",&a,&b);//读入第i+1天的学校学习小时与课外学习小时

        if(a + b > max_time && a + b > 8) {//如果总时间>8并且当前总时间比之前找到

的最大总时间大

            answer = i + 1;//更新答案为当前星期

            max_time = a + b;//更新最大值

        }                                                                                    即通过引入一个新的变量前后进行比较

    }

16. 字符串用%s进行输出

17. 注意结构体的输出必须分开写 eg. st.age

18. 对结构体中的字符串进行赋值时注意要调用strcpy函数 头文件使用 # include <string.h>

19. 使用函数对主函数的数据进行操作时 最好使用指针变量(整型变量除外) 否则

会占用较多的内存 eg.结构体

20. malloc动态分配内存必须手动释放free()

21. 函数前面定义类型是返回值类型

22. 有空格和TAB键不可以使用scanf 

      可以使用while((c = getchar()) != EOF)

{}  前面要加括号

23. 在输入字符串时,可以char a[] = "AEHIJLMOSTUVWXYZ12358";

                                 或scanf("%s",&a);  这里a代表已经定义好的数组

24. 如果多次输入不含空格和TAB键的字符串

      可以考虑 while(scanf("%s", s) == 1)        左边式子为scanf返回值的数量

25. 每位数加和的处理方法

 int x = i, y = i;

        while(x > 0)

        {

            y = y + x % 10;

            x = x / 10;

        }

26. 注意strlen(头文件string.h)与sizeof的使用

strlen检索有效数据 sizeof检索整个数组的长度

27. 计算幂的大小时使用 log函数 ,头文件(math.h) 但此时数据存储需要使用

double

28. 不输出浮点型数据无意义的0时,使用%g, printf(“%g”, a);自动选f格式

或e格式(选择输出时占宽度较小的一种),且不输出无意义的0

29. unsigned long long int a 是位数最大的数据类型

30. 几个很大的数相乘的时候数据可能会溢出 所以此时有除法先用除法

31. 控制每个数据输出的位宽以及对齐方式

32. 设置所占字符数,并在前面补0: %.3d %.3o %.3x(十进制 八进制 十六进制)

33. 若输入的字符有指定格式 可以考虑直接使用scanf eg.国际电话号码

34. 能用公式尽量用公式 循环计算量太大 如从1加到n

35. isalpha函数用于判断字符是否为英文字母  isdigit判断字符是否为数字

36. memset可用于数组清零 memset(a, int i(这里可以是常数), n) 将已开辟内存空间 a的首 n 个字节的值设为值 i

37. 对变量的值进行修改时要注意会对循环等造成什么影响

      主要用于每次进行循环后的数组初始化

38. 记录一个数各种数字个数的方法

while(x > 0)

            {

             count[x % 10]++;

             x = x / 10;

            }

39. 周期性问题注意最小正周期一定能够整除字符串长度 检验周期是只有最后一

个周期不用检验

40. 多组问题注意格式的输出 一般每组数据有空行或者空格且最后一组不会有

41. ch - ‘A’ 返回的数值是从0开始的 ch - ‘0’只能赋给整数型

42. 输入小数时,浮点数的精度往往不好控制 循环时应该在下一位加个1 例如要

输入一位小数 需要i <= a + 0.01

43.检验是否为完数:

   double x=0.0;

    scanf("%d",&a);

    x=sqrt(a);

    if(x==(int)x) flag=1;

44. 有关一一映射的题目可以对每个元素进行计数并排序,若命题成立则顺序与

数值均相同

45. 标定次数的问题适合用减法 注意使用非       

   eg.if(bad) --chance;

        if(!chance) lose = 1;

        if(!left) win = 1;

46. 字母再猜一次算错,可是似乎并没有保存哪些字母已经猜过,将猜对的字符

改成空格是一种好方法

47. if(ans[i] == ch)

        {

            left--;

            ans[i] = ' ';

            bad = 0;

        }

    }

        if(bad) --chance;        //找到就减一        //遍历的方法

48. do-while循环能保证do中的内容能够至少进行一次(概念性问题!)

49.一个循环走步函数

// 逆时针走t步,步长是d(-1表示顺时针走),返回新位置     uva133

int go(int p, int d, int t) {

  while(t--) {

    do

    { p = (p+d+n-1) % n + 1; }

    while(a[p] == 0); // 走到下一个非0数字

  }

  return p;

}

50. 按行输入时只能使用gets(每行输入什么什么)

      按块输入可以使用scanf

51. 对浮点数0的限制要用0.0

52. 不进行变量的初始化就会出错!!!!!!!!!

53. 如果正着想不好想那不妨使用逆向思维    对于题干中不同于正常思维的映射

描述,不妨对变量进行处理 如problem1244 几时几分几秒

54. 基本的数学公式有必要再复习一下

55. 当cmd运行没有结果是不妨检查一下是不是for while循环语句后面加了分号构

成空语句

56. 0是任意整数的倍数(任意整数都是0的约数),但是0不能是约数 两个数的

最大公因数乘以最小公倍数等于这两个数的乘积

两行结束

57. 进行函数递归时 每调用一次函数 上一次函数占用的内存都会被释放掉 也就

是说要注意形成真正的递归 if和else还是只用if 需要谨慎

int readchar()

{

    while(true)

    {

        int ch = getchar();

        if(ch != '\n' && ch != '\r')return ch;

    }

}

int readint(int c)

{

    int v = 0;

    while(c--)  v = v * 2 + readchar() - '0';

    return v;

}

         从前往后读取

char ch;

    while((ch = getchar()) != EOF) 不需要数组然后scanf

char * str_cpy(char * tchar * s)

{

    /* for(int i = 0; t[i] != '\0'; ++i)

        t[i] = 0; */

    int i;

    for(i = 0s[i] != '\0'; ++i)

        {

            t[i] = s[i];

            /* s[i] = 0; */

        }

        t[i] = '\0'; // 需要添加终结符 否则后面的元素全部为垃圾值

        return t;

}

 

75.

strcpy和memcpy主要有以下3方面的区别。

1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。

2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。

3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy

76.有些题目可以尝试把第一项或者最后一项单独拿出来解决

77.递归求逆序注意return if else的摆放Problem2415

#include <stdio.h>

int input(void)

{

    char str[101];

    if(gets(str) != NULL)

        input();

    else

        return 0;

    printf("%s\n", str);

    return 0;

}

int main(void)

{

    input();

    return 0;

}

 

78.要合适地运用scanf的特性 它是可以读入空格的 例如读入如下数据时

5 10

Bill_Gates A A A A A B B B B B 3

Tom A B C D E A B A D E 9

Jackson A A A A A B B B B B 4

Mammal_1 B B B B B B B B B B 6

Jack A B A D E A B C A E 5

中间的字母部分可以写scanf(" %c", &val);   //也即前面加一个空格

79.交换字符串时要定义一个数组而不是一个空指针(动态内存分配也可以)

char m[MAX_LEN];

    strcpy(m, s);

    strcpy(st);

    strcpy(t, m);

80.整型转成字符串时一定要记得加‘0’

81.定义字符串数组时,不同字符串记得加逗号

82.尽量多写函数, 避免在循环中对迭代器进行操作

  • 查找的题目中没有必要把需要查找的内容放到数组中 只需循环输入
  • 每次gets都会在新输入字符串的下一位自动添加'\0'终结符
  • %lg只能输出double类型
  •  各种排序方法掌握好!
  •  枚举时尽量少用循环 可以缩小范围或者看某个数在不在规定范围内
  • 含变化过程的数组题目尽量把数组范围开大一点
  • 输入为一篇英文文章,最少有一个字符,至EOF结束。应采取的方法为:
  • 1<<len 表示2的len次幂(实际上是在二进制中将1向左移动len位)
  • 如果输入姓名和学号都可以检索到学生,那么不妨直接定义两个字符型数组
  • 一旦有除法、取余,就要考虑到零的出现
  • 对于浮点数的精度问题,经常性加入eps = 1e-6来消除误差
  • 使用函数进行递归时 要注意return的放置
  • strlen只能用于计算字符串的长度
  • Ch - 'a' 和ch-‘A’会区分大小写  因此要分开写
  • 对于字符转数字如上 数字转字符应该输出%c 变量为‘A’ +  i(大写的方法)
  • 上述转换除了字母之外输入其他类型字符也会产生结果 因此要特别注意数组越界
  • 二进制代码转化为十进制的方法
  • 18
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值