冰雹序列-C语言

C语言编写的冰雹序列


#include "stdio.h"
#include "stdlib.h"</code>

int getSubValue(const int &amp;tmpvalue)
{
    int newvalue = 0;
    if(tmpvalue &lt;= 1)
    {
        newvalue = 1;
    }
    else if( tmpvalue % 2 == 0 )
    {
        newvalue = tmpvalue/2;
    }
    else
    {
        newvalue = tmpvalue*3 + 1;
    }
    return newvalue;
}

void hailstone(const int &amp;tmpvalue)
{
    int count = 0;
    int newvalue = tmpvalue;
    printf("hailstone( %d ) = { ",tmpvalue);
    while( newvalue != 1 )
    {
        if( 0 != count )
        {
             printf( " , ");
        }
        count++;
        newvalue = getSubValue(newvalue);
        printf("%d",newvalue);
    }
    printf(" } \n");
}

int main(void)
{
    int num ;
    int count = 0;
    printf("please input the first value: ");
    scanf("%d",&amp;num);
    hailstone(num);
}

C语言获取当前时间

C语言获取当前时间:


#include "stdio.h"
#include "time.h"

#define LOG_INFO(format, ...)                                                                           \
{                                                                                                       \
time_t t = time(0);                                                                                 \
struct tm ttt = *localtime(&amp;t);                                                                     \
fprintf(stdout, "[INFO][%4d-%02d-%02d %02d:%02d:%02d] [%s:%s:%d] " format "",                     \
ttt.tm_year + 1900, ttt.tm_mon + 1, ttt.tm_mday, ttt.tm_hour,         \
ttt.tm_min, ttt.tm_sec, __FILE__,__FUNCTION__ , __LINE__, ##__VA_ARGS__);                            \
}

struct currentTime
{

int year;
int mounth;
int day;
int hour;
int minute;
int second;
int weekday;
int days;
int isdst;

}cTime;

void getCurrentTime(void)
{
time_t timep;
struct tm *p;
time(&amp;timep);
p = localtime(&amp;timep);

cTime.year = 1900+p-&gt;tm_year;
cTime.mounth = 1+p-&gt;tm_mon;
cTime.day = p-&gt;tm_mday;
cTime.hour = p-&gt;tm_hour;
cTime.minute = p-&gt;tm_min;
cTime.second = p-&gt;tm_sec;
cTime.weekday = p-&gt;tm_wday;
cTime.days = p-&gt;tm_yday;
cTime.isdst = p-&gt;tm_isdst; //是否是夏令时

}

int main(int argc, char **argv)
{
LOG_INFO("argc: %d\n",argc);
getCurrentTime();

LOG_INFO("cuurent time is: %d/%d/%d %d:%d:%d  weekday[%d]  days[%d]  isdst[%d]\n",
cTime.year , cTime.mounth,cTime.day,
cTime.hour,cTime.minute,cTime.second,
cTime.weekday,
cTime.days,
cTime.isdst);
}



C语言 延迟执行 某个命令

笔记:C语言延迟执行某条命令


/*
C语言 延迟执行 某个命令
*/
int delay_exec(char *command, int delaySeconds)
{
	int pid = 0;
	int status = 0;
	extern char **environ;

	if ( command == 0 )
		return 1;
	pid = fork();
	if ( pid == -1 )
		return -1;

	if ( pid == 0 ) {
		char *argv[4];
		argv[0] = "sh";
		argv[1] = "-c";
		argv[2] = command;
		argv[3] = 0;

		if(delaySeconds)
		{
			sleep(delaySeconds);
		}

		execve("/bin/sh", argv, environ);
		exit(127);
	}


	return status;
}

Python在Linux上的搭建

Python3安装:
在开始使用python之前,需要先准备好相关的工作环境。
一般Linux操作系统因为自身需要,已经安装好了Python2。
Python3的安装软件建议从Python的官方网站下载,这样比较权威,跟比较安全
地址为:https://www.python.org/downloads/source/ 
在本篇中主要演示在Linux上的安装Python3。

在Linux系统中部署安装Python 3

  • 1. 下载软件

在浏览器中访问 https://www.python.org/downloads/source/  ,点击最后发行的正式版本的 XZ compressed source tarball  或者 Gzipped source tarball ,获取压缩文件。

  • 2. 在Linux中安装注意事项

由于自身的需要,已经安装好了Python2,如果使用root权限安装Python3的话,再使用pip做升级的时候,可能会干扰到系统管理包或系统其它组件的工作。所以安装Python3,建议安装在虚拟机上,或给某一个单独的user安装。

  • 3.  解压已下载的压缩包

如果下载的是Python-3.x.x.tar.xz 的压缩包,使用下面命令进行解压

xz -d Python-3.6.5.tar.xz //将Python-3.6.5.tar.xz解压成Python-3.6.5.tar
tar -xvf Python-3.6.5.tar //将Python-3.6.5.tar解压到本地
//解压后就可以看见 Python-3.6.5 的目录

如果下载的是Python-3.x.x.tgz的压缩包,使用下面命令进行解压

tar -xzvf ./Python-3.6.5.tgz  //直接解压Python-3.6.5.tgz
//解压后就可以看见 Python-3.6.5 的目录
  • 4.安装Python3

cd Python-3.6.5/
./configure
make && make install

到此已经安装完毕

  • 5. 制作软连接

ls /usr/bin/py* -la

可以看到 python 和python2都已经连接到 python2的版本上

那么需要制作 python3 连接到Python的版本上,使用python3作为3版本的启动命令。

ln -s /usr/local/python3/bin/python3.5 /usr/local/bin/python3

然后后面就可以使用python3命令来启动新版本的Python

到这一步应该已经可以使用python3了。

———————-分割线———————————————

如果还不行的话,那么就要做下面的步骤

6. 将python3 添加到PATH

首先 echo $PATH 查看里面是否有 python3 的路径

如果没有则需要加上。可以用VI修改,可以通过文本文件修改。

加入下面高亮的一部分,注意前面是 英文冒号做衔接。

改完后让环境变量生效,输入命令

source ~/.bash_profile
  • 检验Python3 和pip是否可用

输入命令

python -V;pip -V

检查版本号是否都是Python3的版本。

如果pip的版本是指向Python2的,那么需要做一个pip3 来针对Python3使用

添加软连接:

ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3

大功告成,可以正式使用了。

Python在Windows上的环境搭建

 

Python的安装:
在开始使用python之前,需要先准备好相关的工作环境。
Python的安装软件建议从Python的官方网站下载,这样比较权威,跟比较安全
地址为:https://www.python.org/downloads/

在本篇中主要演示在Windows上的安装。

    在Windows系统中安装Python

  •  1. 下载软件

在浏览器中访问   https://www.python.org/downloads/  ,点击上面标有Download Python x.x.x (x.x.x为版本号)的黄色按钮,即可下载python-x.x.x.exe的文件。

 

 

  • 2. 安装Python软件

双击下载好的软件,开始安装并出现如下界面,

  1. Install Now ,点击该项会使用默认参数和默认路径并直接安装完成。
  2. Customize installation ,点击该项会使用用户自定义的路径和参数安装
  3. Install launcher for all users(recommended)默认为勾选,选中后 会为所有用户安装,即切换用户之后,仍然可以使用python
  4. Add Python 3.6 to python ,需要手动勾选,勾选后会自动将python的安装路径添加到环境变量中。如果忘记勾选了,后面可以手动加上。

上面如果点击了Customize installation,则会进入下面的界面

Continue reading “Python在Windows上的环境搭建”

Python简介

Python - Python简介

python是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年。
它是一门易读、易维护,并且被大量用户所欢迎的、用途广泛的语言。

Python的特点


  •      python是面向对象的
    python的类模式支持多态、重组、继承等高级概念。

 

  •      python是自由的
    它是一个开源软件,完全开放源码。

 

  •      python是可移植的
    python是用可一直的ANSI C写成的,可以在各主要平台上编译,运行。

 

  •      python的功能很强大
    • 动态类库 – python跟踪程序运行时使用的各种对象,他们不需要复杂的类型和大小的声明
    • 内置的对象类型 – python提供既有弹性又易于使用的数据结构,如list(列表)、dictionary(字典)、string(字符串)作为语言的基本部分。
    • 内置工具 – python提供了功能强大的、标准的操作来处理对象类型,如concatenation(合并)、slice(分片)、sort(排序)、map(映射)等等。
    • 库软件 – python收集了很多预编码的库工具,如正则表达式、网络、对象的持续性等等
    • 第三方软件 – 各种开发者提供的免费预编码工具、如COM、图像、CORBA ORB、XML等等
    • 自动内存管理 – python自动跟踪底层内存的细节,自动分配、回收不在使用的对象,并尽可能的根据需要增加或缩小使用内存。
    • 大型程序的支持 – python包括了模块、类、扩展程序等这样的工具,以便用来创建大型程序。

 

  •     python是可混合的
    python可以十分轻易的与其他语言写成的组件“粘合”在一起。
    如python可以通过C/C++/Java等写成的组件进行扩展,也可以嵌入到C/C++中去。

 

  •    python 易于使用
    python兼顾了快速开发周期和语言简单性。开发周期短,且有简单、缜密的语法和功能强大的高级语言内置工具。

 

python的实用性


python具有广泛的应用,常见于

  1.  系统管理工具
  2.  图形用户接口
  3.  组件集成
  4.  快速原型
  5.  Internet脚本
  6.  数字编程
  7.  数据库编程
  8.  图像处理
  9.  人工智能
  10. 分布式对象
  11. 其他

 

如何运行Python


  •  交互式(命令行)
    直接命令行写输入python进入解释器,然后在提示符>>>后直接输入python语句,即可显示结果,
    输入exit()或者按Ctrl+D (Windows使用Ctrl+Z) 退出解释器。

 

  • 作为Python模块文件
    将python代码保存到.py 结尾的文本文件,然后使用命令来执行该文件:python <文件名> [参数1 参数2 参数3 …]
    文件中以 sys.argv 来读取后面带的参数。

 

  • 作为Unix文件型脚本
    在Unix、Linux或其他类Unix的系统上,可以将python代码变为类似shell的可执行程序(脚本、可执行文件)
    需要两个条件
    a: 特殊的第一行,内容为: #!python_path(解释器在机器上的位置)
    b: 该文件拥有可执行权限: 可以使用 chmod +x 文件名,为文件赋予可执行权限
    直接执行该文件,既可以完成python语句的执行。

 

  • 在其他系统中嵌入
    比如Python/C集成:在C程序中调用python的运行时api

    
    #include &lt;python.h&gt;
    ...
    Py_Initialize();
    PyRun_SimpleString("x=example+string");
    
    
  •  特定平台的启动方法
    参考 https://www.python.org/downloads/ 的说明

 

 

 

 

C指针操作-函数返回数组

最近开始在https://leetcode-cn.com里面练习算法。
首先来第一题简单的:

    给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
    你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
    给定 nums = [2, 7, 11, 15], target = 9
    因为 nums[0] + nums[1] = 2 + 7 = 9
    所以返回 [0, 1]

给定的函数定义为
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* twoSum(int* nums, int numsSize, int target) {
    ... ...
}

于是用C语言完成了该题:

#include "stdio.h"
#include "stdlib.h"

int* twoSum(int* nums, int numsSize, int target) {
    int index1,index2;
    int *result ;
    int *temp;
    
    result = (int*) malloc ( sizeof (int) *2 );
    
    for ( index1 = 0; index1 < numsSize; index1++ )
    {
        for( index2 = index1+1; index2 < numsSize ; index2++ )
        {
            if( target == nums[index1] + nums[index2] )
            {
                temp = result;
                *temp = index1 ;
                
                temp++ ;
                *temp = index2 ;
                
                return result;
            }
        }
    }
    return result;
}

int main(void)
{
	int *array;
	int array_length;
	int *temp;
	int array_index = 0;
	int *result;
	int target = 0;
	
	printf("please input target: ");
	scanf("%d",&target) ;
	
	printf("please input array length: ");
	scanf("%d",&array_length) ;
	
	array = (int *) malloc ( sizeof(int *) * array_length );
	temp = array;
	
	for(array_index = 0; array_index < array_length ; array_index++,temp++)
	{
		printf("\nplease input array[%d]:",array_index);
		scanf("%d",temp);		
	} 
	
	printf("\narray[%d]:",array_length);
	
	for(array_index = 0; array_index < array_length ; array_index++ ,temp++ )
	{
		printf(" %d :",*(array+array_index));	
		
	} 
	
	result = twoSum(array,array_length,target);
	
	if( *(array + *result) + *(array + *(result+1)) != target)
	{
		printf("\n not found");
	}
	else
	{
		printf("\nfind array[%d](%d) + array[%d](%d)  = %d ",
			*result, *(array + *result),
			*(result+1), *(array + *(result+1)),target);
	}
	free(array);
	free(result);
	return 0;
}

运行结果为

please input target: 15
please input array length: 6

please input array[0]:5

please input array[1]:1

please input array[2]:9

please input array[3]:6

please input array[4]:8

please input array[5]:20

array[6]: 5 : 1 : 9 : 6 : 8 : 20 :
find array[2](9) + array[3](6)  = 15 请按任意键继续. . .

考虑之后,觉得函数那样定义有问题:在函数体内malloc,在函数体外free,如果在外面调用之后,忘记free了,就很容易造成内存泄露。

于是进行了改版


#include "stdio.h"
#include "stdlib.h"

int twoSum_v2(int* result, int* nums, int numsSize, int target) 
{
    int index1,index2;
    int *temp;
    for ( index1 = 0; index1 < numsSize; index1++ )
    {
    	for( index2 = index1+1; index2 < numsSize ; index2++ )
        {
        	if( target == (nums[index1] + nums[index2]) )
            {
                temp = result;
                *temp = index1 ;
                
                temp++ ;
                *temp = index2 ;
                 
				return 1;
            }
        }
    }
    return 0;
}
 
int main(void)
{
	int *array;
	int array_length;
	int *temp;
	int array_index = 0;
	int *result;
	int target = 0;
	int found ;
	
	printf("please input target: ");
	scanf("%d",&target) ;
	
	printf("please input array length: ");
	scanf("%d",&array_length) ;
	
	result = (int *) malloc ( sizeof(int *) * 2 );
	array = (int *) malloc ( sizeof(int *) * array_length );
	temp = array;
	
	for(array_index = 0; array_index < array_length ; array_index++,temp++)
	{
		printf("\nplease input array[%d]:",array_index);
		scanf("%d",temp);		
	} 
	
	printf("\narray[%d]:",array_length);
	
	for(array_index = 0; array_index < array_length ; array_index++ ,temp++ )
	{
		printf(" %d ,",*(array+array_index));		
	} 
	
	found = twoSum_v2(result,array,array_length,target);
	if( 0 == found )
	{
		printf("\n not found");
	}	
	else
	{
		printf("\nfind array[%d](%d) + array[%d](%d)  = %d ",
			*result, *(array + *result),
			*(result+1), *(array + *(result+1)),target);		
	}
	
	free(array);
	free(result);
	return 0;
}

测试结果1:

please input target: 25
please input array length: 3

please input array[0]:0

please input array[1]:26

please input array[2]:4

array[3]: 0 , 26 , 4 ,
 not found请按任意键继续. . .

测试结果2:

please input target: 33
please input array length: 5

please input array[0]:20

please input array[1]:15

please input array[2]:23

please input array[3]:7

please input array[4]:10

array[5]: 20 , 15 , 23 , 7 , 10 ,
find array[2](23) + array[4](10)  = 33 请按任意键继续. . .

另外对于结果的输出可以换成下面的,打印结果是一样的

	/* printf("\nfind array[%d](%d) + array[%d](%d)  = %d ",
			*result, *(array + *result),
			*(result+1), *(array + *(result+1)),target);		
		*/
	printf("\nfind array[%d](%d) + array[%d](%d)  = %d ",
			result[0], array[result[0]],
			result[1], array[result[1]],target);

小结:
这个题目在面试用应该会经常用到,主要知识点是:
1. 函数返回的数组必须是一个已分配的地址
2. malloc与free要成对
3. 使用malloc动态分配的数组,可以用下标方式访问。