程序阅读题

  1. 输出以下程序的结果
#include <stdio.h>
int main()
{
    char ch;int k = 0;
    for(ch = 'A';ch < 'H';ch++,k++)
        if(k%2==0)
            printf("%c ",ch);
    printf("\n");
    return 0;
}

A C E G
从A开始到H结束,k从0开始自加,k为偶数时输出字符

  	ch A B C D E F G H	
  	k  0 1 2 3 4 5 6 7 
  1. 输出以下程序结果
#include <stdio.h>
int main()
{
    int k = 0;char c = 'A';
    do{
        switch (c++) {
            case 'A':k++;break;
            case 'B':k--;
            case 'C':k+=2;break;
            case 'D':k=k%2;break;
            case 'E':k=k*10;break;
            default:k=k/3;
        }
        k++;
    }while(c<'G');
    printf("k=%d\n",k);
    return 0;
}

k=8

  c='A',无条件执行一次do内循环体
  c++,是先取c的值进入switch,之后再自加
  k=1,c自加,C='B',k自加,k=2
  k=1,没有break,继续执行,k=3,c自加,c='C',k自加,k=4
  k=6,c自加,c='D',k自加,k=7
  k=1,c自加,c='E',k自加,k=2
  k=20,c自加,c='F',k自加,k=21
  k=7,c自加,c='G',k自加,k=8
  退出循环
  1. 输出程序结果
#include <stdio.h>
int main()
{
    int a[6] = {12,4,17,25,27,16};
    int b[6] = {27,13,4,25,26,16};
    int i,j;
    for(i=0;i<6;i++){
        for(j=0;j<6;j++)
            if(a[i] == b[j])
                break;
        if(j<6)
            printf("%d ",a[i]);
    }
    printf("\n");
    return 0;
}

4 25 27 16

  外层循环会取出a的每一个值
  内层循环会将a[i]与b的每一个值比较
  如果有相等的值会退出内层循环并输出
  程序的目的是找到两个数组相同的值
  1. 输出程序结果
#include <stdio.h>
int main()
{
    int a[8]={1,0,1,0,1,0,1,0},i;
    for(i=2;i<8;i++)
        a[i] += a[i-1]+ a[i-2];
    for(i=0;i<8;i++)
        printf("%d ",a[i]);
    printf("\n");
    return 0;
}

1 0 2 2 5 7 13 20
从第三个开始,每个数加上前两个数的和
注意之前的求和会对后续的求和有影响

  1 0 1 0 1 0  1  0
  1 0 2 2 5 7 13 20
  1. 输入数据为2,4,输出程序的结果
#include <stdio.h>
int main()
{
    int s=1,t=1,a,n;
    scanf("%d%d",&a,&n);
    for(int i=1;i<n;i++)
    {
        t = t*10+1;
        s = s+t;
    }
    s*=a;
    printf("SUM=%d\n",s);
    return 0;
}

SUM=2468

  s=1,t=1,a=2,n=4
  i=1,t=11,s=12
  i=2,t=111,s=123
  i=3,t=1111,s=1234
  i=4,退出循环
  s=2468

6.输出结果

# include <stdio.h>
# include <stdlib.h> 
# define PR(x,y) printf("%s=\t%d\n",x,y)
int main()
{
    int x=03,y=02,z=01;
    char str[25];
    PR("x|y&z",x|y&z);
    PR("x^y&~z",x^y&~z);
    PR("x&y&z",x&y&z);
    x=1;y=-1;
    PR("! x|x",! x|x);
    PR("~x|x",~x|x);
    return 0;
}
  x|y&z=  3
  x^y&~z= 1
  x&y&z=  0
  ! x|x=  1
  ~x|x=   -1

这个题目巨TM坑,先做必要的知识储备
--------------------------------------------------
首先是输出格式,“%s=\t%d\n”,一个字符串后跟一个整数,注意这之间有一个\t;
\t是制表符,不是4个空格!!!
\t的空格数量并不是随机的,而是每8个字符串自动补齐。如果超过8个字符,就以最接近8的倍数补齐。
所以输出结果前的空格数并不相等。
--------------------------------------
然后是符号的优先级
!、~ > & > ^ > |
! 逻辑非
~ 按位取反
& 按位与运算
^ 按位异或,同0非1
| 按位或运算
------------------------------------------
x:0011,y:0010,z:0001
①x|y&z
先算y&z:0000
再算x|,0011,结果为3
②x^y&~z
先算~z,1110
再算y&,0010
再算x^,0001,结果为1
③x&y&z
先算x&y,0010
再算&z,0000,结果为0
------------------------------------------
x:0001
④! x|x
先算!x,0000
再算|x,0001,结果为1
⑤~x|x
先算~x,1110
再算|x,1111,结果为-1
负数在计算机中用补码表示,符号位不变,减一取反得到原码

  1. 输出结果
# include <stdio.h>
# include <stdlib.h> 
# include <string.h> 

int main()
{
    int a[5] = {2,4,6,9,12},b[6] = {2,3,4,6,8,9};
    for(int i=0;i<5;i++)
        for(int j=0;j<6;j++)
            if(*(a+i)==*(b+j))
                printf("%d ",*(a+i));
        printf("\n");
    return 0;
}

2 4 6 9

  只是将数组的下标操作方式更换为了指针
  最终结果还是比较两个数组的元素,找到相同的并输出
  1. 输出结果
# include <stdio.h>
# include <stdlib.h> 
# include <string.h> 

int main()
{
    char str1[] = "*******";
    for(int i=0;i<4;i++){
        printf("%s\n",str1);
        str1[i] = ' ';
        str1[strlen(str1)-1]='\0';
    }
    return 0;
}
  *******
   *****
    ***
   	 *
  1. 输出结果
# include <stdio.h>
# include <stdlib.h> 
# include <string.h> 

int main()
{
    char a[5][8];
    for(int i=0;i<5;i++)
        for(int j=0;j<8;j++)
            if(i==0||i==4)
                a[i][j] = '-';
            else
                a[i][j] = ' ';
    for(int i=1;i<4;i++){
        a[i][0] = '|';
        a[i][5] = '|';
    }
    for(int i=0;i<5;i++)
        a[i][6] = '\0';
    for(int i=0;i<5;i++)
        printf("%s\n",a[i]);
    return 0;
}
  ------
  |    |
  |    |
  |    |
  ------ 

在这里插入图片描述

  1. 输出结果
# include <stdio.h>
# include <stdlib.h> 
# include <string.h> 

int main()
{
    char a[8],temp;int i,j;
    for(i=0;i<7;i++)
        a[i] = 'a'+i;
    for(i=0;i<3;i++){
        temp = a[0];
        for(j=1;j<7;j++)
            a[j-1] = a[j];
        a[6] = temp;a[7] = '\0';
        printf("%s\n",a);
    }
    return 0;
}

bcdefga
cdefgab
defgabc在这里插入图片描述

  1. 输出结果
# include <stdio.h>
# include <stdlib.h> 
# include <string.h> 

int main()
{
    int i,j,n;
    for(i=0;i<4;i++){
        for(j=1;j<=i;j++)
            printf(" ");
        n = 7-2*i;
        for(j=1;j<=n;j++)
            printf("%d",n);
        printf("\n");
    }
    return 0;
}

  7777777
   55555
    333
     1
  1. 输出结果
# include <stdio.h>
# include <stdlib.h> 
# include <string.h> 

int main()
{
    char a[8],temp;
    int j,k;
    for(j=0;j<7;j++)
        a[j] = 'a'+j;
    a[7] = '\0';
    for(j=0;j<3;j++){
        temp = a[6];
        for(k=6;k>0;k--)
            a[k] = a[k-1];
        a[0] = temp;
        printf("%s\n",a);
    }
    return 0;
}

gabcdef
fgabcde
efgabcd

  1. 输出结果
# include <stdio.h>
# include <stdlib.h> 
# include <string.h> 
void print(int begin,char pzf,int n);
int main()
{
    print(3,'*',1);print(2,'*',3);
    print(1,'*',5);print(2,'#',3);
    print(2,'#',3);
    return 0;
}
void print(int begin,char pzf,int n)
{
    char a[50];int i;
    for(i=0;i<begin;i++)
        a[i] = ' ';
    for(i=0;i<n;i++)
        a[begin+i] = pzf;
    a[begin+i] = '\0';
    printf("%s\n",a);
}

关键是看懂print函数。
begin代表的是前面给多少个空格
n则是将pzf复制的次数

结果为
   *
  ***
 *****
  ###
  ###
  1. 输入为5 -7 3,输出结果
# include <stdio.h>
# include <stdlib.h> 
# include <string.h> 
int a,b,c,find(int , int ,int );
int main()
{
    scanf("%d%d%d",&a,&b,&c);
    printf("%d\n%d,%d,%d\n",find(a,b,c),a,b,c);
    return 0;
}
int find(int a,int b,int c)
{
    int u,s,t;
    u = ((u=(a>b)?a:b)>c)?u:c;
    t = ((t=(a<b)?a:b)<c)?t:c;
    s = a+b+c-u-t;
    a = u;b = s; c = t; 
    return s;
}

3
5,-7,3

(a>b)?a:b是指如果a>b成立,那么取a,否则取b
那么u的取值就是先比较了a,b再比较c
u为取a,b,c最大值,t为a,b,c的最小值,s为中间值,最后返回s;
在find函数中重新int了a,b,c那么函数中a,b,c为局部变量,影响不到全局变量,最终输出的a,b,c值不变

15.输出结果

# include <stdio.h>
# include <stdlib.h> 
# include <string.h> 
void fun1(int n,int a[][3])
{
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++){
            printf("%d / %d\n",a[i][j],a[i][i]);
            a[i][j] = a[i][j]/a[i][i];}
}
int main()
{
    int a[3][3] = {{6,4,2},{8,6,4},{9,6,3}};
    fun1(3, a);
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++)
            printf("%d ",a[i][j]);
        printf("\n");
    }
    return 0;
}

1 4 2
1 1 4
3 2 1

  fun1的意思很明确,每一行元素除以主对角线的元素。
  但是主对角线元素也会变,导致后面除以的数也可能发生变动。
  1. 输出结果
# include <stdio.h>
# include <stdlib.h> 
# include <string.h> 
int fun3(int m)
{
    int i;
    if(m==3 || m==2)    return 1;
    if(m<2 || m%2==0)   return 0;
    for(i=3;i<m;i+=2)
        if(m%i==0)
            return 0;
    return 1;
}
int main()
{
    int n;
    for(n=1;n<10;n++)
        if(fun3(n)==1)
            printf("%d ",n);
    return 0;
}

2 3 5 7

  再fun3中,0,1因为小于2,返回值为0;
  2,3直接返回1;
  大于3时,偶数直接返回0,判断是否是3,5,7,9....的倍数,不是返回1;
  可以认为这是一个判断是否是素数的函数
  1. 输出结果
# include <stdio.h>
# include <stdlib.h> 
# include <string.h> 
void sub(int *a,int *b,int *c,int m,int n)
{
    int i,j;
    for(i=0;i<m;i++)    *(c+i) = *(a+i);
    for(j=0;j<n;j++,i++)    *(c+i) = *(b+j);
}
int main()
{
    int i,x[5]={1,5,3,8,4},y[3]={9,-4,6},z[8];
    sub(x,y,z,5,3); 
    for(i=0;i<8;i++)    printf("%d ",z[i]);
    printf("\n");
    return 0;
}

1 5 3 8 4 9 -4 6

  int *a,是一个整数指针,用这种写法来代表传入整数数组
  sub的意思很明确,将a数组的前m个数以及c数组的前n个数赋值给c数组。
  1. 输出结果
# include <stdio.h>
# include <stdlib.h> 
# include <string.h> 
void sort(char *a[],int n)
{
    int i,j,l; char *temp;
    for(i=0;i<n-1;i++){
        l = i;
        for(j=i+1;j<n;j++)
            if(strcmp(a[j],a[l])<0) l =j;
        if(l!=i){
            temp = a[i];a[i]=a[l];a[l]=temp;   
        }
    }
}
int main()
{
    char *name[4];int k;
    char ch[4][15] = {"morning","afternoon","night","evening"};
    for(k=0;k<4;k++)    name[k]=ch[k];
    sort(name,4);
    for(k=0;k<4;k++)
        printf("%s\n",name[k]);
    return 0;
}

afternoon
evening
morning
night

  strcmp(str1,str2),会将两个str逐个字符进行大小比较
  str1小于str2,返回值为-1
  str1等于str2,返回值为0
  str1小于str2,返回值为1
  
  再来看sort函数
  双层的for循环是将字符串和后面的字符串进行比较
  用l记录最小的字符串的下标,再利用三角交换将当前字符串与最小的字符串进行交换
  外层循环每往后移,就会选出一个最小的放到前面
  应用的就是选择排序
  1. 输出结果
# include <stdio.h>
# include <stdlib.h> 
# include <string.h> 
void pline(char *a,char c,int l,int n)
{
    int i;
    for(i=1;i<l;i++){
        *a = ' ';
        a++;
    }
    for(i=1;i<=n;i++,*a=c,a++);
    *a = '\0';
}
int main()
{
    char a[80];
    int i;void (*pf) (char*,char,int,int);
    pf = pline;
    for(i=1;i<5;i++){
        (*pf)(a,'$',5-i,2*i-1);
        puts(a);
    }
    return 0;
}

     $
    $$$
   $$$$$
  $$$$$$$

先看pline函数,传入数组a、字符c,l 和n
第一个for循环用来在a中写入l-1个空格
第二个for循环用来在a中写入n个字符c
在main函数中,重新将pline函数给了*pf
在for循环中看 l 和 n 的变化
i=1: (4,1)
i=2: (3,3)
i=3: (2,5)
i=4: (1,7)

  1. 输出结果
# include <stdio.h>
# include <stdlib.h> 
# include <string.h> 
int binary(int x,int a[],int n)
{
    int low=0,high=n-1,mid;
    while(low<=high){
        mid=(low+high)/2;
        if(x>a[mid])   high = mid-1 ;
        else if (x<a[mid])     low=mid+1 ;
        else    return mid;
    }
    return -1;
}     
int main()
{
    static int a[]= {4,0,2,3,1};
    int i,t,j;
    for(i=1;i<5;i++){
        t = a[i];j=i-1;
        while(j>0 && t>a[j]){
            a[j+1] = a[j];
            j--;
        }
        a[j+1]=t;
    }   
    printf("%d \n",binary(3, a, 5));
    return 0;
}

1

  main函数中的for嵌套while循环实现了从大到小的插入排序
  binary函数则是实现了二分查找,最终返回查找元素的下标
  1. 输出结果
# include <stdio.h>
# include <math.h> 
int main()
{
    double f(double,int);
    printf("%lf\n",f(2.0,14));
    return 0;
}
double f(double x,int n)
{
    double t;
    if(n==1)    t = x;
    else{
        if(n/2*2==n)    t=x*f(x,n/2);
        else t=x*pow(f(x,n/2),2.0);
    }
    return t;
}

256.000000

  一个简单的递归,注意不要绕糊涂了
    f(2.0,14)
  = 2.0 * f(2.0,7)
  = 2.0 * 2.0 * f(2.0,3)^2
  = 2.0 * 2.0 * [2.0 * f(2.0,1)^2]^2
  = 2 * 2 * [2 * 2^2]^2
  = 256
  1. 输出结果
# include <stdio.h>
# include <math.h> 
double t(double a,double (*f)(double) )
{
    return (*f)(a*a);
}
double f(double x)
{
    return 2.0*x;
}
double g(double x)
{
    return 2.0+x;
}
int main()
{
    double x = 4.0;
    double u = t(x,f);
    double v = t(x,g);
    printf("u=%5.3f v=%5.3f\n",u,v);
}

u=32.000 v=18.000

  t函数的第二个参数用来传递一个函数
  %5.3f指小数位保留三位,整体如果不足5位,在最前面补空格
  1. 输出结果
# include <stdio.h>
# include <math.h> 
int main()
{
     struct s1{char c[4],*s;};
     struct s1 s1 = {"abc","def"};
     struct s2{char *cp;struct s1 ss1;};
     struct s2 s2 = {"ghi",{"jkl","mno"}};
     printf("%c,%c\n",s1.c[0],*s1.s);
     printf("%s,%s\n",s1.c,s1.s);
     printf("%s,%s\n",s2.cp,s2.ss1.s);
     printf("%s,%s\n",++s2.cp,++s2.ss1.s);
}

a,d
abc,def
ghi,mno
hi,no
简单的结构体的考察

  1. 输出结果
# include <stdio.h>
struct s1 {char *s;int i;struct s1 *slp;};

int main()
{
    struct s1 a[] = { {"abcd",1,a+1}, {"efgh",2,a+2}, {"ijkl",3,a} };
    int i;
    for(i=0;i<2;i++){
        printf("%d\n",--a[i].i);
        printf("%c\n",++a[i].s[3]) ;
    }
}

题目有问题
++a[i].s[3]运行不起来

  1. 输出结果
#include <stdio.h>
int main()
{
    FILE *fp;int i;
    char s1[80],s[]="abcdefghijklmnop";
    fp = fopen("alf.dat","wb+");i=sizeof(s);
    fwrite(s,i,1,fp);rewind(fp);fread(s1,i,1,fp);
    printf("all=%s\n",s1);fseek(fp,0,0);
    printf("seek1 ch=%c\n",fgetc(fp));
    fseek(fp,10,1);
    printf("seek2 ch=%c\n",fgetc(fp));
    fseek(fp,1,1);
    printf("seek3 ch=%c\n",fgetc(fp));
    fclose(fp);
    return 0;
}

all=abcdefghijklmnop
seek1 ch=a
seek2 ch=l
seek3 ch=n

  函数原型:
  int fseek(FILE *stream, long offset, int fromwhere);
  offset 偏移量参数 , 可以为正数 , 也可以为负数 ;
  fromwhere 参数就是 起始位置 , 有三种选择
  	-文件头 SEEK_SET 0
  	-当前位置 SEEK_CUR 1
  	-文件尾 SEEK_END 2
  -------------------------
  size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
  *buffer 参数 : 将文件中的二进制数据读取到该缓冲区中 ;
  size 参数 : 每个元素的大小(以字节为单位)
  count 参数 : 读取元素的个数 ;
  size_t 返回值 : 实际从文件中读取的元素个数 
  ---------------------------
  size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
  *ptr : 指针指向要写出数据的内存首地址 ;
  size : 要写出元素的字节大小 
  nmemb : 要写出元素的个数 
  size_t 返回值:返回的是实际写出到文件的 基本单元个数 
  ----------------------------
  rewind()函数:将指针重新指向文件的开头
  -----------------------------
  fgetc()函数:读取文件的下一个字符,并将文件指针+1
  1. 输出结果
#include <stdio.h>
int main()
{
    struct T1{char c[4],*s;};
    struct T1 s1 ={"abc","def"};
    struct T2 { char *cp;struct T1 ss1;};
    struct T2 s2 = {"ghi",{"jkl","mno"}};
    printf("%c,%c\n",s1.c[0],*s1.s);
    printf("%s,%s\n",s1.c,s1.s);
    printf("%s,%s\n",s2.cp,s2.ss1.s);
    printf("%s,%s\n",++s2.cp,++s2.ss1.s);
    return 0;
}

a,d
abc,def
ghi,mno
hi,no

  最后的++,是指针的后移
  1. 输出结果
# include <stdio.h>
#include <string.h>
#include <malloc.h>
int main()
{
    struct info{ int data;struct info *pn;};
    struct info *base,*p;
    base = NULL;
    for(int i=0;i<10;i++){
        p = (struct info *)malloc(sizeof(struct info));
        p->data = i+1;
        p->pn = base;
        base = p;
    }
    p = base;
    while (p!=NULL) {
        printf("%2d",p->data);
        p = p->pn;
    }
    printf("\n");
}

10 9 8 7 6 5 4 3 2 1
每次新的节点都会插在第一个位置,没有头节点时的头插法。

  1. 输出结果
# include <stdio.h>
#include <string.h>
#include <malloc.h>
void del_bk(char *p)
{
    char *p1=p;
    while(*p1 != '\0')
        if(*p1 ==' ' &&  *(p1+1)==' ')
            strcpy(p1,(p1+1));
        else
            p1++;
}
int main()
{
    char aa[] = "aa bb   cccc   ddd  efg   h";
    printf("%s\n",aa);
    del_bk(aa);
    printf("%s\n",aa);
}
  aa bb   cccc   ddd  efg   h
  aa bb cccc ddd efg h

在del_bk函数中,当遇到两个连续的空格的时候,第二个空格开始全部前移
导致有空格的地方只会出现一个空格

  1. 输出结果
# include <stdio.h>
#include <string.h>
#include <malloc.h>

int main()
{
    int m[] = {1,2,3,4,5,6,7,8,9},i,j,k;
    for(i=0;i<4;i++){
        k=m[i];m[i]=m[8-i];m[8-i] = k;
        for(j=0;j<9;j++)
            printf("%d ",m[j]);
        putchar('\n');
    }
}

9 2 3 4 5 6 7 8 1
9 8 3 4 5 6 7 2 1
9 8 7 4 5 6 3 2 1
9 8 7 6 5 4 3 2 1

  1. 输出结果

int main()
{
    int x[4][4] = {{1,2,3,4},{3,4,5,6},{5,6,7,8},{7,8,9,10}};
    int i,j;
    for(i=0;i<4;i++)
        for(j=0;j<4;j++)
            *(*(x+i)+j) /= *(*(x+i)+i);
    for(i=0;i<4;i++){
        for(j=0;j<4;j++)
            printf("%3d",*(*(x+i)+j));
        putchar('\n');
    }
}

1 2 3 4
0 1 5 6
0 0 1 8
0 0 0 1
最后两层循环也暗示了*(*(x+i)+j)将输出整个数组,那么上一层循环无非就是将整个数组元素除以相应行的对角线元素。

  1. 输出结果
int main()
{
    char line[] = "123456789";
    int i,k=strlen(line);
    for(i=0;i<4;i++){
        line[k-i] = '\0';
        puts(line+i);
    }
}

123456789
2345678
34567
456

  1. 输出结果
int main()
{
    char a[5][20] = {"abd","def","123","456","#$%"};
    int i,j;
    for(i=0;i<4;i++){
        j=0;
        while(a[i][j])  j++;
        strcat(*(a+i)+j,*(a+i+1));
    }
    for(i=0;i<4;i++)    puts(*(a+i));
}

abddef
def123
123456
456#$%

  strcat函数又被称为是字符串追加/连接函数
  追加的字符串src和目标字符串dest中都必须要带有字符’\0’
  并且追加字符串src必须以‘\0’结
  否则追加过程无法顺利实现。
  1. 输出结果
#define S x=y=z
#define P3(x,y,z) printf("x=%d\ty=%d\tz=%d\n",x,y,z);
int main()
{
    int x,y,z;
    S = 1;++x||++y||++z;P3(x, y, z);
    S = 1;++x&&++y||++z;P3(x, y, z);
    S = 1;++x&&++y&&++z;P3(x, y, z);
    S =-1;++x||++y&&++z;P3(x, y, z);
    S =-1;++x||++y||++z;P3(x, y, z);
    S =-1;++x&&++y&&++z;P3(x, y, z);
}
  x=2     y=1     z=1
  x=2     y=2     z=1
  x=2     y=2     z=2
  x=0     y=0     z=-1
  x=0     y=0     z=0
  x=0     y=-1    z=-1

||运算只要有一个为1,&&运算只要有一个为0就为0;
||运算第一个为真,后面的运算就会被跳过
&&运算第一个为假,后面的运算就会被跳过。

  1. 输出结果
#define P3(x,y,z) printf("x=%d\ty=%d\tz=%d\n",x,y,z);
int f(int m,int n)
{
    if(m%n == 0) return 0;
    else return f(n,m%n);
}
int main()
{
    printf("%d\n",f(840,48));
}

0

  1. 输出结果
int f1(int,int),f11(int);
void f2(int);
int main()
{
    int i,j;
    for(i=0;i<5;i++){
        f2((5-i)*3);
        for (j=0; j<=i; j++) 
            printf("%3d",f1(i,j));
        putchar('\n');
    }
}
int f1(int m,int n)
{
    return f11(m)/f11(n)/f11(m-n);
}
int f11(int k)
{
    if(k<=1)    return 1;
    return k*f11(k-1);
}
void f2(int n)
{
    for(int i=1;i<=n;i++)
        putchar(' ');
}
                   1
                1  1
             1  2  1
          1  3  3  1
       1  4  6  4  1

f11显然是一个求阶乘的函数

  1. 输出结果
void prn(int a,int b,int c,int max,int min)
{
    max = (max=a>b?a:b)>c?max:c;
    min = (min=a<b?a:b)<c?min:c;
    printf("max=%d   min=%d\n",max,min);
}
int main()
{
    int x,y;
    x = y = 0;
    prn(19,23,-4,x,y);
    printf("max=%d   min=%d\n",x,y);
}

max=23 min=-4
max=0 min=0

  prn中的写法之前已经介绍了,
  其作用是输出a,b,c中的最大最小值
  但max和min只是形参,对x,y的值并不会改变
  1. 输入35dffE,输出结果
int main()
{
    char a,b,x;int i;
    while(!isupper(x=getchar()));
    for(a='A';a<=x;a++){
        for(b='A';b<'A'+x-a;b++)
            putchar(' ');
        for(i=1;i<=2*(a-'A')+1;i++)
            putchar(a);
        putchar('\n');
    }
}
      A
     BBB
    CCCCC
   DDDDDDD
  EEEEEEEEE
  1. 输入a the asdftheth e there. 输出结果
int main()
{
    char x; int n = 0, k = 0;
    while ((x=getchar())!='.') {
        switch (x) {
            case 't':k++;break;
            case 'h':if(k==1)   k++;break;
            case 'e':if(k==2)   k++;break;
            default:k=0;
        }
        if(k==3)    n++;
    }
    printf("%d\n",n);
}

3

  要想n++,k必须等于3
  the只出现一次的时候k才会被加到3
  1. 输入 69和72,输出结果
int main()
{
    unsigned k,n;
    scanf("%u",&n);
    k = n%10*10 + n/10;
    printf("n=%d   k=%d\n",n,k);
}

n=69 k=96
n=72 k=27

  1. 输出结果
int main()
{
    int x = 40,y = 4,z = 4;
    x=y==z;
    printf("%d   %d   %d\n",x,y,z);
    x=x==(y=z);
    printf("%d   %d   %d\n",x,y,z);
}

1 4 4
0 4 4
先看y==z为1,赋值给x
先算括号(y=z),括号内的4,x == 4为0,赋值给x

  1. 输出结果
int main()
{
    int x,y,z;
    x = y =2; z = 3;
    y = x++-1;
    printf("%d\t%d\t%d\t",x,y,z);
    y=--z+1;
    printf("%d\t%d\t%d\n",x,y,z);
    x=y=z=0;
    printf("%d\t%d\t%d\t",x,y,z);
    --x&&++y&&++z;
    printf("%d\t%d\t%d\n",x,y,z);
}
  3       1       3       3       3       2
  0       0       0       -1      1       1

x++是先等运算结束再自加,而++x优先级更高,先自加再运算
最后的逻辑运算也是自加自减运算完成之后再进行

  1. 输入3 4 5 ,输出结果
int main()
{
    float a1,a2,a3,s,d;
    scanf("%f%f%f",&a1,&a2,&a3);
    s = (a1+a2+a3) / 2;
    s = sqrt(s * (s-a1) * (s-a2) * (s-a3));
    printf("%.2f%%%.2f%%%.2f  %-10.3f\n",a1,a2,a3,s);
}
  3.00%4.00%5.00  6.000   

指定数据宽度和小数位数用%m.nf 。m表示输出数据的宽度,即占m列,n表示小数点后保留n位小数。
出的数据向左对齐,用%-m.nf
输出百分号用%%,而不是用 \%

  1. 输出结果
int main()
{
    static int a[5] = {1,3,5,7,9};
    static int *num[5]={&a[2],&a[1],&a[0],&a[3],&a[4]};
    int **p,i;
    p = num;
    for(i=0;i<5;i++){
        printf("%d\t",**p);
        p++;
    }
}
  5       3       1       7       9

p是一个指向的指针,要访问数据就得用**p

  1. 输出结果
int f(char c,char *s){
    int m,n,h;
    for(n=0,h=strlen(s);n<=h;){
        m = (n+h) / 2;
        if(c<s[m])      h=m-1;
        else if (c>s[m])    n=m+1;
        else    return m;
    }
    return -1;
}
int main()
{
    printf("%d\n",f('g',"abdgkmxy"));
    printf("%d\n",f('T',"BGMAXYZOTE"));
}

3
-1

  f实现的是用for循环实现的一个字符串的二分查找
  第一个字符串有序返回了下标
  第二个字符串无序,查找失败
  1. 输出结果
int inv(int *x,int n){
    int *p,t,*i,*j,m=(n-1)/2;
    i=x;j=x+n-1;p=x+m;
    for(;i<=p;i++,j++){
        t=*i;*i=*j;*j=t;
    }
    return 0;
}
int main()
{
    int i,a[]={1,3,5,7,9,11,13,15};
    inv(a, 5);
    for(i=1;i<=5;i++)   
        printf("%d  ",*(a+i));
}
  11  13  7  1  3
  1. 输出结果
int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int main()
{
    int s,k;
    for(s=0,k=0;k<3;k++)    s+=a[k][k];
    printf("%d--",s);
    for(s=0,k=0;k<3;k++)    s+=a[k][3-k];
    printf("%d--",s);
    for(s=0,k=0;k<4;k++)    s+=*(a[1]+k);
    printf("%d\n",s);
}

18–21–26
最后一个实现的是a的第一行的求和

  1. 输出结果
int x,y,z;
void p(int *x,int y){
    ++*x;y--;z=*x+y;
    printf("%d,%d,%d--",*x,y,z);
}
int main()
{
    x=2;y=3;z=4;
    p(&x,y);
    printf("%d,%d,%d--",x,y,z);
    p(&y,x);
    printf("%d,%d,%d\n",x,y,z);
}
  3,2,5--3,3,5--4,2,6--3,4,6

注意全局变量和指针的传递

  1. 输出结果
int main()
{
    int m=18,s=0;
    do{
        switch (m%7) {
            case 2:m/=2;s+=2;break;
            case 3:m/=3;s+=3;break;
            case 5:m/=5;s+=5;break;
            default:m--;s--;
        }
        printf("%d\n",s);
    }while(m);
}

-1
2
7
6

  1. 输出结果
void div(int *n,int *k)
{
    if(*n % *k == 0){
        printf("%d,%d\n",*n,*k);
        *n/=*k;
    }
    else    (*k)++;
}
int main()
{
    int a[5] = {-5,0,60,45,34},i=0,j=2;
    while (a[i]<=0) i++;
    while(a[i]!=1)  div(a+i,&j);

}

60,2
30,2
15,3
5,5

  1. 输出结果
int main()
{
    int s[8],i;char ch='B'-1;
    printf("%c %d\n",ch,ch);
    for(i=7;i>=0;i--){
        s[i]=ch&1;
        ch = ch >>1;
    }
    for(i=0;i<8;i++)    printf("%d ",s[i]);
    printf("\n");
}
  A 65
  0 1 0 0 0 0 0 1

和1进行与运算,可以判断最后一位是0还是1
然后不断向后移动一位,再进行与运算
实现了逐位判断是0还是1,可以快速得到数的二进制

  1. 输出结果
int main()
{
    char c,a[]="Office";int i;
    for(i=0;i<strlen(a)/2;i++){
        c = *a;
        strcpy(a, a+1);
        a[strlen(a)]=c;
        a[strlen(a)+1]='\0';
        puts(a);
    }
}

ffcceO
fceeOf
ceOOff

  1. 输出结果
int main()
{
    float a[4][3]={ {3,2,5},{-3,2,1},{4,3,2},{5,1,3}};
    int i,j;float v;
    for(i=0;i<4;i++){
        v=a[i][0];
        for(j=1;j<3;j++)    v+=a[i][j];
        v/=3;
        for(j=0;j<3;j++)    a[i][j]-=v;
    }
    for(i=0;i<4;i++){
        for(j=0;j<3;j++)
            printf("%6.1f,",a[i][j]);
        printf("\b \n"); 
    }
}
    -0.3,  -1.3,   1.7 
    -3.0,   2.0,   1.0 
     1.0,   0.0,  -1.0 
     2.0,  -2.0,   0.0 

结尾的\b是把光标前移一位,目的是消除末尾的逗号

  1. 输出结果
int main()
{
    struct node{ int x; struct node *next;} *p1,*p2=NULL;
    int a[5] = {7,6,-5,28,1},i,j,s;
    for(i=0;i<5;i++){
        s=0;
        for(j=1;j<=a[i]/2;j++)
            if(a[i]%j==0)
                s+=j;
        if(a[i]!=s){
            p1 = (struct node*)malloc(sizeof(struct node));
            p1->x = a[i];
            p1->next = p2;
            p2 = p1;
        }
    }
    while(p1!=NULL){
        printf("%d\n",p1->x);
        p1 = p1->next;
    }
}

1
-5
7
该程序是求出数的所有正数因子,若求和不等于原数,则记录在链表中。

  1. 输出结果
int main()
{
    union{char c;int i;}t;
    t.c='A';t.i=1;
    printf("%d,%d",t.c,t.i);
}

1,1

  联合体内部的数据共享同一段内存
  意思就是说联合体内部的字符和整形首地址是一样的
  联合体的字节数为所占字节最大的变量的字节数

t.i的修改覆盖了t.c的修改

  1. 输出结果
int main()
{
    static char a[] = "program",*ptr;
    for(ptr=a;ptr<a+7;ptr+=2)
        putchar(*ptr);
}

porm

  1. 输出结果
int main()
{
    static char a[] = "language",b[]="program";
    char *ptr1,*ptr2=b;
    ptr1=a;
    for(int k=0;k<7;k++){
        if(*(ptr1+k)==*(ptr2+k))
            printf("%c",*(ptr1+k));
    }
}

ga

  1. 输出结果
int main()
{
    static int a[2][3]={ {1,2,3},{4,5,6} };
    int m,*ptr;
    ptr = &a[0][0];
    m = (*ptr)*(*(ptr+2))*(*(ptr+4));
    printf("%d\n",m);
}

15

  1*3*5
  1. 输出结果
void ptrv(int *x)
{
    printf("%d\n",++*x);
}
int main()
{
    int z = 25;
    ptrv(&z);
}

26

  1. 输出结果
int main()
{
    static char a[] = "language";
    char *ptr = a;
    while (*ptr) {
        printf("%c",*ptr-32);
        ptr++;
    }
}

LANGUAGE
ASCII码中大小写之间刚好相差32

  1. 输出结果
int f(int x,int y)
{
    return y-x;
}

int main()
{
    int a=5,b=6,c=2;
    int f(),(*g)() =f;
    c=(*g)(a,b);
    printf("%d\n",c);
}

1
出现的是函数的指针

  1. 输出结果
char b[] = "program";
char *a = "PROGRAM";
int main()
{
    int i=0;
    printf("%c%s\n",*a,b+1);
    while (putchar(*(a+i))) i++;
    printf("\ni=%d\n",i);
    while (--i) {
        putchar(*(b+i));
        printf("\n%s\n",&b[3]);
    }
}

Program
PROGRAM
i=7
m
gram
a
gram
r
gram
g
gram
o
gram
r
gram

  1. 输出结果
int main()
{
    static int x[] = {1,2,3};
    int s,i,*p;
    s = 1; p = x;
    for(i=0;i<3;i++)
        s*=*(p+i);
    printf("%d\n",s);
}

6

  1. 输出结果
int main()
{
    char a[] = "fprogram",b[] = "fortran";
    char *p,*q;
    p = a; q = b;
    while (*p&&*q) {
        if(*p==*q)
            printf("the two string are same:%c\n",*q);
        p++;q++;
    }
}

the two string are same:f
the two string are same:r

  1. 输出结果
int main()
{
    int a=2,*p,**pp;
    pp = &p;p=&a;
    a++;
    printf("%d,%d,%d\n",a,*p,**pp);
}

3,3,3

  1. 输出结果
void fun(char *w,int m)
{
    char s,*p1,*p2;
    p1 = w; p2 = w+m-1;
    while (p1<p2) {
        s = *p1++;
        *p1 = *p2--;
        *p2 = s;
    }
}
int main()
{
    static char a[] = "ABCDEFG";
    fun(a, strlen(a));
    puts(a);
}

AGAAGAG

  1. 输出结果
int try(int n)
{
    if(n>0)
        return (n*try(n-2));
    else
        return  1;;
}

int main()
{
    int x;x = try(5);
    printf("%d\n",x);
}

15

  1. 输出结果
int fib(int n)
{
    if(n>2)
        return fib(n-1)+fib(n-2);
    else
        return 2;
}

int main()
{
    printf("%d\n",fib(6));
}

16

  1. 输出结果
void bin(int x)
{
    if(x/2>0)
        bin(x/2);
    printf("%d",x%2);
}
int main()
{
    bin(12);
}

1100

  1. 输出结果
void fun(int n,int *s)
{
    int f1,f2;
    if(n==1||n==2)
        *s=1;
    else{
        fun(n-1, &f1);
        fun(n-2, &f2);
        *s = f1+f2;
    }       
}
int main()
{
    int x;
    fun(6,&x);
    printf("%d\n",x);
}

8

  1. 输出结果
void incr()
{
    int x=0;
    x = x+1;
    printf("%d",x);
}
int main()
{
    incr();
    incr();
    incr();
}

111

  1. 阅读程序
long fib(int g)
{
    switch (g) {
        case 0:return 0;
        case 1:
        case 2: return 1;
    }
    return fib(g-1)+fib(g-2);
}
int main()
{
    long k;
    k = fib(7);
    printf("k=%ld\n",k);
}

程序的功能是________
运行结果__________

程序递归实现斐波拉契数列,k为0时返回0,为1,2时返回1,大于2时为前两个fib的和
结果为 k=13

  1. 阅读程序
int sub(int n)
{
    int a;
    if(n==1)    return 1;
    a=n+sub(n-1);
    return a;
}
int main()
{
    int i=5;
    printf("%d\n",sub(i));
}

sub实现了1至n的累加求和
运行结果为 15

  1. 阅读程序
void fun(int a[])
{
    int i,j,k;
    for(i=0;i<4;i++)
        for(j=0;j<4-i;j++)
            if(a[j]>a[j+1]){
                k = a[j];
                a[j]=a[j+1];
                a[j+1]=k;
            }
}

函数的算法是

冒泡排序,数组最终由小到大排列

若A[4]={7,6,5,9},执行后A[4]={____}

5,6,7,9
  1. 阅读程序
void fun(int a[])
{
    int i,j,k,p;
    for(i=0;i<4;i++){
        p=i;
        for(j=i;j<4;j++)
            if(a[j]>a[p])
                p=j;
        k=a[i];
        a[i]=a[p];
        a[p]=k;
    }
}

函数算法是

选择排序,最终结果由大到小

若A[4]={7,6,5,9},执行后A[4]={____}

9765
  1. 输出结果
int main()
{
    char a[]="123456789",*p;
    int i=0;p=a;
    while (*p) {
        if(i%2==0) *p='*';
        p++;
        i++;
    }
    puts(a);
}
  *2*4*6*8*
  1. 阅读程序
int s(char *s )
{
    char *p=s;
    while(*p)   p++;
    return p-s;
}

int main()
{
    char *ss = "abcdefg\0";
    int j;
    j = s(ss);
    printf("%d\n",j);
}

函数功能

求字符串的长度

运行结果

7
  1. 阅读程序
void fun(char *a,char b)
{
    while (*(a++)!='\0') ;
    while(*(a-1)<b) {
        *a=*(a-1);
        a--;
    }
    *(a--)=b;
    
}

int main()
{
    char s[]="97531",c;
    c=getchar();
    fun(s,c);
    puts(s);
}

输入6时,运行结果为

976531

  1. 阅读程序
void fun(char *s1,char *s2)
{
    int j;
    char *s = s1;
    for(;*s2!='\0';s2++){
        for(j=0,s1=s;*s1!='\0';s1++)
            if(*s1!=*s2){
                s[j]=*s1;j++;
            }
        s[j]='\0';
    }
}
int main()
{
    char a1[80],a2[80];
    fgets(a1, 80, stdin);
    fgets(a2, 80, stdin);
    fun(a1,a2);
    puts(a1);
}

输入ASDFGHJ<回车>
AFH<回车>时的运行结果

SDGGJ

  1. 输入 right? 时输出结果
int main()
{
    char c;
    while( (c=getchar()) != '?' )
        putchar(++c);
}

sjhiu

  1. 输入chian#,输出结果
int main()
{
    int v1=0,v2=0;
    char ch;
    while ((ch=getchar())!='#') {
        switch (ch) {
            case 'a':
            case 'h':
            default: v1++;
            case 'o':v2++;
        }
    }
    printf("%d,%d\n",v1,v2);
}

5,5
没有break语句,都会执行一遍

  1. 输出结果
int main()
{
    int i,j;
    for(i=0;i<4;i++){
        for(j=0;j<6;j++){
            if(i==0||j==0||i==3||j==5)
                printf("*");
            else
                printf(" ");
        }
        printf("\n");
    }
}
******
*    *
*    *
******
  1. 输出结果
int main()
{
    int i,j;
    for(i=4;i>=1;i--){
        for(j=1;j<5;j++)
            printf("#");
        for(j=1;j<=4-i;j++)
            printf("*");
        printf("\n");
    }
}
####
####*
####**
####***
  1. 输入 asdASD 输出结果
int main()
{
    char s[80],c='a';
    int j=0;
    scanf("%s",s);
    while (s[j]!='\0') {
        if(s[j]==c)
            s[j]-=32;
        else if(s[j]==c-32)
            s[j]+=32;
        j++;
    }
    puts(s);
}

AsdaSD

  1. 阅读程序
int main()
{
    int j,s=0;
    int a[10]={};
    for(j=0;j<10;j++){
        if(a[j]>0)
            s+=a[j];
    } 
    printf("s=%d\n",s);
}

程序功能

将数组a内大于0的数求和

若a[10]={10,1,-20,-203,-21,2,-2-2,11,21},结果为

s=45
  1. 阅读程序
int main()
{
    int j,s=0;
    int a[10]={10,1,-20,-203,-21,2,-2-2,11,21}for(j=0;j<10;j++){
        if(a[j]<0)
            s+=a[j];
    } 
    printf("s=%d\n",s);
}

程序功能

将数组a内小于0的数求和

若a[10]={10,1,-20,-203,-21,2,-2-2,11,21},结果为

s=-248
  1. 阅读程序
int main()
{
    int x;
    scanf("%d",&x);
    if(x--<5)
        printf("%d\n",x);
    else
        printf("%d\n",x++);
}

4

  1. 输出结果
struct HAR{
    int x,y;struct HAR *p;
} h[2];
int main()
{
    h[0].x=1;h[0].y=2;
    h[1].x=3;h[1].y=4;
    h[0].p = &h[1];h[1].p=&h[0];
    printf("%d %d \n",(h[0].p)->x,(h[1].p)->y);
}

3 2

  1. 输出结果
int main()
{
    int a,b;
    for(a=1,b=1;a<=100;a++){
        if(b>=10)
            break;
        if(b%3==1){
            b+=3;break;
        }   
    }
    printf("a=%d\n",a);
}

1
执行一次直接break了

  1. 输出结果
int main()
{
   int i=10,j=0;
   do{
       j = j+i;i--;
   }while(i>2);
    printf("%d\n",j);
}

52

  (3+10)*8/2
  1. 输入 1298 输出结果
int main()
{
    int n1,n2;
    scanf("%d",&n2);
    while(n2!=0){
        n1 = n2 % 10;
        n2 = n2 / 10;
        printf("%d",n1);
    }
}

8921

  1. 输出最后一个值
int ff(int n)
{
    static int f = 1;
    f *= n;
    return f ;
}

int main()
{
    int i;
    for(i=1;i<=5;i++)
        printf("%d\n",ff(i));
}

120

  f变量是静态变量
  f的不会被重置为1,每改写一次就会是新的值
  1. 输出结果
int main()
{
    int x=10,y=20,t=0;
    if(x==y) t=x;x=y;y=t;
    printf("%d,%d\n",x,y);
}

20,0

  故意不打括号还写在一行
  很低级的骗术,误导if是三角交换
  1. 输出结果
int main()
{
    int x=15;
    while (x>10&&x<50) {
        x++;
        if(x/3){
            x++;break;
        }
        else continue;
    }
    printf("%d\n",x);
}

17

  1. 输入 Y?N 输出结果
int main()
{
    char c;
    while( (c=getchar())!='?')
        putchar(--c);
}

X

  1. 输出结果
void fun(int x,int y)
{
    x+=y;y=x-y;x-=y;
    printf("%d,%d,",x,y);
}

int main()
{
    int x=2,y=3;
    fun(x, y);
    printf("%d,%d\n",x,y);
}

3,2,2,3

  fun函数也就是我们常说的
  不申请新的空间交换两个变量的值
  1. 输出结果
#define N 10
#define s(x) x*x
#define f(x) (x*x)
int main()
{
    int i1,i2;
    i1=1000 / s(N);
    i2=1000 / f(N);
    printf("%d %d\n",i1,i2); 
}

1000 10

  宏定义其实是在预编译时将字符进行替换
  实际运行的是
   i1=1000 / 10 * 10;
   i2=1000 / (10 * 10);
  1. 输出结果
void swap(int *a,int *b)
{
    int *t;
    t = a; a = b; b = t;
}
int main()
{
    int x=3,y=5,*p=&x,*q=&y;
    swap(p,q);
    printf("%d %d\n",*p,*q);
}

3 5
在这里插入图片描述

a和b的指向确实变了,但是p和q的指向并不受影响

  1. 输出结果
typedef union student{
    char name[10];
    long sno; char sex;
    float score[4];
}STU;
int main()
{
    STU a[5];
    printf("%lu\n",sizeof(a));
}

80
STU是union结构,所有变量共享最大变量的内存,STU所占字节为16
a由5个STU构成,一共80个字节

64位编译器

char1个字节
char*(即指针变量): 8个字节
short int : 2个字节
int4个字节
unsigned int : 4个字节
float:  4个字节
double:   8个字节
long:   8个字节
long long:  8个字节
unsigned long:  8个字节 

32位编译器

char1个字节
char*(即指针变量): 4个字节(32位的寻址空间是2^32,32个bit,也就是4个字节。同理64位编译器)
short int : 2个字节
int4个字节
unsigned int : 4个字节
float:  4个字节
double:   8个字节
long:   4个字节
long long:  8个字节
unsigned long:  4个字节
  1. 输出结果
int main()
{
    int s,i;
    for(s=0,i=1;i<3;i++,s+=i);
    printf("%d\n",s);
}

5

  1. 输出结果
int main()
{
    char *p="abcdefgh",*r;
    long *q; q=(long *)p; 
    r = (char*)q;r++;
    printf("%s\n",r);
}

bcdefgh
应该是想考强制转化类型吧

  1. 输出结果
int main()
{
    char s[] = "abcdef";s[3]= '\0';
    printf("%s\n",s);
}

abc

  1. 输出结果
void sub(int *a,int n,int k)
{
    if(k<=n)
        sub(a, n/2, 2*k);
    *a += k;
}
int main()
{
    int x=0;sub(&x,8,1);
    printf("%d\n",x);
}

7

  1. 下列程序的功能是从键盘输入一个年份数据判断此年份是否为闰年。(注满足下面两个条件中的一个即为闰年一、400的倍数二、4的倍数但不是100的倍数)。
int main()
{
    int x,i;
    scanf("%d",&x);
    if(x%400==0)    i=1;
    else if(________)
        i=1;
    else 
        _________;
    if(i==1)
        printf("该年为闰年\n");
    if(i==0)
        printf("该年为平年\n");
}
x%4==0&&x%100!=0
i=0;
  1. 以下程序求1—10的奇数和。
int main()
{
    int x,s;
    s=0;
    for(x=1;x<=10;_____)
        _______;
    printf("奇数和为:%d\n",s);
}
x++
s+=(x%2!=0)?x:0
  1. 在5个数中找出最大的元素及位置。
#define size 5
int main()
{
    int a[size] = {4,6,3,9,23};
    int max,p,i;
    _____;
    p=0;
    for(i=1;i<size;i++)
        if(a[i]>max){
            max = a[i];
            _____;
        }
}
max = a[0]for循环的i=1可以看出少了个元素
p = i
  1. 以下程序用″比较计数″法对结构数组a按字段num进行降序排列。″比较计数″法的基本思想是: 通过另一字段con记录a中小于某一特定关键字的元素的个数。待算法结束, a[i].con就是a[i].num在a中的排序位置。本程序先读入N个整型数据存入数组a中, 然后根据以上办法排序。
#define N 8
struct c{
    int num;
    int con;
}a[16];
int main()
{
    int i,j;
    for(i=0;i<N;i++){
        scanf("%d",______);
        a[i].con = 0;
    }
    for(i=N-1;i>=1;i--){
        for(j=i-1;j>=0;j--){
            if(a[i].num<a[j].num)
            _______;
            else
                a[i].con++;
        }
    }
    for(i=0;i<N;i++)
        printf("%d,%d\n",a[i].num,a[i].con);
}
&a[i].num
a[j].con++
  1. 以下函数是对N个数用直接插入排序法进行由小到大排序。
#define N 10
void insertsort(int R[N+1])
{
    int i,j;
    for(i=2;i<=N;i++){
        R[0] = R[i];  //设置监视哨
        j = i-1;
        while (_____) {
            R[j+1] = R[j];
            _____;
        }
        R[j+1] = R[0];
    }
}
R[0]<R[j]
j--
可以发现传入的数组第一个位置是不能放置元素的
  1. 下面程序的功能是:输出100以内能被3整除且个位数为6的所有整数。
int main()
{
    int i,j;
    for(i=0;______;i++){
        j = i * 10 +6;
        if(______)    continue;
        printf("%d",j);
    }
}
i<10
j%3 != 0
很明显它不是直接将100个数算一遍,
而是先构造可能满足的数再验证
  1. 以下程序为先输入10个数据到数组a中再输入x然后在a数组中查找与x值相同的元素的所在位置。
int main()
{
    int a[11],x,i;
    printf("Enter 10 integers:\n");
    for(i=1;______;i++)   scanf("%d",a+i);
    printf("Enter x:");scanf("%d",&x);
    *a = x;i = 10;
    while (x!=*(a+i)) 
        ________;
    if(i>0) printf("%5d's position is: %4d\n",x,i);
    else    printf("%d Not benn found!\n",x);
}
i<=10
i--
  1. 用函数求x的绝对值
int abs(int a)
{
    int b;
    if(a>=0)
        b=a;
    else  _______;
    return b;
}
int main()
{
    int x,y;
    scanf("%d",&x);
    _______;
    printf("y=%d\n",y);
}
b=-a
y=abs(x)
  1. 本程序实现输入10个整数存入数组x中然后计算各元素的和并将和存入S中。
int main()
{
    int x[10],i,s;
    for(i=0;i<10;i++)
        scanf("%d",&x[i]);
    s=______;
    for(i=1;i<10;i++)
    __________;
    printf("%d",s);
}
s=a[0]
s+=a[i]
  1. 根据以下函数关系对输入的每个x值计算出相应的y值请在程序的横线上填空。
    在这里插入图片描述
int main()
{
    int x,c,m;
    float y;
    scanf("%d",&x);
    if(x<0) c=-1;
    else c=________;
    switch (c) {
        case -1:y=0;break;
        case 0:y=x;break;
        case 1:y=10;break;
        case 2:
        case 3:_______;break;
        default:y=-2;
    }
    if(y!=-2)   printf("y=%f\n",y);
    else    printf("error!\n");
}
c=x/10
y=-0.5*x+20
  1. 输入两个正整数a和b,若a≥b时,求其积c并显示若a<b时,求其商c并显示.
int main()
{
    int a,b,c;
    scanf("%d,%d",&a,&b);
    if(___________){
        c=a*b;
        printf("%d*%d=%d\n",a,b,c);
    }
    else if(____________){
        c=b/a;
        printf("%d/%d=%d\n",a,b,c);
    }
    else 
        printf("输入的数据不全为正整数!");
}
a>=b
a<b
  1. 输入三位正整数,分解为各个位数之和,例如423分解为4+2+3.
int main()
{
    int n,c,c1,c2,c3;
    printf("Enter n=");
    scanf("%d",&n);
    c=0;c1=0;c2=0;c3=0;
    c1=_______;
    c2=(n-c1*100);
    c3=______;
    c = c1+c2+c3;
    printf("s=%d\n",c);
}
c1=n/100
c3=n-c1*100-c2*10;
  1. mystrlen函数的功能是计算str所指字符串的长度,并作为函数值返回。请填空。
int mystrlen(char *str)
{
    int i;
    for(i=0;______!='\0';i++);
    return _______;
}
*(str+i)!='\0'  或者str[i]!='\0'
return i
  1. 以下程序的功能是:通过指针操作,找出三个整数中的最小值并输出。
int main()
{
    int *a,*b,*c,num,x,y,z;
    a=&x;b=&y;c=&z;
    printf("输入3个整数:");
    scanf("%d%d%d",a,b,c);
    printf("%d,%d,%d\n",*a,*b,*c);
    num=*a;
    if(*a>*b)   _______;
    if(num>*c)  _______;
    printf("输出最小整数:%d\n",num);
}
num=*b
num=*c
  1. 以下check函数的功能是对value中的值进行四舍五入计算,若计算后的值与ponse的值相等,则显示”WELL DONE!!”,否则显示计算后的值.请填空.
void check(int ponse,float value)
{
    int val;
    val = _______;
    printf("计算后的值:%d",val);
    if(_______)
        printf("\nWELL DONE!!\n");
    else  
        printf("\nSorry the correct answer is %d\n",val);
}
(int)((value*10 + 5)/10)
val == ponse
  1. 从键盘上输入一行字符(不多于40个以回车换行符作为输入结束标记),将其中的大写字母改为小写字母其它字符不变然后逆向输出。
int main()
{
    char a[40];int n=0;
    do{
        scanf("%c",&a[n]);
        if(______)    a[n]+=32;
        n++;
    }while(_____!='\n');
    n-=2;
    while (n>=0) {
        printf("%c",a[n--]);
    }
}
a[n]>='A'&& a[n]<='Z'
a[n-1]!='\n'
  1. 连续向数组输入成绩,并显示数组元素的值。当输入负数时停止接收数据。
int main()
{
    int n=0;
    int c[100];
    do{
        printf("enter num:\n");
        _______;
        printf("%d",c[n]);
        n++;
    }while(________);
}
scanf("%d",&c[n])
c[n-1]>0
  1. 下面程序的功能是在三个字符串中找出最小的字符串。
int main()
{
    char s[20],str[3][20];
    int i;
    for(i=0;i<3;i++)    scanf("%s",str[i]);
    strcpy(s,________ );
    if(strcmp(str[2], s)<0) strcpy(s, str[2]);
    printf("%s\n",_______);
}
strcpy(s, strcmp(str[0],str[1])<0?str[0]:str[1])
printf("%s\n",s)
  1. 以下函数的功能是删除字符串s中的所有数字字符。
void dele(char *s)
{
    int n=0,i;
    for(i=0;s[i];i++)
        if(_____)    
            s[n++]=s[i];
    s[n]=___;
}
s[i]<'0'||s[i]>'9'
s[n]='\0'
  1. 计算n!的值
int main()
{
    int i,s,n;
    printf("enter n:");
    scanf("%d",&n);
    ______;
    for(i=1;i<=n;i++)
        ______;
    printf("s=%d",s);
}
s=1
s*=i

在这里插入图片描述

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐