C 语言教程 在线

1564C 标准库 - stdarg.h

变参使用实例 test.c

#include <stdio.h>
#include <string.h>
#include <stdarg.h>

void tLog(char *sInfo, ...);

int main(int argc, char *argv[])
{
    char str[4+1] = {0};
    strcpy(str,"INFO");
    tLog(str,argv[1],argv[2],argv[3]);
    return 0;
}
void tLog(char *sInfo, ...)
{
    char *str   = NULL;
    char *str1 = NULL;
    char *str2 = NULL;
    va_list sArgv;          // 申请参数列表变量
    va_start(sArgv, sInfo); // 申明最后一个传递给函数的已知的固定参数
    /* 依次读取固定参数 sInfo 后的 参数 */
    str   = va_arg(sArgv, char*);
    str1 = va_arg(sArgv, char*);
    str2 = va_arg(sArgv, char*);
    va_end(sArgv);
    printf("运行输出:[%s,%s%s%s]\n",sInfo,str,str1,str2);
}

编译 gcc test.c 得到 a.out

运行程序:

$ ./a.out  facesho Google Facebook
运行输出:[INFO,faceshoGoogleFacebook]

1563C 排序算法

有种排序叫做猴子排序(Bogo Monkey):

  • 1、检查是否排好
  • 2、打乱
  • 3、检查是否排好
  • 4、打乱
  • 5、……

如果数据稍多的话,几乎是不可能排序好的。

排序代码:

#include <time.h>
#include <stdlib.h>
#include <stdbool.h>

void swap(int* x, int* y){
  //交换
  int temporary = *x;
  *x = *y;
  *y = temporary;
}
void randomize(int arr[], int length){
  //打乱数组
  for(int i = 0; i < length; i++){
    srand(time(NULL)+i);//引入i增加随机性
    if(rand()%2) swap(&arr[i],&arr[i+1]);
  }
  //printf("!");//记录打乱次数
}
bool isSorted(int arr[], int length){
  for(int i = 0; i < length; i++) if(arr[i]>=arr[i+1]) return false;
  return true;
}
void bogoSort(int array[], int length){
  while(!isSorted(array,length)) randomize(array,length);
}

Demo:

#include <stdio.h>
int main(){
  int numbers[] = {20,9,233,0,-23,7,1,666,4,345,63,45,2,45};
  bogoSort(numbers,14);//也可以改成更小
  for(int i = 0; i < 14; i++) printf("%d,",numbers[i]);
}

1562C 排序算法

1. 希尔排序缩小递增量必须是要互质的。

2. 快速排序可以不用交换中间值。

以下代码仅供参考:

void Array_Map_Sort_Quickly_Extrem(int* Array, int start, int end)
{
    int i=start;
    int j=end;
    int Pivot = Array[end];
    if(start<end)
    {
        while(i<j)
        {
            while(i<j &&Array[i]<=Pivot) i++;//Note: i choose the end as parameter
            Array[j]=Array[i];
            while(i<j &&Array[j]>=Pivot) j--;
            Array[i]=Array[j];
        }
        Array[i]= Pivot;
    }
    else 
        return;
    Array_Map_Sort_Quickly_Extrem(Array,start,i-1);
    Array_Map_Sort_Quickly_Extrem(Array,i+1,end);
}

1561C 命令行参数

main 的两个参数的参数名如下:

int main( int argc, char *argv[] )

并不一定这样写,只是约定俗成罢了。但是亦可以写成下面这样:

int main( int test_argc, char *test_argv[] )  

任意你喜欢的名字。

但是大部分人还是写成开头那样的,如下:

int main( int argc, char *argv[] )  

1560C 内存管理

对于我们手动分配的内存,在 C 语言中是不用强制转换类型的。

description = malloc( 200 * sizeof(char) ); // C 语言正确。
description = malloc( 200 * sizeof(char) ); // C++ 错误

但是 C++ 是强制要求的,不然会报错。