胡乱学习C语言的一点笔记(不定时更新)

1.生成随机数

C语言中自带的函数 rand() srand() ,包含在头文件 <stdlib.h> 当中。

(1)rand() 函数

返回一个范围在0-RAND_MAX之间的随机数。

注意:该函数生成的随机数是一次性的,第二次运行时结果仍然一样。

这是因为 rand() 函数是根据“种子”来产生随机数的,在调用时,“种子”默认为1,所以产生的数相同。

(2)srand() 函数

srand() 函数用来设置 rand() 产生随机数所需要的“种子”,通过srand()函数设置“种子”,可以使 rand() 产生的“随机数”真正达到随机。

一般配合 time() 函数(在头文件 <time.h> 中)来动态生成“种子”。time(0) 返回当前系统时间,time(NULL) 返回当前日历时间,都是从1970年1月1日0时0分0秒到此时的秒数。目前测试来看(更改了计算机显示时间),两者返回的值相等。

得到一般生成随机数的用法:

srand(time(NULL));            
printf("%d\n",rand());

参考:https://blog.csdn.net/beyond0824/article/details/6009908

 


2.并行程序中计算时间

一般计算时间可能会使用 clock() 函数(包含在 <time.h> 中),它得到的是处理器时钟所使用的时间,因此在并行程序当中,它将得到所有进程(线程)计算所花费的时间之和,与我们想要得到的相差甚远。

(1)gettimeofday() 函数

返回当前精确时间(从1970年1月1日0时0分0秒到此时的时间),包含在 <sys/time.h> 中:

            #include <sys/time.h>

            int gettimeofday(struct timeval *tv, struct timezone *tz);

其参数 tv 是保存获取时间结果的结构体,参数 tz 用于保存时区结果:

            struct timezone{

            int tz_minuteswest;        /*格林威治时间往西方的时差*/

            int tz_dsttime;                /*DST 时间的修正方式*/

            }

timezone 参数若不使用则传入 NULL 即可,一般用 NULL

而结构体 timeval 的定义为:

            struct timeval{

            long int tv_sec;             // 秒数

            long int tv_usec;           // 微秒数

            }

一般过程为:

struct timeval start_t, end_t;       //声明结构体变量
gettimeofday(&start_t, NULL);        //记录开始的时间            
{待计算函数过程}            
gettimeofday(&end_t, NULL);          //记录结束的时间            
double total_t_sec, total_t_usec, total_t;                    //变量声明            
total_t_sec = (double)(end_t.tv_sec - start_t.tv_sec);        //计算秒数            
total_t_usec = (double)(end_t.tv_usec - start_t.tv_usec);     //计算微秒数            
total_t = total_t_sec + total_t_usec / 1000000.0;             //计算总时间

 

参考:https://baike.baidu.com/item/gettimeofday/3369586?fr=aladdin


3.main()函数的传参

#include <stdio.h>

int main(int argc, char *argv[]){
    printf("可执行程序为 %s,传递的参数个数为 %d,输出:\n%s\n",argv[0],argc,argv[1]);
    return 0;
}

agrc为参数个数,argv是字符串数组,下标从0开始,第一个argv[0]存放的是可执行程序的文件名字,然后一次存放传入的参数,例如上面的代码(hello.c):

1.首先通过gcc编译:gcc -o hello.out hello.c得到可执行文件hello.out。

2.在运行时通过传入参数:./hello.out hello,world其中空格后面接参数,多个参数通过空格分开。

最后得到结果


4.引入其他程序函数

首先,假设有两个源文件和一个头文件,分别命名为main.c fun.c fun.h,表示主函数main()所在文件,函数所在文件,函数声明所在文件。

1.fun.h

#ifndef #endif的作用是防止某一个源文件中两次包含同一个头文件

#define 定义该头文件的标识

#ifndef FUN_H
#define FUN_H

int fun(int a);

#endif

2.fun.c

该包含函数的源文件中必须加入#include"fun.h"

#include<stdio.h>

#include"fun.h"

int fun(int a){
    printf("%d\n",a);
    return 0;
}

3.main.c

在头文件中加入#include"fun.h"

用gcc编译时,需要链接到调用函数对应的.c文件,如:gcc main.c fun.c -o main.out

#include<stdio.h>

#include"fun.h"

int main(){
    int a = 5;
    fun(a);
    return 0;
}

4.strtol()函数

该函数包含在头文件 stdlib.h 中,作用为把参数 str 所指向的字符串根据给定的 base 转换为一个长整数。

long strtol(
    const char *str,    //输入字符串,需要转换为长整数的字符串
    char **endptr,      //str中数值后的下一个字符,一般为(NULL)
    int basr            //基数,介于2-36之间,或者为0,表示输出的数的进制,如:base=10就为十进制
)            

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值