当前位置:首页 » 编程语言 » stdargc语言

stdargc语言

发布时间: 2022-08-10 17:06:26

① 在c语言里标准函数存放在什么文件中

  1. C语言标准库函数存放在头文件当中,使用相应函数时需要用include引用先关头文件。

    C语言程序设计里,C 标准函数(C Standard library)是所有目前符合标准的头文件(head
    file)的集合,以及常用的函数库实现程序,例如 I/O输入输出和字串符控制。不像 COBOL、Forrian和 PL/I等编程语言,在 C
    语言的工作任务里不会包含嵌入的关键字,所以几乎所有的 C 语言程序都是由标准函数库的函数来创建的。

  2. 下面列出C89及C99中C语言标准函数库的头文件。

    C89中标准的头文件
    <assert.h> 设定断言点
    <ctype.h> 字符处理
    <errno.h> 错误报告
    <float.h> 定义与实现相关的浮点值勤
    <limits.h> 定义与实现相关的各种极限值
    <locale.h> 支持函数setlocale()
    <math.h> 数学函数库使用的各种定义
    <setjmp.h> 支持非局部跳转
    <signal.h> 定义信号值
    <stdarg.h> 支持可变长度的变元列表
    <stddef.h> 定义常用常数
    <stdio.h> 支持文件输入和输出
    <stdlib.h> 其他各种声明
    <string.h> 支持串函数
    <time.h> 支持系统时间函数
    C99新增的头文件和库
    <complex.h> 支持复数算法
    <fenv.h> 给出对浮点状态标记和浮点环境的其他方面的访问
    <inttypes.h> 定义标准的、可移植的整型类型集合。也支持处理最大宽度整数的函数
    <iso646.h> 首先在此1995年第一次修订时引进,用于定义对应各种运算符的宏
    <stdbool.h> 支持布尔数据类型类型。定义宏bool,以便兼容于C++
    <stdint.h> 定义标准的、可移植的整型类型集合。该文件包含在<inttypes.h>中
    <tgmath.h> 定义一般类型的浮点宏
    <wchar.h> 首先在1995年第一次修订时引进,用于支持多字节和宽字节函数
    <wctype.h> 首先在1995年第一次修订时引进,用于支持多字节和宽字节分类函数

② #include <stdarg.h>这个头文件是什么意思

stdarg.h是C语言中C标准函式库的标头档,stdarg是由standard(标准) arguments(参数)简化而来,主要目的为让函式能够接收不定量参数

③ stdarg.h的介绍

stdarg.h是C语言中C标准函数库的头文件,stdarg是由standard(标准) arguments(参数)简化而来,主要目的为让函数能够接收可变参数。C++的cstdarg头文件中也提供这样的功能;虽然与C的头文件是兼容的,但是也有冲突存在。可变参数函数(Variadic functions)是stdarg.h内容典型的应用,虽然也可以使用在其他由可变参数函数调用的函数(例如,vprintf)。

④ C语言头文件有哪些

字符处理函数
本类别函数用于对单个字符进行处理,包括字符的类别测试和字符的大小写转换

头文件 ctype.h

函数列表<>
函数类别 函数用途 详细说明
字符测试 是否字母和数字 isalnum
是否字母 isalpha
是否控制字符 iscntrl
是否数字 isdigit
是否可显示字符(除空格外) isgraph
是否可显示字符(包括空格) isprint
是否既不是空格,又不是字母和数字的可显示字符 ispunct
是否空格 isspace
是否大写字母 isupper
是否16进制数字(0-9,A-F)字符 isxdigit
字符大小写转换函数 转换为大写字母 toupper
转换为小写字母 tolower

地区化
本类别的函数用于处理不同国家的语言差异。

头文件 local.h

函数列表
函数类别 函数用途 详细说明
地区控制 地区设置 setlocale
数字格式约定查询 国家的货币、日期、时间等的格式转换 localeconv

数学函数
本分类给出了各种数学计算函数,必须提醒的是ANSI C标准中的数据格式并不符合IEEE754标准,一些C语言编译器却遵循IEEE754(例如frinklin C51)

头文件 math.h

函数列表
函数类别 函数用途 详细说明
错误条件处理 定义域错误(函数的输入参数值不在规定的范围内)
值域错误(函数的返回值不在规定的范围内)
三角函数 反余弦 acos
反正弦 asin
反正切 atan
反正切2 atan2
余弦 cos
正弦 sin
正切 tan
双曲函数 双曲余弦 cosh
双曲正弦 sinh
双曲正切 tanh
指数和对数 指数函数 exp
指数分解函数 frexp
乘积指数函数 fdexp
自然对数 log
以10为底的对数 log10
浮点数分解函数 modf
幂函数 幂函数 pow
平方根函数 sqrt
整数截断,绝对值和求余数函数 求下限接近整数 ceil
绝对值 fabs
求上限接近整数 floor
求余数 fmod

本分类函数用于实现在不同底函数之间直接跳转代码。 头文件 setjmp.h io.h

函数列表
函数类别 函数用途 详细说明
保存调用环境 setjmp
恢复调用环境 longjmp

信号处理
该分类函数用于处理那些在程序执行过程中发生例外的情况。

头文件 signal.h

函数列表
函数类别 函数用途 详细说明
指定信号处理函数 signal
发送信号 raise

可变参数处理
本类函数用于实现诸如printf,scanf等参数数量可变底函数。

头文件 stdarg.h

函数列表
函数类别 函数用途 详细说明
可变参数访问宏 可变参数开始宏 va_start
可变参数结束宏 va_end
可变参数访问宏 访问下一个可变参数宏 va_arg

输入输出函数
该分类用于处理包括文件、控制台等各种输入输出设备,各种函数以“流”的方式实现

头文件 stdio.h

函数列表
函数类别 函数用途 详细说明
文件操作
删除文件 remove
修改文件名称 rename
生成临时文件名称 tmpfile
得到临时文件路径 tmpnam
文件访问 关闭文件 fclose
刷新缓冲区 fflush
打开文件 fopen
将已存在的流指针和新文件连接 freopen
设置磁盘缓冲区 setbuf
设置磁盘缓冲区 setvbuf
格式化输入与输出函数 格式输出 fprintf
格式输入 fscanf
格式输出(控制台) printf
格式输入(控制台) scanf
格式输出到缓冲区 sprintf
从缓冲区中按格式输入 sscanf
格式化输出 vfprintf
格式化输出 vprintf
格式化输出 vsprintf
字符输入输出函数 输入一个字符 fgetc
字符串输入 fgets
字符输出 fputc
字符串输出 fputs
字符输入(控制台) getc
字符输入(控制台) getchar
字符串输入(控制台) gets
字符输出(控制台) putc
字符输出(控制台) putchar
字符串输出(控制台) puts
字符输出到流的头部 ungetc
直接输入输出 直接流读操作 fread
直接流写操作 fwrite
文件定位函数 得到文件位置 fgetpos
文件位置移动 fseek
文件位置设置 fsetpos
得到文件位置 ftell
文件位置复零位 remind
错误处理函数 错误清除 clearerr
文件结尾判断 feof
文件错误检测 ferror
得到错误提示字符串 perror

实用工具函数
本分类给出了一些函数无法按以上分类,但又是编程所必须要的。

头文件 stdlib.h

函数列表
函数类别 函数用途 详细说明
字符串转换函数 字符串转换为整数 atoi
字符串转换为长整数 atol
字符串转换为浮点数 strtod
字符串转换为长整数 strtol
字符串转换为无符号长整型 strtoul
伪随机序列产生函数 产生随机数 rand
设置随机函数的起动数值 srand
存储管理函数 分配存储器 calloc
释放存储器 free
存储器分配 malloc
重新分配存储器 realloc
环境通信 中止程序 abort
退出程序执行,并清除环境变量 atexit
退出程序执行 exit
读取环境参数 getenv
程序挂起,临时执行一个其他程序 system
搜索和排序工具 二分查找(数据必须已排序) bsearch
快速排序 qsort
整数运算函数 求绝对值 abs
div
得到除法运算底商和余数
求长整形底绝对值 labs
求长整形除法的商和余数 ldiv
多字节字符函数 得到多字节字符的字节数 mblen
得到多字节字符的字节数 mbtowc
多字节字符转换 wctomb
多字节字符的字符串操作 将多字节串转换为整数数组 mbstowcs
将多字节串转换为字符数组 mcstowbs

字符串处理
本分类的函数用于对字符串进行合并、比较等操作

头文件 string.h

函数列表
函数类别 函数用途 详细说明
字符串拷贝 块拷贝(目的和源存储区不可重叠) memcpy
块拷贝(目的和源存储区可重叠) memmove
串拷贝 strcpy
按长度的串拷贝 strncpy
字符串连接函数 串连接 strcat
按长度连接字符串 strncat
串比较函数 块比较 memcmp
字符串比较 strcmp
字符串比较(用于非英文字符) strcoll
按长度对字符串比较 strncmp
字符串转换 strxfrm
字符与字符串查找 字符查找 memchr
字符查找 strchr
字符串查找 strcspn
字符串查找 strpbrk
字符串查找 strspn
字符串查找 strstr
字符串分解 strtok
杂类函数 字符串设置 memset
错误字符串映射 strerror
求字符串长度 strlen

日期和时间函数
本类别给出时间和日期处理函数

头文件 time.h

函数列表
函数类别 函数用途 详细说明
时间操作函数 得到处理器时间 clock
得到时间差 difftime
设置时间 mktime
得到时间 time
时间转换函数 得到以ASCII码表示的时间 asctime
得到字符串表示的时间 ctime
得到指定格式的时间 strftime

函数库未来的发展方向
本部分用于说明各类别函数库在将来如何发展。

序号 库类别 头文件 详细说明
1 错误处理 errno.h
2 字符处理 ctype.h
3 地区化 local.h
4 数学函数 math.h
5 信号处理 signal.h
6 输入输出 stdio.h
7 实用工具程序 stdlib.h
8 字符串处理 string.h

⑤ c语言中的void printlog(char *format,...)这是什么意思

是可变参数,是c的一个语法现象,我在电脑上保存的一些资料,希望对你有用。
一、什么是可变参数
我们在C语言编程中有时会遇到一些参数个数可变的函数,例如printf()函数,其函数原型为:
int printf( const char* format, ...);
它除了有一个参数format固定以外,后面跟的参数的个数和类型是可变的(用三个点"…"做参数占位符),实际调用时可以有以下的形式:
printf("%d",i);
printf("%s",s);
printf("the number is %d ,string is:%s", i, s);
以上这些东西已为大家所熟悉。但是究竟如何写可变参数的C函数以及这些可变参数的函数编译器是如何实现,这个问题却一直困扰了我好久。本文就这个问题进行一些探讨,希望能对大家有些帮助.

二、可变参数在编译器中的处理
我们知道va_start,va_arg,va_end是在stdarg.h中被定义成宏的, 由于1)硬件平台的不同 2)编译器的不同,所以定义的宏也有所不同,下面看一下VC++6.0中stdarg.h里的代码(文件的路径为VC安装目录下的\vc98\include\stdarg.h)
typedef char * va_list;
#define _INTSIZEOF(n) ((sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define va_end(ap) ( ap = (va_list)0 )

下面我们解释这些代码的含义:

1、首先把va_list被定义成char*,这是因为在我们目前所用的PC机上,字符指针类型可以用来存储内存单元地址。而在有的机器上va_list是被定义成void*的

2、定义_INTSIZEOF(n)主要是为了某些需要内存的对齐的系统.这个宏的目的是为了得到最后一个固定参数的实际内存大小。在我的机器上直接用sizeof运算符来代替,对程序的运行结构也没有影响。(后文将看到我自己的实现)。

3、va_start的定义为 &v+_INTSIZEOF(v) ,这里&v是最后一个固定参数的起始地址,再加上其实际占用大小后,就得到了第一个可变参数的起始内存地址。所以我们运行va_start(ap, v)以后,ap指向第一个可变参数在的内存地址,有了这个地址,以后的事情就简单了。

这里要知道两个事情:
⑴在intel+windows的机器上,函数栈的方向是向下的,栈顶指针的内存地址低于栈底指针,所以先进栈的数据是存放在内存的高地址处。
(2)在VC等绝大多数C编译器中,默认情况下,参数进栈的顺序是由右向左的,因此,参数进栈以后的内存模型如下图所示:最后一个固定参数的地址位于第一个可变参数之下,并且是连续存储的。
|--------------------------|
| 最后一个可变参数 | ->高内存地址处
|--------------------------|
|--------------------------|
| 第N个可变参数 | ->va_arg(arg_ptr,int)后arg_ptr所指的地方,
| | 即第N个可变参数的地址。
|--------------- |
|--------------------------|
| 第一个可变参数 | ->va_start(arg_ptr,start)后arg_ptr所指的地方
| | 即第一个可变参数的地址
|--------------- |
|------------------------ --|
| |
| 最后一个固定参数 | -> start的起始地址
|-------------- -| .................
|-------------------------- |
| |
|--------------- | -> 低内存地址处

(4) va_arg():有了va_start的良好基础,我们取得了第一个可变参数的地址,在va_arg()里的任务就是根据指定的参数类型取得本参数的值,并且把指针调到下一个参数的起始地址。
因此,现在再来看va_arg()的实现就应该心中有数了:
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
这个宏做了两个事情,
①用用户输入的类型名对参数地址进行强制类型转换,得到用户所需要的值
②计算出本参数的实际大小,将指针调到本参数的结尾,也就是下一个参数的首地址,以便后续处理。

(5)va_end宏的解释:x86平台定义为ap=(char*)0;使ap不再 指向堆栈,而是跟NULL一样.有些直接定义为((void*)0),这样编译器不会为va_end产生代码,例如gcc在linux的x86平台就是这样定义的. 在这里大家要注意一个问题:由于参数的地址用于va_start宏,所以参数不能声明为寄存器变量或作为函数或数组类型. 关于va_start, va_arg, va_end的描述就是这些了,我们要注意的 是不同的操作系统和硬件平台的定义有些不同,但原理却是相似的.

三、可变参数在编程中要注意的问题
因为va_start, va_arg, va_end等定义成宏,所以它显得很愚蠢, 可变参数的类型和个数完全在该函数中由程序代码控制,它并不能智能 地识别不同参数的个数和类型. 有人会问:那么printf中不是实现了智能识别参数吗?那是因为函数 printf是从固定参数format字符串来分析出参数的类型,再调用va_arg 的来获取可变参数的.也就是说,你想实现智能识别可变参数的话是要通过在自己的程序里作判断来实现的. 例如,在C的经典教材《the c programming language》的7.3节中就给出了一个printf的可能实现方式,由于篇幅原因这里不再叙述。

四、小结:
1、标准C库的中的三个宏的作用只是用来确定可变参数列表中每个参数的内存地址,编译器是不知道参数的实际数目的。
2、在实际应用的代码中,程序员必须自己考虑确定参数数目的办法,如
⑴在固定参数中设标志-- printf函数就是用这个办法。后面也有例子。
⑵在预先设定一个特殊的结束标记,就是说多输入一个可变参数,调用时要将最后一个可变参数的值设置成这个特殊的值,在函数体中根据这个值判断是否达到参数的结尾。本文前面的代码就是采用这个办法.
无论采用哪种办法,程序员都应该在文档中告诉调用者自己的约定。
3、实现可变参数的要点就是想办法取得每个参数的地址,取得地址的办法由以下几个因素决定:
①函数栈的生长方向
②参数的入栈顺序
③CPU的对齐方式
④内存地址的表达方式
结合源代码,我们可以看出va_list的实现是由④决定的,_INTSIZEOF(n)的引入则是由③决定的,他和①②又一起决定了va_start的实现,最后va_end的存在则是良好编程风格的体现,将不再使用的指针设为NULL,这样可以防止以后的误操作。
4、取得地址后,再结合参数的类型,程序员就可以正确的处理参数了。理解了以上要点,相信稍有经验的读者就可以写出适合于自己机器的实现来。

⑥ C语言中,关于stdarg. h可变参数应用,函数省略号前最后一个参数是干啥用的它前面如果有其他

第一个作用是,用来确定被省略掉的参数起始地址,第二个作用通常是指定被省略掉参数的个数。

⑦ c语言标准函数库的stdarg.h

va_list
type of object holding context information
void va_start(va_list ap, lastarg);
Initialisation macro which must be called once before any unnamed argument is accessed. Stores context information in ap. lastarg is the last named parameter of the function.
type va_arg(va_list ap, type);
Yields value of the type (type) and value of the next unnamed argument.
voidva_end(va_list ap);
Termination macro which must be called once after argument processing and before exit from function.

⑧ c语言...用法

C语言变参技术
概述

C语言中有一种长度不确定的参数,形如:"…",它主要用在参数个数不确定的函数中,我们最容易想到的例子是printf函数。

原型:

int printf( const char *format [, argument]... );

使用例:

printf("Enjoy yourself everyday!\\n");

printf("The value is %d!\\n", value);

这种可变参数可以说是C语言一个比较难理解的部分,这里会由几个问题引发一些对它的分析。

注意:在C++中有函数重载(overload)可以用来区别不同函数参数的调用,但它还是不能表示任意数量的函数参数。

问题:printf的实现

请问,如何自己实现printf函数,如何处理其中的可变参数问题? 答案与分析:

在标准C语言中定义了一个头文件<stdarg.h>专门用来对付可变参数列表,它包含了一组宏,和一个va_list的typedef声明。一个典型实现如下:

typedef char* va_list;

#define va_start(list) list = (char*)&va_alist

#define va_end(list)

#define va_arg(list, mode)\\

((mode*) (list += sizeof(mode)))[-1]

自己实现printf:

#include <stdarg.h>

int printf(char* format, …)

{

va_list ap;

va_start(ap, format);

int n = vprintf(format, ap);

va_end(ap);

return n;

}

问题:运行时才确定的参数

有没有办法写一个函数,这个函数参数的具体形式可以在运行时才确定?

答案与分析:

目前没有"正规"的解决办法,不过独门偏方倒是有一个,因为有一个函数已经给我们做出了这方面的榜样,那就是main(),它的原型是:

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

函数的参数是argc和argv。

深入想一下,"只能在运行时确定参数形式",也就是说你没办法从声明中看到所接受的参数,也即是参数根本就没有固定的形式。常用的办法是你可以通过定
义一个void
*类型的参数,用它来指向实际的参数区,然后在函数中根据根据需要任意解释它们的含义。这就是main函数中argv的含义,而argc,则用来表明实际
的参数个数,这为我们使用提供了进一步的方便,当然,这个参数不是必需的。

虽然参数没有固定形式,但我们必然要在函数中解析参数的意义,因此,理所当然会有一个要求,就是调用者和被调者之间要对参数区内容的格式,大小,有效性等所有方面达成一致,否则南辕北辙各说各话就惨了。

问题:可变长参数的传递

有时候,需要编写一个函数,将它的可变长参数直接传递给另外的函数,请问,这个要求能否实现?

答案与分析:

目前,你尚无办法直接做到这一点,但是我们可以迂回前进,首先,我们定义被调用函数的参数为va_list类型,同时在调用函数中将可变长参数列表转换为va_list,这样就可以进行变长参数的传递了。看如下所示:

void subfunc (char *fmt, va_list argp)

{

...

arg = va_arg (fmt, argp); /* 从argp中逐一取出所要的参数 */

...

}

void mainfunc (char *fmt, ...)

{

va_list argp;

va_start (argp, fmt); /* 将可变长参数转换为va_list */

subfunc (fmt, argp); /* 将va_list传递给子函数 */

va_end (argp);

...

}

问题:可变长参数中类型为函数指针

我想使用va_arg来提取出可变长参数中类型为函数指针的参数,结果却总是不正确,为什么?

答案与分析:

这个与va_arg的实现有关。一个简单的、演示版的va_arg实现如下:

#define va_arg(argp, type) \\

(*(type *)(((argp) += sizeof(type)) - sizeof(type)))

其中,argp的类型是char *。

如果你想用va_arg从可变参数列表中提取出函数指针类型的参数,例如

int (*)(),则va_arg(argp, int (*)())被扩展为:

(*(int (*)() *)(((argp) += sizeof (int (*)())) -sizeof (int (*)())))

显然,(int (*)() *)是无意义的。

解决这个问题的办法是将函数指针用typedef定义成一个独立的数据类型,例如:

typedef int (*funcptr)();

这时候再调用va_arg(argp, funcptr)将被扩展为:

(* (funcptr *)(((argp) += sizeof (funcptr)) - sizeof (funcptr)))

这样就可以通过编译检查了。

问题:可变长参数的获取

有这样一个具有可变长参数的函数,其中有下列代码用来获取类型为float的实参:

va_arg (argp, float);

这样做可以吗?

答案与分析:

不可以。在可变长参数中,应用的是"加宽"原则。也就是float类型被扩展成double;char,
short被扩展成int。因此,如果你要去可变长参数列表中原来为float类型的参数,需要用va_arg(argp,
double)。对char和short类型的则用va_arg(argp, int)。

问题:定义可变长参数的一个限制

为什么我的编译器不允许我定义如下的函数,也就是可变长参数,但是没有任何的固定参数?

int f (...)

{

...

}

答案与分析:

不可以。这是ANSI C 所要求的,你至少得定义一个固定参数。

这个参数将被传递给va_start(),然后用va_arg()和va_end()来确定所有实际调用时可变长参数的类型和值。

⑨ 【100分高分】如何用C语言画齿轮

下面为C语言画凸轮形状程序

#include"stdarg.h"
#include"stdio.h"
#include"graphics.h"
#include"math.h"
#define H 60 /*最大行程*/
#define W 7.5 /*角速度(度/秒)*/
#define K 5 /*循环步骤*/
#define A1 45 /*各段角度*/
#define A2 210
#define A3 240
#define A4 360
#define X0 400 /*凸轮转轴坐标*/
#define Y0 280
#define pi 3.14159
#define t pi/180 /*度--》弧度*/

main() /*主程序*/
{float e,ro,rr,p,so,dx,dy,st,ct,C3,C4,C5; /*变量说明*/
float s[200],ds[200],dv[200],da[200],x[200],y[200],xp[200],yp[200];
int a=DETECT,b,i=0,w=0;
/*----------------------------------------*/
initgraph(&a,&b,"");
e=10; /*偏心距*/
ro=90; /*基圆半径*/
rr=20; /*滚子半径*/
so=sqrt(ro*ro-e*e);
/*-------------------------------------------*/
C3=(300-5*(A1/W))/pow((pi/4),3);/*五次方高斯方和三个参数*/
C4=((26.25(A1/W))-1350)/(pow(pi/4),4);/*五次方高斯方和三个参数*/
C5=(180-3.75(A1/W))/pow((pi/4),5);/*五次方高斯方和三个参数*/

for(p=0;p<=A4;p+=K)
{if(p<=A1)/*第一段:等加速等减速运动*/
{s[i]=C3*pow(p,3)+C4*pow(p,4)+C5*pow(p,5);
ds[i]=3*C3*W*pow(p,2)+4*C4*W*pow(p,3)+5*C5*pow(p,4);
dv[i]=6*C3*W*W*p+12*C4*W*W*pow(p,2)+20*C5*w*w*pow(p,4);
}
if(p>A1&&p<=A2)/*第二段:直线运动*/
{s[i]=30+27.5*(p-A1)/(A2-A1);
ds[i]=27.5*W/(A2-A1);
dv[i]=0;
}
if(p>A2&&p<=A3)/*第三段:正弦加速的减速半段(前三段为推程)*/
{s[i]=57.5+5*((p-A2)/2/(A3-A2)-sin(pi*(p-A2)/(A3-A2))/(2*pi));
ds[i]=5*W(1-cos(pi*(p-A2)/(A3-A2))/2/(A3-A2));
dv[i]=5*pow(W,2)*2*pi*sin(pi*(p-A2)/(A3-A2))/4/(A3-A2)/(A3-A2);
}
if(p>A3)/*第四段:正弦加速(回程)*/
{s[i]=H*(1-(p-A3)/120+sin(pi*(p-A3)/60)/2/pi);
ds[i]=H*W/(A4-A3)*(cos(2*pi*(p-A3)/(A4-A3))-1);
dv[i]=-2*pi*H*W*W/pow((A4-A3),2)*sin(2*pi*(p-A3)/(A4-A3));
}

da[i]=(atan((ds[i]/(W*t)-e)/(so+s[i])))/(t); /*压力角*/
x[i]=X0+(so+s[i])*sin(p*t)+e*cos(p*t); /*理论廓线坐标*/
y[i]=Y0+(so+s[i])*cos(p*t)-e*sin(p*t);
dx=(ds[i]-e)*sin(p*t)+(so+s[i])*cos(p*t); /*x微分*/
dy=(ds[i]-e)*cos(p*t)-(so+s[i])*sin(p*t); /*y微分*/
st=dy/sqrt(dx*dx+dy*dy); /*sin值*/
ct=dx/sqrt(dx*dx+dy*dy); /*cos值*/
xp[i]=x[i]+rr*st; /*外实际廓线坐标*/
yp[i]=y[i]-rr*ct;
i++;
}
/*----------------------------------------------------------*/
circle(X0,Y0,ro); /*画基圆*/
circle(X0,Y0,e); /*画偏距圆*/
for(w=0;w<A4/K; w++)
{ line(x[w],y[w],x[w+1],y[w+1]); /*画理论廓线*/
line(xp[w],yp[w],xp[w+1],yp[w+1]); /*画外实际廓线*/
circle(x[w],y[w],rr); /*画滚子*/
}
circle(x[0],y[0],rr); /*滚子*/
circle(x[0],y[0],5); /*滚轴*/
circle(x[A1/K],y[A1/K],5); /*滚轴*/
circle(x[A2/K],y[A2/K],5);/*滚轴*/
circle(x[A3/K],y[A3/K],5);/*滚轴*/
circle(x[A4/K],y[A4/K],5);/*滚轴*/
line(X0+e,Y0,x[0],y[0]+50);/*3条导路方向线*/
line(X0+e*cos(60*t),Y0-e*sin(60*t),x[60/K],y[60/K]);
line(X0+e*cos(240*t),Y0-e*sin(240*t),x[240/K],y[240/K]);
arc(X0,Y0,0,50,100);/*凸轮转向*/
line(X0+100,Y0,X0+100-5,Y0-15);/*转向箭头*/
line(X0+100,Y0,X0+100+3,Y0-15);/*转向箭头*/
getch();
/*----------------------运动线图---------------------------------------*/
line(0,180,360,180);
line(0,240,360,240);
line(0,360,360,360);
line(0,0,0,480);
line(A1,0,A1,480);
line(A3,0,A3,480);
line(360,0,360,480);
for(w=0;w<A4/K;w++)
{line(w*K,180-s[w],(w+1)*K,180-s[w+1]);
line(w*K,240-ds[w]*4,(w+1)*K,240-ds[w+1]*4);
line(w*K,360-dv[w]*10,(w+1)*K,360-dv[w+1]*10);
getch();
/*--------------------------------数据列表--------------------------------*/
printf(" p s ds dv a \n");
printf("=============================\n");
for(w=0;w<=A4/K;w=w+3)
{printf("%4d%10.2f%8.2f%8.2f%10.2f\n",w*K,s[w],ds[w],dv[w],da[w]);}
getch();

}
}

热点内容
微信视频如何重新缓存 发布:2025-01-21 04:44:41 浏览:879
pdf压缩文件大小 发布:2025-01-21 04:40:24 浏览:798
linux解压文件到指定 发布:2025-01-21 04:38:36 浏览:874
自己做的安卓app怎么下载 发布:2025-01-21 04:35:07 浏览:163
机顶盒加密频道 发布:2025-01-21 04:26:48 浏览:318
腾讯应用加密 发布:2025-01-21 04:24:38 浏览:988
无法访问f 发布:2025-01-21 04:24:36 浏览:539
sql实时 发布:2025-01-21 04:24:27 浏览:998
怎么在linux服务器上配ip地址 发布:2025-01-21 04:22:10 浏览:251
咖搭姆编程 发布:2025-01-21 04:19:45 浏览:674