c语言常用小知识点总结1


#define 用来定义宏常量
格式:#define 标识符(大写字母) 常量
     #define  PI 3.14     //注意后面是不加;分号的
     常用字母的ASCII码 'a'=97   'A'=65  '0'=48
     
变量的输出
printf("参数",变量名);  字符串%s   char %c   int %d   float %float
printf("%10d",a);前面多加空格=10-变量的宽度
变量的输入: scanf("%参数",&变量名);

rand能够产生随机数,需要加头文件#include "windows.h"
格式: rand()%(大数-小数)+小数
       rand()%90+10 //产生10~100之间的随机数
如何确保每次运行所产生的随机数都不一样?
srand(unsigned)time(NULL);//这行代码只需要执行一次
time函数需要time.h头文件支持,#include "time.h"

do{
    语句体;
}while(条件);//这边的;一定要加

延迟函数sleep(1000);//延迟1秒
system("color 背景颜色");//使用#include "windows.h"
        文字颜色/背景颜色
以0开头的是八进制 0123=83(十进制)
以0x开头的是十六进制 0123=291(十进制)
一维字符数组的输入输出
整体输入: scanf("%s",数组名);//这里数组名就是地址,不需要&
           gets(数组名);//可以输入任何字符
区别:用scanf不能输入空格,他会把输入的空格当成'\0'
puts(数组名);          printf("%s",数组名);
gets(数组名);


//对字符串进行修改会用到#include"string.h"
strcpy函数  strcpy(串1,串2);//串1=串2,串2的长度不能大于串1的长度
strlen函数  strlen("字符串“);//
          n = strlen(数组名);//一个字符串含有字符个数,不包含'\0'
          n = strlen(一维字符型数组);
          m = sizeof(数组名);//测量数组长度
char a[100];
m = sizeof(a);//m=100
strcmp函数,用来比较两个字符串的大小
if(strcmp(字符串1,字符串2)>0)//串1>串2
if(strcmp(字符串1,字符串2)=0)//串1=串2
if(strcmp(字符串1,字符串2)<0)//串1<串2
if(strcmp(字符串1,字符串2))//串1不等于串2
分别取出两个字符串的每个字符来比较直到不等,然后由不等的字符来决定
strcat函数,用来连接两个字符串
strcat(串1,串2);//返回值为:串1+串2
strupr函数:把一个字符串中小写字母变成大写字母,其他不变
strlwr函数:把一个字符串中大写字母变成小写字母,其他不变


c语言中常见错误:
缺少;
缺少括号,小括号或花括号的不配对。
"/"与"\"的混用
单引号与双引号的混用
= 与 == 的混用   在条件表达式 if(  ==  )
逻辑& 和逻辑 |
短路&&和短路 ||
整除运算符  /
求余运算符 %
y+=1;改成  y+=(double)1/(i*i);
   或改成  y+=1.0/(i*i);
   
   输入一个数求他每一位上的数字和
   while(n)
   {
       s+=n%10;
       n=n/10;
   }
   
   
   int i,t=1;
   for(i=1;i<=y;i++)
   {
       t=t*x;
   }
   return  t;
   
   
  a?b:c

性质:

1、相当于条件判断语句

首先判断a是真是假,真就执行b,假就执行c,不会同时又判断a的真假的同时,又运算a,b的结果,最后再根据a的真假对a,b取舍,不会这样的。


2、结合方式从右向左分组运算

a=b>c?d:e-f?g-h:i+j

实际先运算e-f?g-h:i+j三目表达式的结果,然后再计算前面的三目表达式,最后赋值给a。

k=*p++  先把*p的值赋给k之后p+1
k=(*p)++  先把*p的值赋给k之后*p+1
k=++(*p)  先把*p的值加1,再把*p的值赋给k,*p+1是指针指向的变量+1
k=*(++p) 先把指针p+1,之后把*p的值赋给k

二叉树是一种非线性结构
满二叉树一定是完全二叉树
但完全二叉树并不一定是满二叉树
性质:
在二叉树的第k层上之多有2的k-1个节点(k>=1)
深度为m的二叉树至多有2的m次方-1个节点
对任何一刻二叉树度为0的节点(即叶子节点数)总比度为2的节点多一个
具有n个节点的完全二叉树的深度至少为(log 2为底  n )+1,其中(log 2为底  n )取它的整数部分

创建链表
STU *createlink(STU a[],int n)
{
    STU *head;
    int i;
    head=&a[0];//表示吧数组a中第一个元素给头指针
    for(i=0;i<n-1;i++)
    {
        a[i].next=&a[i+1];
    }
    a[n-1].next=NULL;
    return head;
}

head=createlink(a,8);
output(head);
输出链表:
void output(STU *head)
{
    STU *p = head;
    while(p != NULL)
    {
        printf("%s\t%s\n",p->id,p->name);
        p=p->next;
    }
}

链表的删除
STU *p=head,*front;
while(P! = NULL)
{
    if(strcmp(p->id,id) == 0)//找到要删除的节点
        break;
    front = p;//front总是跟着p的后面
    p = p->next;
}
if(p!=NULL)
{
    front->next = p->next;
}
retrun head;


询问循环程序
char answer;
do{
    //要循环的语句体
    printf("要继续吗?(y/n)");
    answer=getchar();//获取y/n
    getchar();//消化掉回车键,不然会退出循环
    
}while(answer == 'y');

数组的反转:
a[n]={..........};
int i,j,t;
for(i=0,j=n-1;i<j;i++,j--)
{
    t=a[i];
    a[i]=a[j];
    a[j]=t;
}
数组的插入:
for(i=0;i<9;i++)
{
    if(insert<s[i])
        break;
}
index=i;
for(i=9;i>=index+1;i--)
{
    a[i]=a[i-1];
}//产生空位
a[index]=insert;//插入值
怎样使用递归调用编程?
什么样的程序适合用递归方法:
这个程序的特征符合前项与后项有某种关系
已知某项的值(退出递归的条件)
如果要循环也可使用递归来代替换换

猜你喜欢

转载自blog.csdn.net/usstmiracle/article/details/81703419