经典c语言笔试题

本文汇集了多道经典的C语言笔试题目,涉及冒泡排序、二分查找、筛选法、浮点数降序排序、冒泡排序优化、二分查找实现、链表反转、字符串子串查找、位操作和内存管理等多个方面,展示了C语言在算法和数据结构中的应用。
摘要由CSDN通过智能技术生成

***********************************************************************************************************************************                             编程区:

                     《《《《冒泡排序,二分查找,选法,的考察》》》》


100、

有两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件C中.

#include<stdio.h>

#include<stdlib.h>
int main(int argc,char* argv[])
{
  FILE* fp;
  int i,j,k,num,NUM;
  char c[50],t,ch;
 if((fp=fopen("A","r"))==NULL)
     /*can be replaced by open
      * int fd=open("A",O_RDONLY|O_CREAT);*/

      {
          printf("fileA cannot be opened\n");
          exit(0);
      }
 printf("\nA contents are:\n");
 for(i=0;(ch=fgetc(fp))!=EOF;i++)/*一个字符一个字符读*/
   {
         c[i]=ch;
         putchar(c[i]);
   }
 num=i+1;
 fclose(fp);

if((fp=fopen("B","r"))==NULL)
   {
       printf("fileB cannot be opened\n");
       exit(0);
   }
 printf("\nB contents are :\n");
for(i=0;(ch=fgetc(fp))!=EOF;i++)
  {
      c[num+i]=ch;
      putchar(c[num+i]);
   }

fclose(fp);

NUM=num+i+1;
for(k=0;k<NUM-1;k++)/*冒泡排序*/
  {
    for(j=0;j<NUM-k-1;j++)
    {
        if(c[j]>c[j+1])
              {
           t=c[j];
           c[j]=c[j+1];
           c[j+1]=t;
                }
    }
  }

printf("\nC fileis:\n");
fp=fopen("C","w");
for(i=0;i<NUM;i++)
{
    putc(c[i],fp);/*将字符一个个写入文件中*/
    putchar(c[i]);/*一个个输出字符*/
}
fclose(fp);
return 1;
}


86.有一浮点型数组A,用C语言写一函数实现对浮点数组A进行降序排序,并输出结果,要求要以数组A作为函数的入口.(建议用冒泡排序法)

#include<stdio.h>
#include<stdlib.h>
void BubbleSort(int arr[], int n)
{
  int i,j;
  int exchange = 1;//交换标志,提高算法效率;
  int temp;
  for(i=0;i<n-1;i++)
              {
       exchange=0;//本趟排序开始前,交换标志应为假
       for(j=0;j<n-i-1;j++)
                         {
            if(arr[j+1] > arr[j])
                                      {
                 temp=arr[j+1];
                 arr[j+1]=arr[j];
                 arr[j]=temp;
                 exchange=1; //发生了交换,故将交换标志置为真
                                         }
                   }
       if(!exchange) //本趟排序未发生交换,提前终止算法
        return;
          }
}
int main(int argc,char* argv[])
  {
   int arr[5]={1,4,2,6,5};
   int i;
   BubbleSort(arr, 5);
   printf("after sort,arr is :\n");
   for(i=0;i<5;i++)
            {
       printf("%3d",arr[i]);
              }
   return 1;
   }

77.写出二分查找的代码:

  Int binary_search(int* arr,int key,int size)

{

     Intmid;

     Intlow=0;

Int high=size-1;

While(low<=high)

     {

       Mid=(low+high)/2;

       If(arr[mid]>key)

           High=mid-1;

       ElseIf(arr[mid]<key)

           Low=mid+1;

     Else

       Return mid;

}

  Return -1;

}

补充1:用帅选法查找100之内的质数

#include <iostream>
using namespace std;
#define N  100
int main()
{
       /*0~100共101个数*/
   int sieve[N + 1];
   int i;
    //step 1:初始化(sieve[i] = 0 表示不在筛中,即不是质数;1表示在筛中)
    sieve[0]=sieve[1]=0;
    for(int i = 2; i <= N; i++)
                    {
            sieve[i] = 1;
                     }

    //step 2:偶数(2的倍数)肯定不是质数,所以应该先筛除
    for(i = 2; i <= N / 2; i++)
                     {
                sieve[i * 2] = 0;
                      }
    int p = 2; //第一个质数是2
    //step 3:从sieve中删去P的倍数
    while(p * p <= N)
                {
        p = p + 1;    //选下一个p
        while(sieve[p] == 0)
                              {
                       p++;
                               }
        int t = p * p;
        int s = 2 * p;/*质数与质数之和包含合数,但质数于合数之和必为质数,提高算法效率*/
        while(t <= N)
                              {
               sieve[t] = 0;  //删除
               t = t + s;
                               }
                   }
    //step 4: 输出结果
 for(i = 2; i <= N; i++)
      {
      if(sieve[i] != 0)
                        {
            cout<<i<<", ";
                        }
       }
 return 1;
}

                                  《《《《链表操作考察》》》》
87、实现双向链表删除一个节点P,在节点P后插入一个节点,写出这两个函数。

//删除操作

StatusListDelete_DuL(DuLinkList&  L,int i,ElemType&  e)

{

if(!(p=GetElemP_DuL(L,i)))

return   ERROR;//容错判断;

e=p->data;

p->prior->next=p->next;

p->next->prior=p->pror;

free(p);

p=NULL;//勿忘,否则内存泄露

return OK;

}

//插入操作

StatusListInsert_DuL(DuLinkList&L,inti,ElemType&e)

{

if(!(p=GetElemP_DuL(L,i)))

return   ERROR;

if(!(s=(DuLinkList)malloc(sizeof(DuLNode))))

 return  ERROR;

               /*assert((s=(DuLinkList)malloc(sizeof(DuLNode)))!=NULL)*/

s->data=e;

s->prior=p;

p-> next -> prior =s;

p->next=s;

s->next=p->next->next;

return  OK;}

88、把一个链表反向。//链表头插法;

intre_Link(Linklist H)

{

       Linklist p=H->next,q;

       H->next=NULL;

       while(p!=NULL)

       {

              q=p;

              p=p->next;

             q->next=H->next;

              H->next=q;

       }

       return 0;

}

                                                      《《《《strcpy 和memcpy》》》》

76.已知strcpy函数的原型是char *strcpy(char*strDest, const char *strSrc);其中strDest是目的字符串,strSrc是源字符串。

(1)不调用C++/C 的字符串库函数,请编写函数strcpy。

char* stringcpy(char* Des,const char* Src)

{

assert((Des!=NULL) && (Src!=NULL));

char* address=Des;

while((*Des++=*Src++)!='\0');

return address;
}

断言assert是一个宏,该宏在<assert>中,

当使用assert时候,给他个参数,即一个判读为真的表达式。

预处理器产生测试该断言的代码,如果断言不为真,则发出一

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值