C程序(求最长子串、预编译指令、用函数指针对日期排序、用va_list对字符串排序、时间函数、实心空心菱形)

来源:互联网 发布:虚拟歌姬绘画软件 编辑:程序博客网 时间:2024/06/04 19:59
 

1.求字符串个数最大的词

//求一个字符串中的重复最长的子字符串

#include <stdio.h>

#include <string.h>

int findchar(char **s)

{

       int i1=0,i2=0;//i1是寻找时的起始坐标,i2是寻找时的一样字符的起始坐标。

       int max=1;//最长的重复的子串的长度

       char *mp1=NULL;

       char *ps=*s;

       int len=strlen(ps); //数组长度

       char *mp2=NULL;//mp1 mp2分别是找到的最大子串的第一个和第二个的地址

       int m=0,n=0;

       int cnt=0;

              for (i1=0;i1<len-1;i1++)

              {

                     for (i2=i1+2;i2<len;i2++)

                     {

                            m=i1;n=i2;cnt=0;

                            while ( *(ps+m) == *(ps+n) )

                            {

                                   m++;n++;cnt++;

                            }

                            if(cnt>max)

                            {

                                   max=cnt;mp1=ps+i1;mp2=ps+i2;

                            }

                     }

              }

              if(max!=1) *s=mp1;

              return max;

}

int main()

{

       char *s="etyuriabcdfboop";

       int i=findchar(&s);//i is lenght of the largest string

       int j=0;

       printf("length=%d\n",i);

       if(i!=1)

       {

              for (j=0;j<i;j++)

               printf("%c",*(s+j));

              printf("\n");

       }

       else  printf("字符串中没有相同重复的子串\n");

       return 0;

}

2.预编译指令

//define 命令

#include <stdio.h>

#define pt(x) printf(#x"=%d\n",x);//#的作用是将#后面的作为字符串(也替换)处理

#define MAX(TYPE) TYPE max_ ## TYPE(TYPE x,TYPE y) {return x>y?x?y; }

#define ARM11

int main()

//argv[0]为执行的命令,后面依次为命令行中输入的字符串,argc为argv中的数据的个数。

{

    int x=10;

       int y=20;

       pt(x)

       pt(y)

#ifdef ARM9 //定义了哪个值,就会打印相应的值。

       printf("ARM9\n");

#elif defined ARM11

       printf("ARM11\n");

#elif defined INTEL

       printf("INTEL\n");

#endif

       return 0;

}

预编译指令(Unix下的,不知道在Windows下能不能用): #line 100 表示这个预编译下面的语句的行号指定为100.剩下程序的行号依次类推。在***.h中如果有: #if  __INCLUDE_LEVEL__<10        #include <***.h>   #endif  这段预编译代码是指如果自包含自己头文件嵌套数目>10,就停止编译。如果在xxx.c中有如下预编译代码: #pragma  GCC  dependency  “yyy.h” 是指如果 yyy.h比此xxx.c还要新,程序出错。#pragma  GCC   poison   return   int  hello//表示在程序中不能使用return  int  hello 等词,否则程序报错(   _Pragma(“GCC   xxx yyy”)表示不能用xxx   yyy  两者同样功效   )。   #pragma   pack(1)  表示结构体中对齐方式最小为 1.   #warning 产生警告信息,但是程序仍能正常运行。  #error产生错误信息,程序不能正常执行。

 

3.用函数指针对日期排序

#include <stdio.h>

#include <string.h>

struct DATE;

#define SWAP(x,y) {DATE t;t=(x);(x)=(y);(y)=t;}

#define N 10 //the number of DATE array

typedef struct DATE

{

       int year;int month;int day;

}DATE;

int fun1( void *px1,void *px2 )//year descending

{return ((DATE*)px2)->year-((DATE*)px1)->year;}

int fun2( void *px1,void *px2 )//month ascending

{return ((DATE*)px1)->month-((DATE*)px2)->month;}

int fun3( void *px1,void *px2 )//month ascending

{return ((DATE*)px1)->day-((DATE*)px2)->day;}

int fun4( void *px1,void *px2 )//按日期先后顺序排序

{

       if ( ((DATE*)px1)->year > ((DATE*)px2)->year )

          return 1;

       else if ( ((DATE*)px1)->year < ((DATE*)px2)->year )

          return 0;

       else //year equal

       {

              if ( ((DATE*)px1)->month > ((DATE*)px2)->month )

              return 1;

              else if ( ((DATE*)px1)->month < ((DATE*)px2)->month )

              return 0;

              else //month equal

                     if( ((DATE*)px1)->day > ((DATE*)px2)->day )

                  return 1;

                     else if( ((DATE*)px1)->day < ((DATE*)px2)->day )

                  return 0;

       }

       return 0;

}

void pt(DATE *pdate,int n)

{

       int i=0;

       for (i=0;i<n;i++)

       {printf("%d-%d-%d\n",(pdate+i)->year,(pdate+i)->month,(pdate+i)->day);}

}

void sort(void *pa,int n,int (*pfun)(void *px1,void *px2) )//排序通用算法

{

       int i=0,j=0;

       DATE* a=(DATE*)pa;

       for (i=0;i<n-1;i++)

       {

              for (j=0;j<n-1-i;j++)

                  if( pfun( (a+j),(a+j+1) )>0 ) SWAP(*(a+j),*(a+j+1));

       }

}

int main()

{

       DATE date[N];memset(date,N,sizeof(DATE));

       int year,month,day,n=0, i=0;

       printf("please input the num:\n");

       scanf("%d",&n);

       scanf("%*[^\n]");

       scanf("%*c");

       while(n--)

       {

              printf("please input the data(year-month-day)\n");

              scanf("%d-%d-%d",&year,&month,&day);

              //date[i++].year

              date[i].year=year;date[i].month=month;date[i].day=day;

              i++;

       }

       printf(".......................\n");

       sort(date,i,fun1);pt(date,i);

       printf(".......................\n");

       sort(date,i,fun2);pt(date,i);

       printf(".......................\n");

       sort(date,i,fun3);pt(date,i);

       printf(".......................\n");

       sort(date,i,fun4);

       pt(date,i);

       return 0;

}

4.用va_list可变参数对字符串排序

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <stdarg.h>

char* sort(int cnt,...)//按升序排序

{

       va_list vls;

       va_start(vls,cnt);

       char *maxs=va_arg(vls,char *);

       char *t=NULL;

       int i=0;

       for (i=1;i<cnt;i++)

       {

              t=va_arg(vls,char *);

              if ( strcmp(maxs,t)>0 )

                 maxs=t;

       }

       va_end(vls);

       return maxs;

}

int main()

{

       char s1[3][10];

       char (*s)[10];

       s=s1;

       strcpy(*s,"bddk");

       strcpy(*(s+1),"aabdkfk");

       strcpy(*(s+2),"bcdefd");

       printf("最大的字符串是:%s\n",sort(3,s,s+1,s+2) );

       return 0;

}

5.时间函数

#include <time.h>

#include <stdio.h>

#include <string.h>

int main(  )

{

       char stime[100]={0};

       time_t timesec;

       time(&timesec);//此句等同于timesec=time(NULL);

       printf("从1970年至现在计算机经过的CPU秒数为:%ld\n",timesec);

       struct tm *ltm=localtime(&timesec);

       printf("现在是 %d年-%d月-%d日\n",ltm->tm_year+1900,ltm->tm_mon+1,ltm->tm_mday);

       printf("%d时-%d分-%d秒\n",ltm->tm_hour,ltm->tm_min,ltm->tm_sec);

       printf("%s\n",asctime(ltm));//asctime将时间转化成默认的字符串格式。

       int day=0;

       printf("input the added days:\n");

       scanf("%d",&day);

       ltm->tm_mday+=day;//日期加day天

       printf("%s\n",asctime(ltm));

      int i;
      for (i=0;i<10000000;i++);
      clock_t ct=clock();//clock函数返回这个进程用的时间,除以CLOCKS_PER_SEC就是这个进程用的秒数。
      int second=ct/CLOCKS_PER_SEC ;
      printf("%d\n",ct);
      printf("%d\n",second);

        return 0;

}

6.实心空心菱形:

打印一个实心菱形:

#include <stdio.h>

#define ISABS(x) (       (x)>=0?(x):-(x)      )

int main()

{

  int size=2;

  int i,j;

  for(i=-size;i<=size;i++)

  {

       for(j=-size;j<=size;j++)

       {

         if( ISABS(i)+ISABS(j) <= size )

              printf("*");

         else

              printf(" ");

       }

       printf("\n");

  }

}

打印一个空心菱形:

#include <stdio.h>

#define ISABS(x) (       (x)>=0?(x):-(x)      )

int main()

{

  int size=2;

  int i,j;

  for(i=-size;i<=size;i++)

  {

       for(j=-size;j<=size;j++)

       {

         if( ISABS(i)+ISABS(j) == size )

              printf("*");

         else

              printf(" ");

       }

       printf("\n");

  }

}