C语言经典例题100(68~82)

六十八、有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数。

#include<stdio.h>

void move_array(int a[],int n,int m)
{
    int i;
    int b[100];
    if(m>n)
    {
        printf("input error(%d must less than %d).
",m,n);
    }
    else
    {
        for(i=0;i<(n-m);i++)
            b[i]=a[i];
        for(i=0;i<m;i++)
            a[i]=a[n-m+i];
        for(i=m;i<n;i++)
            a[i]=b[i-m];
    }
}

void print_array(int a[],int n)
{
    int i;
    for(i=0;i<n;i++)
        printf("-%2d-",a[i]);
    printf("
");
}

int main()
{
    int a[20]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
    int m;
    void move_array(int a[],int,int);
    void print_array(int a[],int n);
    printf("input a number for moving.
");
    scanf("%d",&m);
    print_array(a,20);
    move_array(a,20,m);
    print_array(a,20);

    getch();
    return 0;
}

六十九、有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出 圈子,问最后留下的是原来第几号的那位。

程序分析:用一个数组存放初始n个人,每个数组元素值设为(i+1),从1~3报数,若报到3,则将对应数组元素值设为0,同时设置报到3的计数器,设0同时计数器加1.当计数器数值为(n-1)时候,报数结束,找出数组元素值不为0的那一项。

#include<stdio.h>
#define mynumber 17

int pick_num(int a[],int n)
{
    int i=0;            //数组下标
    int j=1;            //报数游标
    int k=0;            //清出计数器
    while((n-k)!=1)
    {
        if(a[i]==0)        //当元素值为0时不报数
        {
            i++;
        }
        else            //当元素值不为0时才可以报数
        {
            if(j%3==0)
            {
                k++;    //当报数后为3才清出
                a[i]=0; //报数为0将数组元素值设为0
            }
            i++;        //指向下一个数组元素
            j++;        //报下一个数
        }
        if(i==n)
            i=0;        //当到末尾时候,重新指向数组首元素
    }
    i=0;
    while(a[i]==0)
        i++;         //找出非0元素
    printf("最终数是第%d个数字。
",i+1);
    return i+1;
}

int main()
{
    int a[mynumber];
    int i;
    for(i=0;i<mynumber;i++)
        a[i]=i+1;
    pick_num(a,mynumber);
    getch();
    return 0;
}

七十、写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。

#include<stdio.h>

int str_len(char *p)
{
    int i=0;
    while(*(p+i)!='')
        i++;
    return i;
}

int main()
{
    char ps[1000];   //分配一段安全的内存空间
     printf("input a string:
");
    gets(ps);
    printf("your string:%s, length is %d",ps,str_len(ps));
    getch();
    return 0;
}

七十二、创建一个链表。

#include<stdio.h>
#include<stdlib.h>

struct node
{
    int n;
    struct node *pnext;
};

struct node * creat_list(int size)
{
    struct node *phead,*ptemp,*p;
    int i;
    phead=(struct node *)malloc(sizeof(struct node));
    phead->n=0;
    p=phead;
    for(i=1;i<size;i++)
    {
        ptemp=(struct node *)malloc(sizeof(struct node));
        ptemp->n=i;
        p->pnext=ptemp;
        p=ptemp;
    }
    p->pnext=NULL;
    printf("List created succeed!
");
    return phead;
}

int main()
{
    struct node *px,*ptemp;
    int size;
    printf("请输入要创建的链表长度:
");
    scanf("%d",&size);
    px=creat_list(size);
    ptemp=px;
    while(ptemp!=NULL)
    {
        printf("%d--->",ptemp->n);
        ptemp=ptemp->pnext;
    }
    getch();
    return 0;
}

七十三、反向输出一个链表。

#include<stdio.h>
#include<stdlib.h>

struct node
{
    int n;
    struct node *pnext;
};

struct node * creat_list(int size)
{
    struct node *phead,*ptemp,*p;
    int i;
    phead=(struct node *)malloc(sizeof(struct node));
    phead->n=0;
    p=phead;
    for(i=1;i<size;i++)
    {
        ptemp=(struct node *)malloc(sizeof(struct node));
        ptemp->n=i;
        p->pnext=ptemp;
        p=ptemp;
    }
    p->pnext=NULL;
    printf("List created succeed!
");
    return phead;
}

//递归算法,反转链表输出
void invert_print_list(const struct node *p)
{
    struct node *ptemp;
    ptemp=p;
    if(ptemp->pnext==NULL)
        printf("%d--->",ptemp->n);
    else
    {
        invert_print_list(p->pnext);
        printf("%d--->",ptemp->n);
    }
}    

int main()
{
    struct node *px,*ptemp;
    int size;
    void invert_print_list(const struct node *p);
    printf("请输入要创建的链表长度:
");
    scanf("%d",&size);
    px=creat_list(size);
    ptemp=px;
    while(ptemp!=NULL)
    {
        printf("%d--->",ptemp->n);
        ptemp=ptemp->pnext;
    }
    printf("
");
    invert_print_list(px);
    getch();
    return 0;
}

七十四、连接两个链表。

#include<stdio.h>
#include<stdlib.h>

struct node
{
    int n;
    struct node *pnext;
};

struct node * creat_list(int size)
{
    struct node *phead,*ptemp,*p;
    int i;
    phead=(struct node *)malloc(sizeof(struct node));
    phead->n=0;
    p=phead;
    for(i=1;i<size;i++)
    {
        ptemp=(struct node *)malloc(sizeof(struct node));
        ptemp->n=i;
        p->pnext=ptemp;
        p=ptemp;
    }
    p->pnext=NULL;
    printf("List created succeed!
");
    return phead;
}

//递归算法,反转链表输出
void invert_print_list(const struct node *p)
{
    struct node *ptemp;
    ptemp=p;
    if(ptemp->pnext==NULL)
        printf("%d-->",ptemp->n);
    else
    {
        invert_print_list(p->pnext);
        printf("%d-->",ptemp->n);
    }
}    

//连接两个链表
void link_list(struct node *ha,struct node *hb)
{
    struct node *pt;
    pt=ha;
    while(pt->pnext!=NULL)
        pt=pt->pnext;
    pt->pnext=hb;
}

void print_list(const struct node *p)
{
    struct node *pt;
    pt=p;
    while(pt!=NULL)
    {
        printf("%d-->",pt->n);
        pt=pt->pnext;
    }
    printf("
");
}

int main()
{
    struct node *pa,*pb,*pt;
    int sizea,sizeb,i;
    void invert_print_list(const struct node *p);
    void print_list(const struct node *p);
    void link_list(struct node *ha,struct node *hb);
    printf("请输入要创建的链表A长度:
");
    scanf("%d",&sizea);
    printf("请输入要创建的链表B长度:
");
    scanf("%d",&sizeb);
    pa=creat_list(sizea);
    pb=creat_list(sizeb);
    printf("链表A为:
");
    print_list(pa);
    printf("链表B为:
");
    print_list(pb);
    printf("重置链表B的数值:
");
    pt=pb;
    for(i=0;i<sizeb;i++)
    {
        pt->n+=10;
        pt=pt->pnext;
    }
    printf("新链表B为:
");
    print_list(pb);
    link_list(pa,pb);
    printf("组合后的新链表为:
");
    print_list(pa);
    printf("新链表反转为:
");
    invert_print_list(pa);
    getch();
    return 0;
}

七十六、编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n(利用指针函数)

#include<stdio.h>

double sumx(int n);
double sumx(int n)
{
    int i,num;
    double sum;
    if(n%2==0)
    {
        num=n/2;
        sum=0.0;
        for(i=1;i<=num;i++)
            sum+=1.0/(2*i);
        printf("你输入的是一个偶数,结果为:%8f
",sum);
        return sum;
    }
    else
    {
        num=(n+1)/2;
        sum=0.0;
        for(i=1;i<=num;i++)
            sum+=1.0/(2*i-1);
        printf("你输入的是一个奇数,结果为:%8f.
",sum);
        return sum;
    }
}
int main()
{
    int n;
    printf("请输入一个整数:
");
    scanf("%d",&n);
    sumx(n);
    getch();
    return 0;
}
    

七十七、填空练习(指向指针的指针)

//这里s是一个字符型指针数组,s[i]均为字符型指针数组元素,元素值指向各字符串首地址;因此与q匹配的自然就是&s[i];
//另外,注意到s是一个数组,空间在程序运行时候分配5个大小为char*型并且连续的空间(即5×4Byte),s作为数组名,表示的为数组首元素
//地址,即&s[0],那么第i个元素的地址即为s+i;所以这里答案也可以为s+k
main() {
char *s[]={"man","woman","girl","boy","sister"}; char **q; int k; for(k=0;k<5;k++) {       ;/*这里填写什么语句*/   printf("%s ",*q); } }

七十八、找到年龄最大的人,并输出。请找出程序中有什么问题。

?有啥问题,没看出来啥问题

#define N 4
#include "stdio.h"
static struct man
{ char name[20];
int age;
} person[N]={"li",18,"wang",19,"zhang",20,"sun",22};
main()
{struct man *q,*p;
int i,m=0;
p=person;
for (i=0;i<N;i++)
{if(m<p->age)
  q=p++;
  m=q->age;}
printf("%s,%d",(*q).name,(*q).age);
}

八十、海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?

程序分析:设有一堆桃子数量为x1=x,则(x1-1)能被5整除;第二次数量为x2=(x-1)*4/5,并且x2-1能被5整除,如此进行下去,至少可以进行5次。

因此设计一函数,参数为int型。该参数能按上述规则,进行至少5次以上,则可为最初的数量。

#include<stdio.h>

int count(long n)
{
    int i=0,m=n;    //计数器
    while((m-1)%5==0)
    {
        i++;
        m=(m-1)*4/5;
    }
    return i;
}


int main()
{
    long i=101;
    for(i=2;;i++)
    {
        if(count(i)>=5)
            break;
    }
    printf("桃子最少有%d个。
",i);
    getch();
    return 0;
}
    

 八十二、八进制转换为十进制。

#include<stdio.h>

int main()
{
int x,y=0,k; //x为模拟八进制数,y为转换后的十进制数
int m; //中转数
int i=1;
printf("输入一个10位以下的八进制数(0,7): ");
scanf("%d",&x);
k=x;
do
{
m=(k%10)*i;
y+=m;
i=i*8;
k=(k-k%10)/10;
}while(k!=0);
printf("八进制数%ld转换为十进制数为:%ld. ",x,y);
getch();
return 0;
}

原文地址:https://www.cnblogs.com/tsembrace/p/3252554.html