C语言练习之程序编写

  • 【程序1】

题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去
      掉不满足条件的排列。
2.程序源代码:

main()
{
    int i,j,k;
    printf("\n");
    for(i=1; i<5; i++)    /*以下为三重循环*/
     for(j=1; j<5; j++)
      for (k=1; k<5; k++)
     {
        if (i!=k && i!=j && j!=k)    /*确保i、j、k三位互不相同*/
            printf("%d,%d,%d\n",i,j,k);
     }
}

  • 【程序2】

题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高
   于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提
   成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于
   40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于
   100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?
1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。      
2.程序源代码:

main()
{
    long int i;
    int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;
    scanf("%ld",&i);
    bonus1=100000*0.1;bonus2=bonus1+100000*0.75;
    bonus4=bonus2+200000*0.5;
    bonus6=bonus4+200000*0.3;
    bonus10=bonus6+400000*0.15;

   if(i<=100000)
      bonus=i*0.1;
   else if(i<=200000)
     bonus=bonus1+(i-100000)*0.075;
   else if(i<=400000)
    bonus=bonus2+(i-200000)*0.05;
  else if(i<=600000)
    bonus=bonus4+(i-400000)*0.03;
  else if(i<=1000000)
     bonus=bonus6+(i-600000)*0.015;
  else
      bonus=bonus10+(i-1000000)*0.01;
    printf("bonus=%d",bonus);
}

  • 【程序3】

题目:输入某年某月某日,判断这一天是这一年的第几天?
1.程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊
      情况,闰年且输入月份大于3时需考虑多加一天。
2.程序源代码:

main()
{
    int day, month, year, sum, leap;
    printf("\nplease input year,month,day:\n");
    scanf("%d,%d,%d",&year,&month,&day);
    switch(month)/*先计算某月以前月份的总天数*/
    {
       case 1:sum=0;break;
       case 2:sum=31;break;
       case 3:sum=59;break;
       case 4:sum=90;break;
       case 5:sum=120;break;
       case 6:sum=151;break;
       case 7:sum=181;break;
       case 8:sum=212;break;
       case 9:sum=243;break;
       case 10:sum=273;break;
       case 11:sum=304;break;
       case 12:sum=334;break;
       default:printf("data error");break;
    }
    sum=sum+day;  /*再加上某天的天数*/
   if(year%400==0||(year%4==0&&year%100!=0))/*判断是不是闰年*/
      leap=1;
   else
      leap=0;
    if(leap==1&&month>2)/*如果是闰年且月份大于2,总天数应该加一天*/
        sum++;
    printf("It is the %dth day.",sum);
}

  • 【程序4】

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

(1)不调用 C++/C 的字符串库函数,请编写函数 strcpy 。
(2)strcpy 能把 strSrc 的内容复制到 strDest,为什么还要 char *  类型的返回值? 

参考答案:

(1)

char *strcpy(char *strDest, const char *strSrc)
{
    assert((strDest!=NULL) && (strSrc!=NULL));
    char *address = strDest;
    while((*strDest++ = *strSrc++) != '\0')
        ;
    return address;
}
(2)

为了实现链式表达式。如int length = strlen(strcpy(strDest, "hello world"));

  • 【程序5】

题目:写出二分查找的代码 。

参考答案:

int binary_search(int* arr, int key, int n)
{
    int low = 0;
    int high = n - 1;
    int mid;
    while (low <= high)
    {
        mid = (high + low)/2;
    	if (arr[mid] > k)
            high = mid - 1;
     	else if (arr[mid] < k)
            low = mid + 1;
      	else
            return mid;
    }	
    return -1;
}

  • 【程序6】

题目:请编写一个 C 函数,该函数给出一个字节中被置 1 的位的个数。
参考答案:

unsigned int TestAsOne0(char log)   
{
    int i;
    unsigned int num=0, val;
    for(i=0; i<8; i++)
    {
        val = log>>i;    //移位
        val &= 0x01;     //与1相与
        if(val)
            num++;
    }   
    return num;
}

  • 【程序7】

题目:请编写一个 C 函数,该函数将给定的一个数字型字符串转换成整数。

参考答案:

int invert(char *str) 
{ 
    int num=0;   
    int digital;
    if(str == NULL)
        return -1;
 while(*str!='\0') {
digital=*str-'0'; num=num*10+digital; str++; } return num;}

  • 【程序8】

题目:请编写一个 C 函数,该函数将给定的一个整数转换成字符串。

参考答案:

void IntToCharChange(int num, char *pval)
{
    char strval[100];
    int i,  j;
    int val0 = 0;
    int val1 = 0;
    val0 = num;
    for(i=0; i<100; i++)
    {
        val1 = val0 % 10;        //取余
        val0 = val0 / 10;        //取整
        strval[i] = val1 + '0';  //数字—字符
        if(val0 < 10)
        {
            i++;
            strval[i] = val0 + '0';
            break;
        }
    }
    for(j=0; j<=i; j++)         //倒置
        pval[j] = strval[i-j];
    pval[j] = '\0';
}

  • 【程序9】

题目:实现strcmp函数 。
参考答案:

int mystrcmp(const char *str1, const char *str2)
{
    assert((str1 != NULL) && (str2 != NULL));
    int ret = 0;
    while (!(ret = *(unsigned char*)str1 - *(unsigned char*)str2) && *str2)
    {
        str1++;
        str2++;
    }
    if (ret > 0)
        ret = 1;
    else if (ret < 0)
        ret = -1;
    return ret;
}

  • 【程序10】

题目:请编写一个 C 函数,该函数将一个字符串逆序。 

参考答案:

void AntitoneValue(char *father, char *child)
{
    int i;
    char source[100];
    int j = 0;
    while(father[j])     //放入source,[j]为长度
    {
        source[j] = father[j];
        j++;
 	if(j > 99)
  	    return;   
    }
    source[j] = '\0';
    for(i=0; i<j; i++)
        child[i] = source[j-i-1];     //反序  
 	child[i] = '\0';
}

  • 【程序11】

题目:请编写一个 C 函数,该函数在给定的内存区域搜索给定的字符,并返回该字符所在位置索引值。

参考答案:

int search(char *cpSource, int n, char ch)  //起始地址,搜索长度,目标字符
{
    int i;
    for(i=0; i<n && *(cpSource+i) != ch; ++i)
        ;
    return i;
}
  • 【程序12】

题目:请编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串,该字符串是由同一字符组成的。

参考答案:

int ChildString(char*p)
{
    char *q = p;
    int stringlen=0, i=0, j=1, len=0, maxlen=1;
    while(*q!='\0')           //不能用strlen,求得长度stringlen
    {
        stringlen++;
	q++;
    }
    while(i< stringlen)
    {   
        if(*(p+i)==*(p+j) && j<stringlen)
        {
            len++;            //统计子串长度
            i++;
            j++;
        }
        else
        {
            if(len>maxlen)    //统计最大子串长度
            {
                maxlen=len+1;
                len=0;
            }
            else
	        len=0;
            i++;
            j++;
         }
    }
    return   maxlen;
}
  • 【程序13】

题目:怎么判断链表中是否有环?

参考答案:

用两个指针来遍历这个单向链表,第一个指针p1,每次走一步;第二个指针p2,每次走两步;  当p2 指针追上 p1的时候,就表明链表当中有环路了。 

int testLinkRing(Link *head)
{
    Link *t1=head,*t2=head;
    while(t1->next && t2->next)
    {
        t1 = t1->next;
        if (NULL == (t2 = t2->next->next))
            return 0;   //无环
        if (t1 == t2)
            return 1;
    }
    return 0;
}

  • 【程序14】

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

参考答案:

void BubbleSort(double arr[], int n)
{
    int i, j;
    int exchange = 1;
    double tmp;
    for(i=0; i<n; i++)
    {
        exchange=0;
        for(j=0;j>=i-1;j++)
            if(arr[j+1] > arr[j])
            {
                tmp=arr[j+1];
                arr[j+1]=arr[j];
                arr[j]=tmp;
                exchange=1;
            }
        if(!exchange)
            return;
    }
}

  • 【程序15】

题目:实现双向链表删除一个节点P,在节点P后插入一个节点,写出这两个函数。

参考答案:

//删除操作
Status ListDelete_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);
    return OK;
}

//插入操作
Status ListInsert_DuL(DuLinkList &L,int i,ElemType &e)
{
    if(!(p=GetElemP_DuL(L,i)))
        return ERROR;
    if(!(s=(DuLinkList)malloc(sizeof(DuLNode))))    
        return ERROR;
    s->data=e;
    s->prior=p;
    p->next->prior=s;
    p->next=s;
    s->next=p->next->next; 
    return OK;
}

  • 【程序16】

题目:把一个链表反向 。

参考答案:

从第一个元素开始,ps指向他,将他(ps)指向头节点(ps->next = head),将ps设为头节点(head = ps;)操作下一个元素(ps = pe->next;)等于是依次将每个元素翻到原头节点前面。

void reverse(List *head)
{
    List *pe = head;
    List *ps = head->next;
    while(ps)
    { 
        pe->next = ps->next;
        ps->next = head;
        head = ps;
        ps = pe->next;
    }
}

  • 【程序17】

题目:将二维数组行列元素互换,存到另一个数组中。

参考答案:

#include <stdio.h>
main()
{ 
    int a[2][3]={{1,2,3},{4,5,6}};
    int b[3][2],i,j;
    printf("array a:\n");
    for(i=0;i<2;i++)
    {
        for(j=0;j<3;j++)
	{
            printf("%5d",a[i][j]);
	    b[j][i]=a[i][j];
	}
	printf("\n");
    }
    printf("array b:\n");
    for(i=0;i<3;i++)
    {
        for(j=0;j<2;j++)
            printf("%5d",b[i][j]);
        printf("\n");
    }
}

  • 【程序18】

题目:输入一行字符,统计其中有多少个单词。

参考答案:

#include <stdio.h>
main()
{   
	char string[81];
    	int i,num=0,word=0;
    	char c;
   	gets(string);
    	for(i=0;(c=string[i])!='\0';i++)
       	    if(c==' ')  
		word=0;
       	    else if(word==0)
       	    {   
		word=1;
                num++;
            }
        printf("There are %d words in the line\n",num);
}

  • 【程序19】

题目:写一个内存拷贝函数,不用任何库函数。

参考答案:

void* memcpy(void* pvTo, const void* pvFrom, size_t size)
{
    assert((pvTo != NULL) && (pvFrom != NULL));
    byte* pbTo = pvTo;
    byte* pbFrom = pbFrom;
    while (size-- > 0)
    {
        *pbTo++ = *pbFrom++;
    }
    return pvTo;
 }

  • 【程序20】

题目:809*??=800*??+9*??+1 其中??代表的两位数,8*??的结果为两位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果。

参考答案:
output(long b, long i)
{
    printf("\n%ld/%ld=809*%ld+%ld",b,i,i,b%i);
}
main()
{
    long int a,b,i;
    a=809;
    for(i=10;i<100;i++)
    {
        b=i*a+1;
        if(8*i<100&&9*i>=100)
        output(b,i);
    }
}
  • 【程序21】

题目:取一个整数a从右端开始的4~7位。

参考答案:

main()
{
	unsigned a,b,c,d;
	scanf("%o",&a);
	b=a>>4;
	c=~(~0<<4);
	d=b&c;
	printf("%o\n%o\n",a,d);
}

  • 【程序22】

题目:打印出杨辉三角形(要求打印出10行如下图)。


参考答案:

main()
{
      int i,j;
      int a[10][10];
      printf("\n");
      for(i=0,j=0;i<10;i++,j++)
      {
          a[i][0]=1;
          a[i][i]=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("%5d",a[i][j]);
            printf("\n");
      }
}

  • 【程序23】

题目:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。

参考答案:

main()
{
    int a,i,aa[4],t;
    scanf("%d",&a);
    aa[0]=a%10;
    aa[1]=a%100/10;
    aa[2]=a%1000/100;
    aa[3]=a/1000;
    for(i=0;i<=3;i++)
    {
        aa[i]+=5;
        aa[i]%=10;
    }
    for(i=0;i<=3/2;i++)
    {
        t=aa[i];
        aa[i]=aa[3-i];
        aa[3-i]=t;
    }
    for(i=3;i>=0;i--)
        printf("%d",aa[i]);
}

  • 【程序24】

题目:计算字符串中子串出现的次数。

参考答案:

main()
{
    char str1[20],str2[20],*p1,*p2;
    int sum=0;
    printf("please input two strings\n");
    scanf("%s%s",str1,str2);
    p1=str1;p2=str2;
    while(*p1!='\0')
    {
        if(*p1==*p2)
        { 
            while(*p1==*p2&&*p2!='\0')
            {
                p1++;
                p2++;
            }
        }
        else
            p1++;
        if(*p2=='\0')
            sum++;
        p2=str2;
    } 
    printf("%d",sum);
} 

  • 【程序25】

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

参考答案:

  • 【程序26】

题目:

参考答案:

main()
{
    FILE *fp;
    int i,j,n,ni;
    char c[160],t,ch;
    if((fp=fopen("A","r"))==NULL)
    {
        printf("file A cannot be opened\n");exit(0);
    }
    printf("\n A contents are :\n");
    for(i=0;(ch=fgetc(fp))!=EOF;i++)
    {
        c[i]=ch;
        putchar(c[i]);
    }
    fclose(fp);
    ni=i;
    if((fp=fopen("B","r"))==NULL)
    {
        printf("file B cannot be opened\n");
        exit(0);
    }
    printf("\n B contents are :\n");
    for(i=ni;(ch=fgetc(fp))!=EOF;i++)
    {
        c[i]=ch;
        putchar(c[i]);
    }
    fclose(fp);
    n=i;
    for(i=0;i<n;i++)
        for(j=i+1;j<n;j++)
            if(c[i]>c[j])
            {
                t=c[i];
                c[i]=c[j];
                c[j]=t;
            }
    printf("\n C file is:\n");
    fp=fopen("C","w");
    for(i=0;i<n;i++)
    {
        putc(c[i],fp);
        putchar(c[i]);
    }
    fclose(fp);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值