湖北专升本c语言本人的错题集

c语言易错知识点

每个语句以分号(;)结束,C语言的32个关键字和9种控制语句

C语言中函数的存储类型隐含为版全局的,因此默认为extern。

c语言编译过程 编译器检查源代码中的语法或结构错误,如果源代码无错误,则编译器将生成目标代码

默认情况下,所有的函数都是外部函数

c语言定义的全部变量,其作用域从文件的定义开始到本源文件结束

随机读写方式不适合文本文件

顺序读写方式适合于二进制文件

随机文件是以固定长度的记录为单位进行存储和访问的

文本文件由ASCLl码形式存储数据

结构化程序设计主要强调的是程序易读性

fprintf函数是格式化写入, fscanf 格式化读取

fread是以二进制的形式读取文件里的内容

fwrite函数是以二进制形式存储

fputs是ASCLL码的形式写入到文件

二进制文件适合顺序读写也适应随机读写

文本文件只适合顺序读写

数组名是一个指针,不能指向数组的任意元素(常量指针)

算数优先级高->低 ^ ,-(负数),*,/,%,+,-,&

c语言的构造类型数据有三种:数组,结构体,共用体类型;

typedef不能增加新类型,不能定义变量

结构体:成员中内存量最大者所需的容量整数倍

1.a *= a += a++;算完再+

    int a = 5;
    a *= a += a++;
    printf("%d", a);//101
//错题二
int x = 0, y = 5, z = 3;
    while (z-- > 0 && ++x < 5)y = y - 1;
    //z=2,x=1,y=4
    //z=1,x=2,y=3
    //z=0,x=3,y=2
    //z=-1 break
    //3  2   -1
    printf("%d,%d,%d", x, y, z);
​
int i, n = 0;
    for (i = 2; i < 5; i++) {
        do {
            if (i % 3)continue;//跳出当前while循环
            n++;
        } while (!i);
        //continue 执行完之后,跳到这里来了
        n++;
        printf("%d\n", n);
    }
    printf("%d", n);//4
​
//ABLMNP  --->LBLMNP
char a[80] = "AB", b[80] = "LMNP";
    int i=0;
    strcat(a, b);
    puts(a);
    while (a[i++] != '\0')b[i] = a[i]; //注意i++变了值
    puts(b);//b[0]还是L没有变

 

2.数据类型,scanf格式要看清

    double d = 3.2;
    int x, y;
    x = 1.2;    y = (x + 3.8) / 5.0;
    printf("%d\n", y);      printf("%d\n", d * y);
    //3 错题
    int a1 = 1, b;  //1234567
    scanf("%2d%2d", &a1, &b);
    printf("%d %d", a1, b);
​
int i = 1, j = 10;
    do {
        if (i++ > --j)continue;
    } while (i < 5);
    printf("%d,%d", i, j);//5,6
​
    int a = 257;
    printf("%x", a);//101
/16*16  16  1
    
struct {
    double a;
    char b;
}m; //是结构体变量
​
    char* s = "121";
    int k = 0, a = 0, b = 0;
    do {
        k++;
        if (k % 2 == 0) {
            a = a + s[k] - '\0';
            printf("a1=%d\n", a);
            continue;
        }
        b = b + s[k] - '\0';
        a = a + s[k] - '\0';
    } while (s[k + 1]);
​
    printf("%d\n", '\0');
    printf("k=%d,a=%d,b=%d\n",k,a,b);
    //k=2,a=99,b=50

 

3.&&的优先级比||高

    int a2 = 4, b2 = 5, c2 = 0, d2;
    d2 = !a2 && !b2 || !c2;
    //相当于(!a && !b ) 0||1
    printf("%d", d2);

 

4.输出什么要注意

int x, i;
for (i = 1; i <= 50; i++) {
    x = i;
    if (++x % 2 == 0)
        if (x % 3 == 0)
            if (x %7 == 0)
                printf("%d", i);
}

 

5.循环几次要注意

int i = 0, a = 0;
    while (i < 20) {
        for (;;) {
            if ((i % 10) == 0)break;
            else i--;
        }
        i += 11; a += i;
    }
    printf("%d\n", a);

 

6.break跳出当前switch

int k = 5, n = 0;
    while (k > 0) {
        switch (k)
        {
        default:break;
        case 1:n += k;
        case 2:
        case 3:n += k;
        }
        k--;
    }
    printf("%d\n",n);

 

7.注意循环封号 ;

    int s, i;
    for (s = 0, i = 1; i < 3; i++, s += i);
    printf("%d\n", s);

 

8.静态static全局和局部

int a = 2; //全局
int f(int n) {
    //局部静态 只在这个函数内有效
    static int a = 3; //n=0, 局部a1=3
    int t = 0;//每次进来初始化0
if (n % 2) {
//n=0,没进来,n=1,进来了 t=0+4++=4, a2=5了
        static int a = 4;
         t += a++;
    }
    else {
//n=0 ,t=0+5=5,a3=6了 , n=2,t=0+6++=6, a3=7
        static int a = 5;
        t += a++;
    }
        return t + a++;
    //n=0,t=5,return 5+3++=8, 这里的a1=4了
    //n=1,t=4,return 4+4++=8, 这里的a1=5了
    //n=2,t=6,return 6+5++=11,这里之后a1=6了
}
​
int main() {
    int s = a, i;
    //这里的 s=2,全局变量
    for (i = 0; i < 3; i++) {
        s += f(i);
        //i=0,s=2+f(0)=2+8=10;
        //i=1, s=5+f(1)=10+8=18
        //i=2, s=18+f(2)=18+11=29
        printf("%d\n", s);
        // 10 18 29
    };
    return 0;
}

9.前20项之和

//1.1   
    int i;
    float sum = 0, fz = 2, fm = 1,temp;
    for (i = 0; i < 20; i++) {
        sum += fz / fm;
        temp = fz;
        fz = fz + fm;
        fm = temp;
    }
    printf("前20项之和:%f\n",sum);
    //32.660263
//2.1
double a = 2, b = 1, t, s = 0;
int n = 0;
while (n < 20) {
    s += a / b;
    t = a;
    a = a + b;
    b = t;
    n++;
}
printf("%f\n", s);
//32.660261

10.1000以内能被7或11整除并且不能被7和11整除

//1.1答案
int num, n = 0;
    printf("1000以内能被7或11整除:\n");
    for (num = 1; num <= 1000; num++) {
        if (num % 7 == 0||num%11==0) {
            if (!(num % 7 == 0 && num % 11 == 0)) {
                printf("%d\t", num); n++;
                if (n % 5 == 0)printf("\n");
            }
        }
    }
//2.1 自己写的
int i, k = 0;
for (i = 1; i <= 1000; i++) {
    if (i % 7 == 0 || i % 11 == 0 && i % 77 != 0) {
        printf("%d\t", i); k++;
        if (k % 5 == 0)printf("\n");
    }
}

11求数组里出现最多的数

int a[11] = {-3,1,3,3,5,5,5,8,9,9,6};
int i, j, d, max=0, y=a[0];
for (i = 0; i < 11;i++) {
    d =0;
    for (j = 0; j < 11; j++) {
        if (a[i] == a[j])d++;
    }
    if (d>max) {
        max = d;  //max=次数
        y= a[i]; //t 就是当前数组次数的数
    }
}
    printf("次数最多:%d,次数:%d",y,max);

12.注意看for循环里的条件

char ch[7] = { "65ab21" };
    int i, s = 0;
    for (i = 0; ch[i] >= '0' && ch[i] <= '9'; i += 2) {
        s = 10 * s + ch[i] - '0';
    }
    printf("%d\n", s);

13.程序结果题(仔细一点)

int a[3][3] = { {1,2,9},{3,4,8},{5,6,7} };
    int i, s = 0;
    for (i = 0; i < 3; i++) {
        s += a[i][i] + a[i][3 - i - 1];
    }
    printf("%d\n",s);
//注意输出第几个
int i, n[] = { 0,0,0,0,0 };
    for (i = 1; i <= 4; i++) {
        n[i] = n[i - 1] * 2 + 1;
        printf("%d",n[i]);
    }

14 5个学生4门成绩,求出每个学生的平均成绩,从高到底排序输出

int i, j;
    float sum, t, ave[5] = { 0 };
    float s[5][4] = { {78,90,32,55},
                        {78,90,32,55},
                        {90,23,55,33},
                        {90,23,55,33}, 
                        {90, 23, 55, 33}};
    
    for (i = 0; i < 5; i++) {
        sum = 0;
        for (j = 0; j < 4; j++) {
            sum += s[i][j];
        }
        ave[i] = sum / 4;
    }
    for (i = 0; i < 4; i++) {
        for (j = 0; j < 4 - i; j++) {
            if (ave[j]>ave[j+1]) {
                t = ave[j]; ave[j] = ave[j + 1]; ave[j + 1] = t;
            }
        }
    }
    printf("5个学生的平均成绩从高到低排序为:\n");
    for (i = 0; i < 5; i++) {
        printf("%.2f\t",ave[i]);
    }

15.3行字符串,每行80个字符,分别统计出其中英文大写字母、小写字母、数字、空格、其他字符

char a[3][100] = {'\0'}; int i, j;
    int big, small, number, space, other;
​
    for (i = 0; i < 3;i++) {
        printf("请输入%d个字符串:\n", i + 1);
        gets(a[i]);
        big = small = number = space = other =j=0;
        while (a[i][j]) {
            if (a[i][j] >='A' && a[i][j]<='Z') big++;
            else if (a[i][j] >= 'a' && a[i][j] <= 'z')small++;
            else if (a[i][j] >= '0' && a[i][j] <= '9')number++;
            else if (a[i][j] ==' ')space++;
            else  other++;
            j++;
        }
        printf("大写字母%d,小写字母:%d,数字:%d,空格:%d,其他字符:%d\n", big, small, number, space, other);
    }

 

16.内存循环多注意

int i, n = 0;
    for (i = 2; i < 5; i++) {
        do {
            if (i % 3)continue;
            n++;
        } while (!i);
        n++;
    }
    printf("n=%d\n",n);

17.二维数组(3×3)转置,行列互换

void inverse(int a[2][3],int b[3][2]) {
    int i, j;
    for (i = 0; i <= 1; i++)
        for (j = 0; j <= 2; j++)
            b[j][i] = a[i][j];
}
void testInverse() {
    int a[2][3] = { 0 }, b[3][2], i, j;
    for (i = 0; i < 2; i++) {
        for (j = 0; j < 3; j++)
            scanf("%d", &a[i][j]);
        printf("\n");
    }
    inverse(a, b);
    for (i = 0; i <= 2; i++) {
        for (j = 0; j <= 1; j++)
            printf("%5d", b[i][j]);
        printf("\n");
    }
​
}

18.判断素数

#inlcude <math.h>
int isPrime(int n) {
    int flag,i,k;
    k = sqrt(n);
    for (i = 2; i <=k; i++) {
        if (n % i == 0) {break;}
    }
    if (i>k)flag = 1;
    else flag = 0;
​
    return flag;
}

19.5个学生4门成绩,计算平均分,从高到低排序

void printF(int n,float a[]) {
    int i;
    for (i = 0; i < n; i++)
        printf("%.2f\t", a[i]);
}
int main() {
    int i,j;
    float ave[5] = {0};
    float s[5][4] = { {78,93,82,74},
                      {91,82,72,76},
                      {100,90,85,72},
                      {67,89,90,65},
                      {77,88,99,45} };
​
    for (i = 0; i < 5; i++) {
        for (j = 0; j < 4; j++) {
            ave[i] += s[i][j]/4;
        }
    }
    printF(5,ave);
    printf("\n排序后:\n");
    for (i = 0; i < 4; i++) {
        for (j = 0; j < 4 - i; j++) {
            if (ave[j] < ave[j + 1]) {
                float t = ave[j];
                ave[j] = ave[j + 1];
                ave[j + 1] = t;
            }
        }
    }
    printF(5, ave);
    return 0;
}

20.全局变量 (一变全变)

int sum = 2;
int f(int* k) {
    sum += *k;
    return sum;
}
int main() {
    int a[10] = { 1,2,3,4,5,6,7,8 };
    int i;
    for (i = 2; i < 4; i++) {
        sum += f(&a[i]);
        printf("%d ", sum);
    }
    return 0;
}

21.注重循环结束条件

char* s = "121";
    int k = 0, a = 0, b = 0;
    do {
        k++;
        if (k % 2 == 0) { a = a + s[k]-'0'; break; }
        b = b + s[k] - '0';
        a = a + s[k] - '0';
    } while (s[k + 1]);
    // k=0, 1 b=2,a=2
    // s[2]=1
    //k=2, a=2+1=3,break;
    //k=2,a=3,b=2
    printf("k=%d   a=%d   b=%d\n", k, a, b);

22 20/3 结束为整数

double d; float f; long l; int i;
    i = f = l = d = 20 / 3;
    printf("%d %ld %f %lf",i,l,f,d);

23.一定要注意判断条件

static char a[] = "ABCDEFGH", b[] = "abCDefGh";
    char* p1, * p2;
    int k;
    p1 = a; p2 = b;
    for (k = 0; k <= 7; k++)
        if (*(p1 + k) == *(p2 + k))
            printf("%c", *(p1 + k));
        printf("\n");

24.三个整数abc,要求按照大小顺序输出,函数改变3个变量的值

void swapS(int* a, int* b) {
    int t = *a;
    *a = *b;
    *b = t;
}
void exchange(int* q1, int* q2, int* q3) {
    if (*q1 < *q2)swapS(q1, q2);
    if (*q1 < *q3)swapS(q1, q3);
    if (*q2 < *q3)swapS(q2, q3);
}
int main() {
    int a, b, c,*pa,*pb,*pc;
    scanf("%d %d %d", &a, &b, &c);
    pa = &a, pb = &b, pc = &c;
    exchange(pa, pb, pc);
    printf("由大到小a:%d,b:%d,c:%d", a, b, c);
    return 0;
}

25.一段字符串b从第5个到第17个字符树池在到a字符串第12字符以后。

void strcpySS(char *p1,char *p2) {
    int count = 0;
    p1 = p1+11;
    p2 = p2+4;
    while (count <=16) {
        *p1 = *p2; p1++; p2++; count++;
    }
    *p1 = '\0';
​
}
int main() {
    char a[255] = "My name is Li jilin.";
    char b[255] = "Mr.Zhang HaoLing is very happy.";
    //My name is hang HaoLing is v
    strcpySS(a,b);
    puts(a);
    return 0;
}
/*
第二种
如果*p1=*p2&&count<n放到while条件中会出错,因为p2如果没有指向\0就不会结束。
void strcpySS(char *p1,char *p2,int n) {
    int count = 0;
    while (count < n) {
        *p1++ = *p2++;
        count++;
    }
    *p1 = '\0';
}
strcpySS(&a[11],&b[4],17);
​

26.注意printf打印的内容

struct country {
        int num;
        char name[20];
    }x[5] = {1,"China",2,"USA",3,"France",4,"EngLand",5,"Spanish"};
    struct country* p;
    p = x + 2;
    printf("%d,%s", p->num, x[0].name);

27.输入三个字符串到文件,按照从小到大顺序

FILE* fp;
    char str[3][10], temp[10];
    int i, j, k, n = 3;
    printf("Enter strings:\n");
    for (i = 0; i < n; i++) {
        gets(str[i]);
    }
    for (i = 0; i < n - 1; i++) {
        k = i;
        for (j = i + 1; j < n; j++)
            if (strcmp(str[k], str[j]) > 0)k = j;
        if (k != i) {
            strcpy(temp,str[i]);
            strcpy(str[i],str[k]);
            strcpy(str[k],temp);
        }
    }
    if ((fp = fopen("string.data", "w")) == NULL) {
        printf("can't open file!\n");
        exit(0);
    }
    printf("\n The new sequence:\n");
    for (i = 0; i < n; i++) {
        fputs(str[i], fp);
        fputs("\n", fp);
        printf("%s\n", str[i]);
    }

28(*p)[4]数组指针 是二维的

int maxvalue(int(*p)[4]) {
    int i, j, min;
    min = **p;
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 4; j++) {
            if (*(*p + j) < min)min = *(*p + j);
        }
        p++;
    }
    return min;
}
int main() {
    int arr[3][4] = { 4,2,7,2,9,1,-4,24,5,-8,12,16 };
    int min;
    min = maxvalue(arr);
    printf("min=%d\n", min);
    return 0;
}

29.选择排序

int a[10] = {12,-1,8,9,3,4,5,6,2,11};
    int i, j, k,t;
    for (i = 0; i <9; i++) {
        k = i;
        for (j =i+1; j <10; j++) {
            if (a[k]<a[j]) {
                k = j;
            }
        }
        if (k != i) {
            t = a[k]; 
            a[k] = a[i]; 
            a[i] = t;
        }
    }
​
    for (i = 0; i <10; i++) {
        printf("%d\t", a[i]);
    }

30杨辉三角

    int a[10][10],i,j;
    for (i = 0; i < 10; i++) {
        for (j = 0; j < 10; j++) {
            if (i == j || j == 0)a[i][j] = 1;
        }
    }
    //第二个->最后第二个
    for (i =2; i < 10; i++) {
        for (j =1; j <i; j++) {
            a[i][j] =a[i-1][j-1]+a[i-1][j];
        }
    }
    for (i = 0; i < 10; i++) {
        for (j = 0; j <=i; j++) {
            printf("%d\t", a[i][j]);
        }
        printf("\n");
    }

31.汉洛塔

void hanoi_move(int n, char A, char B, char C) {
    if (n == 1) {
        printf("%c->%c\n", A, C);
    }
    else {
        hanoi_move(n-1,A,C,B);
        printf("%c->%c\n", A, C);
        hanoi_move(n-1,B, A, C);
    }
}
int main() {
    int n = 0;
    scanf("%d", &n);
    hanoi_move(n,'A','B','C');
    return 0;
}

32.ax*x + bx +c =0 的根

float x1, x2, disc, p, q;
    int a, b, c;
    printf("input ax*x+bx+c:\n");
    scanf("%d %d %d", &a, &b, &c);
    printf("表达式为: %d*x^2+%d*x+%d = 0\n", a, b, c);
    disc = b * b - 4 * a * c;
    if (disc > 0) {
        x1 = (-b + sqrt(disc))/(2*a);
        x2 = (-b - sqrt(disc))/(2*a);
        printf("disc>0的根为: x1=%f    x2=%f\n", x1, x2);
    }
    else if (disc == 0) {
        x1 = (-b + sqrt(disc)) / (2 * a);
        x2 = (-b - sqrt(disc)) / (2 * a);
        printf("disc>0的根为: x1=%f    x2=%f\n", x1, x2);
    }
    else {
        p = -b / (2 * a);
        q = sqrt(-disc) / (2 * a);
        printf("disc<0的根为:x1=%f+%f x2=%f-%f\n", p, q, p, q);
    }

33.16进制格式

int a = 0xaa;
    char s = '\xba';
    printf("%x\n", a);
    printf("%x\n", s);
//注意 (int)是强转位置
float x = 123.4567;
    printf("%f\n",(int)(x*100+0.5)/100.0);

34.*p[3] 和 strlen遇到\0截止运算

int a[3][2] = { 1,2,3,4,5,6 }, * p[3];
    p[0] = a[1];
    printf("%d",*(p[0]+1));
    //a[1][1]
char s[] = "stop\0\n\"";
    printf("%d\n",strlen(s));

35.已有从小到大顺序排序好的一维数组,插入一个数,仍然按原来的顺序将其插入;

int arr[100] = { 99,5,2,1};
    int n;
    scanf("%d", &n);
    for (int i = 0; i < 100; i++) {
        if (n > arr[i]) {
            int temp = arr[i];
            arr[i] = n;
            n = temp;
        }
    }
​
    for (int i = 0; arr[i] != 0; i++)
        printf("%d\t", arr[i]);

一个数加上100是一个完全平方数,再加上168又是一个完全平方数,求该数

int n = 1, p = 0;
while (n++) {
    int sum = n + 100;
    p = sqrt(sum);
    if (p * p == sum) {
        sum = sum + 168;
        p = sqrt(sum);
        if (p * p == sum) {
            p = n, n = 0;
        }
    }
}
printf("这个数是%d\n",p);

用牛顿迭代法求根。方程为 ax^3+bx^2 +cx+d=0

系数a,b,c,d的值依次为1,2,3,4,由主函数输人。求x在1附近的一个实根。求出根后由主函数输出
float solut(int a, int b, int c, int d)
{
    float x = 1, x0, f, f1;
    do
    {
        x0 = x;
        f = ((a * x0 + b) * x0 + c) * x0 + d;
        f1 = (3 * a * x0 + 2 * b) * x0 + c;
        x = x0 - f / f1;
    } while (fabs(x - x0) >= 1e-3);
    return(x);
}
int main()
{
    int a, b, c, d;
    printf("input a,b,c,d:");
    scanf("%d %d %d %d", &a, &b, &c, &d);
    printf("x=%10.7f\n", solut(a, b, c, d));
    return 0;
}

用递归方法求n阶勒让德多项式的值,递归公式为

20200628142752964.png

#include<stdio.h>
​
double polya(int n,int x)
{
    double result; 
    if(n == 0)  
        result = 1;  
    if(n == 1)
        result = x; 
    if(n>1)
        result = ((2*n-1)*x*polya(n-1,x)-(n-1)*polya(n-2,x))/n;    
    return result;
}
​
int main()
{ 
    int x,n; 
    scanf("%d %d", &n, &x); 
    printf("%.2f\n", polya(n,x)); 
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值