| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 533 人关注过本帖
标题:c语言经典31题
只看楼主 加入收藏
qiu2630
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2008-11-25
收藏
 问题点数:0 回复次数:0 
c语言经典31题
1.    求1+2+3+……100的和。(易)
main()
{
    int i,sum=0;
    for(i=1;i<=100;i++)
        sum=sum+i;
    printf("1+2+3+.....+99+100=%d\n",sum);
    return 0;
}
2,输入年份year,判断该年是否是闰年。(易)
main()
{
    int year;
    printf("请输入年份:");
    scanf("%d",&year);
    if (((year%100!=0)&&(year%4==0))||((year%100==0)&&(year%400==0)))
       printf("你输入的是%d年,%d年是闰年!!",year,year);
    else
       printf("你输入的是%d年,%d年不是闰年!!",year,year);
    return 0;
}
3,对100以内的素数求和并输出。(较难)
#define  N  100
main()
{   
    int n,i,a,sum=0;
    for(n=1;n<=100;n++)
    {
       for(i=1;i<=n;i++)
         if(n%i==0)
         {
           a++;
           if(a==3)
             break;       
         }
         if (a<3)
         {
            printf("%4d",n);
            sum=sum+n;
         }
         a=0;
    }
    printf("\n");
    printf("sum=%d\n",sum);
    return 0;
}
4. 打印出下列图形(较易)
*
        ***
       *****
      *******
     *********
    ***********
   *************
  ***************
 *****************                 
          (1)

*
        **
       ***
      ****
     *****
    ******
   *******
  ********
 *************
         (2)
main()
{
    int i,j,k;
    for(i=0;i<9;i++)
    {
        for(j=1;j<10-i-1;j++)
            printf(" ");
        for(k=0;k<2*i+1;k++)
            printf("*");
        printf("\n");
    }
    for(i=0;i<9;i++)
    {
        for(j=1;j<10-i-1;j++)
            printf(" ");
        for(k=0;k<i+1;k++)
            printf("*");
        printf("\n");
    }
    return 0;
}
5.将每一个字母变成它后面的字母,如将A变成B,Z变成A,非字母字符不变,‘!’作为电文结束标志。例如,有一电文“right”,翻译成“sjhiu”。 (较难)
main()
{
    char ch;
    printf("请输入英文字母,按!结束");
    ch=getchar();
    while(ch!='!')
    {
        if(((ch>'a')&&(ch<'z'))||((ch>'A')&&(ch<'Z')))
        {
            ch=ch+1;
            putchar(ch);
        }
        else
            putchar(ch);
        ch=getchar();
    }
    putchar(ch);
    return 0;
}
6. 百元买百鸡(穷举):已知公鸡每只5元,母鸡每只3元,小鸡1元3只,100元可买公鸡、母鸡、小鸡几只? (难)
main()
{
    int cock_num,hen_num,chicken_num;
   // int cock_prc=5,hen_prc=3,chicken_thprc=1;
    int i,j,k;
    printf("可选的方案有:");
    for(cock_num=0;cock_num<=20;cock_num++)
        for(hen_num=0;hen_num<=33;hen_num++)
            for(chicken_num=0;chicken_num<=100;chicken_num++)
        if((cock_num+hen_num+chicken_num==100)&&(cock_num*5+hen_num*3+chicken_num==300))
                    
printf("公鸡%d只母鸡%d只小鸡%d只\n",cock_num,hen_num,chicken_num*3);
    return 0;
}
7.求数组float a[N]中最大元素和次大元素及它们的下标,并将其进行输出。(较难)
main()
{   
    float a[N],max,min;
    int i,j,max_pos,min_pos;
    for(i=0;i<N;i++)
        scanf("%f",&a[i]);
    max=a[0];
    for(i=0;i<N;i++)
    {
        if(a[i]>max)
        {    
            max=a[i];
            max_pos=i+1;
        }
    }
    min=a[0];
    for(j=0;j<N;j++)
    {
        if(a[j]<min)
        {
            min=a[j];
            min_pos=j+1;
        }
    }
    printf("最大元素是%f在第%d位最小元素是%f在第%d位",max,max_pos,min,min_pos);
    return 0;
}
8.输入正整数m,按从小到大的次序输出m的所有因子。如,输入625,输出:1   5   25  125 625(难)
main()
{
    int num,i;
    printf("请输入正整数:");
    scanf("%d",&num);
    for(i=1;i<=num;i++)
        if(num%i==0)
            printf("%4d",i);
    return 0;
}
9. 输入数组a[N]中的m个元素(m<N),再输入一个数x,将x插在数组a中。(较难)
分别按照下述规定进行插入:
(1)将x插在数组末端。
(2)将x插在数组前端。
#define  N   7
void main()
{ int m,i,x,a[N],b[N],k=0;
  for(;;)
  {
    printf("请输入数组元素个数:");
    scanf("%d",&m);
    if(m>=N){printf("数组要满了,无法插入.\n");continue;}
    printf("请输入数组的%d个元素:",m);
    for(i=0;i<m;i++)
    {
        scanf("%d",&a[i]);
        b[i]=a[i];
    }
    printf("请输入x= ");
    scanf("%d",&x);
    printf("插在前\n");
    
    for(k=m;k>=0;k--)
    {
        a[k]=a[k-1];
    }
    a[0]=x;
    for(i=0;i<=m;i++)printf("%4d",a[i]);
        printf("\n");
    printf("插在后\n");
    b[m]=x;
    for(i=0;i<=m;i++)printf("%4d",b[i]);
        printf("\n");

  }
}
10.编写一个程序,将两个字符串连接起来,不要用strcat函数。(易)
#define  N  100
void main()
{ char a[N],b[N];
  int i,j,k=0;
  for (;;){
      printf("请输入字符串s1: \n");
    for(i=0;i<N-1;i++)
    {a[i]=getchar();
    if(a[i]=='\n'||i==N-1)break;
    }
      printf("请输入字符串s2: \n");
    for(i=0;i<N-1;i++)
    {b[i]=getchar();
    if(b[i]=='\n'||i==N-1)break;
    }
    if(a[i]!='\n')
        while(getchar()!='\n');
        a[i]='\0';
        printf("您输入的字符串s1为: \n");
        for(i=0;a[i]!='\0';i++)putchar(a[i]);
        putchar('\n');
    if(b[i]!='\n')
        while(getchar()!='\n');
        b[i]='\0';
        printf("您输入的字符串s2为: \n");
        for(i=0;b[i]!='\0';i++)putchar(b[i]);
        putchar('\n');
        i=0;
    while(a[i]!='\n')
    i++;
    while(b[k]!='\n')
    k++;
    for(j=0;j<k;j++)
    {a[i]=b[j];i++;}
        for(i=0;a[i]!='\0';i++)putchar(a[i]);
        putchar('\n');
    }
}
11. 将a[N]中的m个元素(m<N),按照从小到大的次序排列。(难)
要求:排序方法分别选用冒泡法、简单选择法和直接插入法。
#define N 100
void Sinsert_sort(int a[],int n)
{
    int i,j,x;
    for(i=1;i<n;i++)
    {x=a[i];
     for(j=i-1;j>=0&&x<a[j];j--)a[j+1]=a[j];
     a[j+1]=x;
    }
}
void outa(int a[],int n)
{int i;
  for(i=0;i<n;i++)
      printf("%5d",a[i]);
  printf("\n");
}
void sort()
{int a[N],n,i;
 printf("请输入元素个数: n=");
 scanf("%d",&n);
 if(n<=0)return;
 printf("请输入 %d个数元素: ",n);
 for(i=0;i<n;i++) scanf("%d",&a[i]);
 printf("请核对输入数据: \n",n);
 outa(a,n);
 Sinsert_sort(a,n);
 outa(a,n);
}
void main()
{int c;
 while(1)
 { printf("请输入操作码, 1: 运行一个实例; 0: 结束, c=");
   scanf("%d",&c);
   if(!c)break;
   sort();
 }
 printf("程序结束, 再见! \n");
}

void SUbubble_sort(int a[],int n)
{
    int i,j,x;
    for(j=0;j<n-1;j++)
     for(i=n-2;i>=j;i--)
     if(a[i]>a[i+1])
     {x=a[i]; a[i]=a[i+1]; a[i+1]=x;}
}

void select_sort(int a[],int n)
{
    int i,j,x,k;
    for(j=0;j<n-1;j++)
    {k=j;
     for(i=j+2;i<n;i++)
     if(a[k]>a[i])k=i;
     x=a[j]; a[j]=a[k]; a[k]=x;}
}
12. 输入数组a[N]中的m个元素(m<N),再输入一个数x,查看a中是否有值为x的元素,若有,则把a中值为x的元素去掉(删除元素),后面的元素向前移(假定数组所有元素值都不相同);若没有,则将x加在a中,接在原来元素的后面(插入元素)。并输出程序所做的操作是“插入”还是“删除”的相应信息。(较难)
#define  N  7
void main()
{ int m,i,x,k,a[N];
  for(;;){
  printf("请输入数组元素个数: ");
  scanf("%d",&m);
  if(m>=N){printf("数组要满了,无法插入.\n");continue;}
  printf("请输入数组的%d个元素:",m);
  for(i=0;i<m;i++)scanf("%d",&a[i]);
  printf("请输入x= ");
  scanf("%d",&x);
  for(k=-1,i=0;i<m;i++)if(a[i]==x){k=i;break;}
  if(k>-1)
  {printf("原数组中有现在删除它:\n",x);
   for(i=k;i<m;i++)a[i]=a[i+1];
   m--;
   printf("数组现有%d个元素: ",m);
    for(i=0;i<m;i++)printf("%4d",a[i]);
        printf("\n");
  }
  else
  {printf("原数组中没有现在插入它:\n",x);
   a[m++]=x;
   printf("数组现有个元素: ",m);
   for(i=0;i<m;i++)printf("%4d",a[i]);
   printf("\n");
  }
  }
}
13.按要求编写子函数,并给出相应的主函数。(易)
要求:返回某字母在某个字符串中出现的次数。
#define  N  10
int count(char x[],char c)
{int i,k;
 i=k=0;
 while(x[i]){if(x[i]==c)k++;i++;}
 return k;
}
void main()
{ char a[N],b;
  int i;
  for (;;){
      printf("请输入字符串: \n");
    for(i=0;i<N-1;i++)
    {a[i]=getchar();
    if(a[i]=='\n'||i==N-1)break;
    }
    if(a[i]!='\n')
        while(getchar()!='\n');
        a[i]='\0';
        printf("您输入的字符串为: \n");
        for(i=0;a[i]!='\0';i++)putchar(a[i]);
        putchar('\n');
        printf("请输入要找的字符串: ");
        b=getchar();
        printf("字符 %c 在串中出现 %d 次.\n",b,count(a,b));
        printf("\n");
        while(getchar()!='\n');
        }
}
14.用子函数实现找出数组a[n]中的最长回文串(正反读相同的串)。(难)
int serch(char test[])
{
    int len,k=0;
    len=strlen(test);
    if(len==0)
    {
        return 2;
    }
    while(len>0&&k<len)
    {
        if(test[len-1]==test[k])
        {
            k++;
            len--;
        }else
        {
            return 0;
        }
    }
    return 1;
}


main()
{
    char  p[100];
    int ReturnValue=1;
    printf("input the string\n");
    scanf("%s",p);
     ReturnValue=serch(p);
    if(ReturnValue==2)printf("please input corrert string");
    else if(ReturnValue==1)
    {
        printf("是回文\n");
    }else
    {
        printf("不是回文\n");
    }
     return 0;
}
15.编写函数,形参为两个整数,返回这两个整数的和、差、积、商。(易)
sort1(int a, int b)
{
    return a+b;
}
sort2(int a, int b)
{
    return a-b;
}
sort3(int a, int b)
{
    return a*b;
}
sort4(int a, int b)
{
    return a/b;
}
main()
{int i,j,a,b,c,d;
 printf("please input:");
 scanf("%d%d",&i,&j);
 a=sort1(i,j);
 b=sort2(i,j);
 c=sort3(i,j);
 d=sort4(i,j);
 printf("%d%d%d%d",a,b,c,d);
}
16.用指针函数编写实现以下功能的程序。(易)
有10个学生,每个学生有4门课程,要求:(1)在用户输入学生序号以后能输出学生的全部成绩 ;(2)能找出其中有不及格课程的学生及其学号。
typedef struct student{
    char name[10];
    char stu_id[15];
    int  score1;
    int  score2;
    int  score3;
    int  score4;
}stu,*pstu;
stu *serch_by_id(char stu_id[],stu student[])
{
    int i=0;
    while(i<10)
    {
        if(strcmp(student[i].stu_id,stu_id)==0)
        {
            return &student[i];
            /**/
        }
        i++;
    }
    return NULL;

}
stu *choose_stu(stu student[],int *flag)
{
    int i=*flag;
    while(i<10)
    {
        *flag=i+1;
        if(student[i].score1<60||student[i].score2<60||student[i].score3<60||student[i].score4<60)
        {
            return &student[i];
        }
        
        i++;
        
    }
    return NULL;
}


void main(int argc, char* argv[])
{
    FILE *fp;
    stu studen[10],*ReturnValue;
    char stu_id_tmp[15];
    int num=0,selected;
    int flag=0;
    if(!(fp=fopen("student.txt","r")))
    {
        printf("faile to open file\n");
        return;
    }
    while(num<10)
    {
        fscanf(fp,"%s %s %d %d %d %d",
            studen[num].name,
            studen[num].stu_id,
            &studen[num].score1,
            &studen[num].score2,
            &studen[num].score3,
            &studen[num].score4);
        num++;
    }
    while(1)
    {
    printf("输入学号查询成绩,请按1\n");
    printf("不及格课程的学生及其学号,请按2\n");
    printf("按其他任意键退出\n");
    scanf("%d",&selected);
    if(selected==1)
    {
        printf("请输入学号:\n");
        scanf("%s",stu_id_tmp);
        ReturnValue=serch_by_id(stu_id_tmp,studen);
        if(ReturnValue)
        {
            printf("姓名     学号        科目1   科目2   科目3   科目4\n");
            printf("%-7s %-10s    %d      %d      %d      %d\n",
            ReturnValue->name,
            ReturnValue->stu_id,
            ReturnValue->score1,
            ReturnValue->score2,
            ReturnValue->score3,
            ReturnValue->score4);
        }
    }else if(selected==2)
    {
        printf("姓名     学号        科目1   科目2   科目3   科目4\n");
         while((ReturnValue=choose_stu(studen,&flag))!=NULL)
        {
            printf("%-7s %-10s    %d      %d      %d      %d\n",
            ReturnValue->name,
            ReturnValue->stu_id,
            ReturnValue->score1,
            ReturnValue->score2,
            ReturnValue->score3,
            ReturnValue->score4);
            printf("\n");
        }
    }
    else break;
     printf("------------------------------------------------------------------\n");
    }
    return;
}
17.设有一10个整数的数组,编程实现逆序存放数组中的各元素。(易)
#define N 10
void main(int argc, char* argv[])
{
    int a[N],i,m;
    printf("请输入十个数:\n");
    for(i=0;i<N;i++)scanf("%d",&a[i]);
    printf("原数组为:%d",a[0]);
    for(i=1;i<10;i++)printf(",%d",a[i]);
    for(i=0;i<5;i++)
    {
        m=a[9-i];
        a[9-i]=a[i];
        a[i]=m;
    }
    printf("\n逆序后的数组为:%d",a[0]);
    for(i=1;i<10;i++)printf(",%d",a[i]);
    printf("\n");
}
18.试写出一个函数,把首指针为head2的简单链表中的结点全部接在首指针为head1的简单链表的结点之后,形成一个新链表(表头指针仍为head1)。(易)
typedef struct intnode
{
    int data;
    struct intnode *next;
}node,*ptr;

ptr creatlinked()  //构造链表
{
    int x;
    ptr head,p;
    head=NULL;
    scanf("%d",&x);
    while(x!=0)
    {
        p=new node;
        p->data=x;
        p->next=head;
        head=p;
        scanf("%d",&x);
    }
    return(head);
}

void outlinked(ptr p)    //遍历链表
{
    while(p!=NULL)
    {
        printf("%8d",p->data);
        p=p->next;
    }
    printf("\n");
}

ptr cat(ptr h1,ptr h2)         //连接链表
{
    ptr p=h1;
    if(h1==NULL)return h2;
    while(p->next!=NULL)p=p->next;
    p->next=h2;
    printf("连接成功!");
    return h1;
}

void main()
{
    ptr head1,head2;    
    printf("请输入第一个链表元素,以0结束:");
    head1=creatlinked();
    printf("\n第一个链表元素为:");
    outlinked(head1);
    printf("\n请输入第二个链表元素,以0结束:");
    head2=creatlinked();
    printf("\n第二个链表元素为:");
    outlinked(head2);
    head1=cat(head1,head2);
    printf("\n连接后的链表元素为:");
    outlinked(head1);
    printf("\n");
}
19. 用结构类型描述学生信息,含有:姓名、学号、语文成绩、数学成绩、英语成绩,平均成绩,排名次序。(易)
输入全班学生(假定人数不超过50人)的数据(不包括平均成绩和排名次序),分别计算并填写各人的平均成绩,以及各单科成绩和平均成绩在全班中的排名次(要考虑并列名次),最后输出这些学生的所有数据。
typedef struct
{
    char name[20]; //姓名
    int number,chn,math,eng,ord; //学号,语文成绩,数学成绩,英语成绩,名次(假设各科成绩均为整数)
    float ave; //平均成绩
}student;

void main()
{
    int n,i,j,maxi;
    student class1[N],anyone;
    printf("请输入总人数:");
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        printf("请输入学号和姓名:\n");
        scanf("%d%s",&class1[i].number,class1[i].name);
        printf("请输入该学生的语文、数学和英语成绩:\n");
        scanf("%d%d%d",&class1[i].chn,&class1[i].math,&class1[i].eng);
        class1[i].ave=(float)(class1[i].chn+class1[i].math+class1[i].eng)/3;
    }

    for(i=0;i<n-1;i++)   //排序
    {
        maxi=i;
        for(j=i+1;j<n;j++)
            if(class1[j].ave>class1[maxi].ave)maxi=j;
        anyone=class1[i];
        class1[i]=class1[maxi];
        class1[maxi]=anyone;
    }

    class1[0].ord=1;  //排名次
    for(i=1;i<n;i++)
        if(class1[i].ave==class1[i-1].ave)
            class1[i].ord=class1[i-1].ord;
        else class1[i].ord=i+1;

    printf("输出学生的信息:\n"); //输出学生信息
    for(i=0;i<n;i++)  
        printf("%d,%d,%s,%d,%d,%d,%6.1f\n",class1[i].ord,class1[i].number,
           class1[i].name,class1[i].chn,class1[i].math,class1[i].eng,class1[i].ave);
}
20.设计复数四则运算的函数。(较难)
typedef struct
{
    double re,im;
}cmplx;

cmplx cadd(cmplx x,cmplx y)  //加法
{
    cmplx a;
    a.re=x.re+y.re;
    a.im=x.im+y.im;
    return a;
}

cmplx csub(cmplx x,cmplx y)  //减法
{
    cmplx a;
    a.re=x.re-y.re;
    a.im=x.im-y.im;
    return a;
}

cmplx cmult(cmplx x,cmplx y)  //乘法
{
    cmplx a;
    a.re=x.re*y.re-x.im*y.im;
    a.im=x.im*y.re+y.im*x.re;
    return a;
}

cmplx cdiv(cmplx x,cmplx y)  //除法
{
    cmplx a;
    double r;
    r=y.re*x.re+y.im*y.im;
    a.re=(x.re*y.re+x.im*y.im)/r;
    a.im=(x.im*y.re-y.im*x.re)/r;
    return a;
}


void write(cmplx a,char c) //输出
{
    if(a.im>=0)printf("%c=%g+i%g\n",c,a.re,-a.im);
    else printf("%c=%g-i%g\n",c,a.re,-a.im);
}

void main()
{
    cmplx x,y,a,b,c,d;
    printf("请输入两个复数的实部和虚部:\n");
    scanf("%f%f%f%f",&x.re,&x.im,&y.re,&y.im);
//调用相关函数
    a=cadd(x,y);
    a=csub(x,y);
    a=cmult(x,y);
    a=cdiv(x,y);
//输出结果
    write(x,'x');
    write(y,'y');
    write(a,'a');
    write(b,'b');
    write(c,'c');
    write(d,'d');
}
21.创建一个五结点的链表,输入数据并且按照从小到大的顺序排序。(易)
typedef struct intnode
{
    int data;
    struct intnode *next;
}node,*ptr;

ptr creatlinked()  //构造链表
{
    int x,i=0;
    ptr head,p;
    head=NULL;
    while(i<5)
    {
        scanf("%d",&x);
        p=new node;
        p->data=x;
        p->next=head;
        head=p;
        i++;
    }
    return(head);
}

void outlinked(ptr p)    //遍历链表
{
    while(p!=NULL)
    {
        printf("%5d",p->data);
        p=p->next;
    }
    printf("\n");
}

void px(ptr p) //排序
{
    int a[5],i=0,j,n;
    ptr head;
    head=p;
    while(p!=NULL)
    {
        a[i++]=p->data;
        p=p->next;
    }
    for(i=0;i<4;i++)
        for(j=i+1;j<5;j++)
            if(a[i]>a[j]){n=a[i];a[i]=a[j];a[j]=n;}
    p=head;
    while(p!=NULL)
    {
        p->data=a[i++];
        p=p->next;
    }
}

void main()
{
    ptr head;    
    printf("请输入链表的五个元素:");
    head=creatlinked();
    printf("\n原链表元素为:");
    outlinked(head);
    printf("\n排序后的链表元素为:");
    px(head);
    outlinked(head);
    printf("\n");
}
22.定义一个可以存储学生信息的结构,其中学生信息包括:学号、姓名、性别、年龄、系名、成绩。并编写程序输入10组数据,然后按照成绩从大到小排序。(较难)
#define N 10
typedef struct
{
    char name[20],dean[20]; //姓名,系名
    char sex; //性别(m表示男,f表示女)
    int number,age,grade; //学号,年龄,成绩(假设成绩为整数)
}student;

void main()
{
    int i,j,maxi;
    student class1[N],anyone;

    for(i=0;i<N;i++) //输入学生信息
    {
        printf("请输入第%d个学生的学号和姓名:\n",i+1);
        scanf("%d%s",&class1[i].number,class1[i].name);
        printf("请输入第%d个学生的性别,年龄,系名,成绩:\n",i+1);
        scanf("%c%d%s%d",&class1[i].sex,&class1[i].age,class1[i].dean,&class1[i].grade);
        printf("\n");
    }

    for(i=0;i<N-1;i++)   //排序
    {
        maxi=i;
        for(j=i+1;j<N;j++)
            if(class1[j].grade>class1[maxi].grade)maxi=j;
        anyone=class1[i];
        class1[i]=class1[maxi];
        class1[maxi]=anyone;
    }

    printf("输出学生的信息:\n"); //输出学生信息
    for(i=0;i<N;i++)  
        printf("%d,%s,%c,%d,%s,%d\n",class1[i].number,class1[i].name[20],class1[i].sex,
            class1[i].age,class1[i].dean[20],class1[i].grade);
}
23. 编写程序实现:将文件file2中的内容接到文件file1的内容之后。(较难)
void main()
{
    FILE *fp1,*fp2;
    if((fp1=fopen("file1","a"))==NULL)
    {
        printf("can't open file1!");
        exit(0);
    }
    if((fp1=fopen("file2","r"))==NULL)
    {
        printf("can't open file2!");
        exit(0);
    }
    while(!feof(fp2))
        fputc(fgetc(fp2),fp1);
    fclose(fp1);
    fclose(fp2);
}
24.显示正文文件D:\mafile\f1.txt中的内容。(易)
main()
{   
    FILE *fp;
    char string[256];
    if( (fp = fopen( "D:\\1.txt", "r" )) == NULL )
    {
        printf( "The file D:\\1.txt was not opened\n" );
       exit(0);
    }
    else
        while(!feof(fp))
        {
          fgets(string,20,fp);
          printf("%s",string);
        }
    fclose(fp);
    return 0;
}
25. 将2至4000中所有的素数分别输出到两个文件中,一个是文本文件,另一个是二进制文件。(难)
#define n 4000
FILE *f,*g;
void prime()
{
    int i,j,a[n+1];
    for(i=2;i<=n;i++)
      a[i]=1;
    for(i=2;i*i<=n;i++)
      if(a[i])
     {j=i*i;
      while(j<=n)
      {a[j]=0;j=j+i;}
     }
   for(i=2;i<=n;i++)
     if(a[i])
   {
     printf("%8d",i);
     fprintf(f,"%8d",i);
     fwrite(&i,sizeof(int),1,g);
   }
}
  void main()
  {
    if((f=fopen("e:\\ex23.txt","w"))==NULL)
   {
     printf("Cann't open file f !");
     exit(0);
   }
     if((g=fopen("e:\\exb23.dat","wb"))==NULL)
   {
     printf("Cann't open file g!");
     exit(0);
   }
  prime();
  fclose(f);
  fclose(g);
  printf("正文文件ex23.txt和二进制文件exb23.dat已经生成.\n");
}
26. 编写比较两个文件内容是否相同的程序,若相同,显示“Compare  OK!”;否则,显示“Not  Equal!”。 (较难)
FILE *f,*g;
int compare()
{
  char c,d;
  while(!feof(f)&&(!feof(g)))
  {
    fread(&c,sizeof(char),1,f);
    fread(&d,sizeof(char),1,g);
  if(c!=d) return 0;
  }
  if(!feof(f)||(!feof(g))) return 0;
  return 1;
 }
void main()
{
 if((f=fopen("e:\\ex23.txt","rb"))==NULL)
   {
     printf("Cann't open file f !");
     exit(0);
   }
     if((g=fopen("e:\\exb23.dat","rb"))==NULL)
   {
     printf("Cann't open file g!");
     exit(0);
   }   
   if(compare()) printf("Compare OK!\n");
   else printf("Not Equal!\n");
   fclose(f);
   fclose(g);
}
27. 设某文件中存放了1000个整数,要求将该文件中的数据按从小到大的顺序排列后存入原文件中(覆盖原内容)。(较难)
#define m 1000
FILE *f;
main()
{
    int i=0,j,k,x,h=0,a[m];
    if((f=fopen("e:\\bc.txt","r"))==NULL)
    {
        printf("cann't open file f!");
        exit(0);
    }
    while(!feof(f)){ fscanf(f,"%d",&a[i++]);h++;}
    for(i=0;i<h;i++)
    {
        for(k=i,j=i+1;j<h;j++) if(a[j]<a[k])
        {
            k=j;
            x=a[k],a[k]=a[i],a[i]=x;
        }
    }
    if((f=fopen("e:\\bc.txt","w"))==NULL)
    {
        printf("cann't open file f!");
        exit(0);
    }
    for(i=0;i<h;i++) fprintf(f,"%5d",a[i]);
    fclose(f);
    return 0;
}
28.用递归法求n!。(较难)
int jc(int n)
{
    if (n==1)
        return 1;
    else
        return n*jc(n-1);
}

main()
{
    int i,n;
    printf("please input n:\n");
    scanf("%d",&n);
    i=jc(n);
    printf("%d",i);
    return 0;
}
29.编写实现:从键盘输入一些字符,逐个将它们写入磁盘文件file1.txt中,直到输入一个“#”为止。(较难)
main()
{
    char a;
    FILE *f;
    if((f=fopen("e:\\file1.txt","w"))==NULL)
    {
        printf("cann't open file f!");
        exit(0);
    }
    a=getchar();
    while(a!='#')
    {
        fputc(a,f);
        a=getchar();
    }
    return 0;
}
30.编程实现:读出上题中生成的file1.txt文件,并将其中的小写字母改为大写字母,按逆序写入file2.txt中。(难)
#define n 1000
main()
{
    char a[n];
    int i=0,j;
    FILE *f,*p;
    if((f=fopen("e:file1.txt","r"))==NULL)
   {
     printf("Cann't open file f !");
     exit(0);
   }
    while(!(feof(f)))
    {
     fread(&a[i],1,1,f);
     i++;
    }
    for(j=0;j<=i;j++)
    {
        if(a[i]>='a'&&a[i]<='z')
            a[i]-='a'-'A';
    }
     if((p=fopen("e:\\file2.txt","w"))==NULL)
   {
     printf("Cann't open file g!");
     exit(0);
   }   
     for(;i>=0;i--)
         fputc(a[i],p);
    return 0;
}
31.编程实现:将上述两个文本文件file1.txt和file2.txt连接成一个文件。(较难)
main()
{
   FILE *fp1,*fp2;
   if((fp1=fopen("e:\\file1.txt","a"))==NULL)
   {
     printf("Cann't open file fp1 !");
     exit(0);
   }
     if((fp2=fopen("e:\\file2.txt","r+"))==NULL)
   {
     printf("Cann't open file fp2!");
     exit(0);
   }   
   while(!feof(fp2))
       fputc(fgetc(fp2),fp1);
   fclose(fp1);
   fclose(fp2);
    return 0;
}
搜索更多相关主题的帖子: c语言 经典 
2008-11-25 00:06
快速回复:c语言经典31题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021051 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved