精华内容
下载资源
问答
  • C语言编译的程序称为源程序,它以ASCII数值存放在文本文件中。2、每个C语言程序中main函数是有且只有一个。3、在函数中不可以再定义函数。4、算法的是一定要有输出的,他可以没有输入。5、break可用于循环结构和...

    81d8631ec2db843a18cd1006b1527310.png

    一、C语言基本知识点

    1、编译预处理不是C语言的一部分,不再运行时间。C语言编译的程序称为源程序,它以ASCII数值存放在文本文件中。

    2、每个C语言程序中main函数是有且只有一个。

    3、在函数中不可以再定义函数。

    4、算法的是一定要有输出的,他可以没有输入。

    5、break可用于循环结构和switch语句。

    6、逗号运算符的级别最低。

    7、强制类型转换: 一定是 (int)a 不是 int(a),注意类型上一定有括号的。

    注意(int)(a+b)和(int)a+b 的区别。 前是把a+b转型,后是把a转型再加b。

    8、 赋值表达式:表达式数值是最左边的数值,a=b=5;该表达式为5,常量不可以赋值。 自加、自减表达式:假设a=5,++a(是为6), a++(为5); 注意:==在C语言中表示等于,而=表示赋值。

    9、指针变量的本质是用来放地址,而一般的变量是放数值的。 int p 中 *p和p的差别: *p可以当做变量来用;的作用是取后面地址p里面的数值 p是当作地址来使用。 *p++ 和 (*p)++的之间的差别:改错题目中很重要 *p++是 地址会变化。 (*p)++ 是数值会要变化。 三名主义:(考试的重点)

    10、数组名:表示第一个元素的地址。数组名不可以自加,他是地址常量名。(考了很多次) 函数名:表示该函数的入口地址。 字符串常量名:表示第一个字符的地址。

    11、程序结构是三种: 顺序结构 , 循环结构(三个循环结构), 选择结构(if 和 switch)

    12、读程序都要从main()入口, 然后从最上面顺序往下读(碰到循环做循环,碰到选择做选择)。计算机的数据在电脑中保存是以 二进制的形式. 数据存放的位置就是 他的地址. bit是位 是指为0 或者1。 byte 是指字节, 一个字节 (B)= 八个位.

    二、数组的重要概念:

    对a[10]这个数组的讨论。

    1、a表示数组名,是第一个元素的地址,也就是元素a[10]的地址。

    2、a是地址常量,所以只要出现a++,或者是a=a+2赋值的都是错误的。 3、a是一维数组名,所以它是列指针,也就是说a+1是跳一列。 对a[3][3]的讨论。

    3、a表示数组名,是第一个元素的地址,也就是元素a[10]的地址。 2、a是地址常量,所以只要出现a++,或者是a=a+2赋值的都是错误的。 3、a是二维数组名,所以它是行指针,也就是说a+1是跳一行。

    4、a[0]、a[1]、a[2]也都是地址常量,不可以对它进行赋值操作,同时它们都是列指针,a[0]+1,a[1]+1,a[2]+1都是跳一列。

    5、注意a和a[0] 、a[1]、a[2]是不同的,它们的基类型是不同的。前者是一行元素,后三者是一列元素

    展开全文
  • 首先声明两类型的栈每个类型两个栈, 其中一个栈存储数值(dptr) 一个用来存临时的运算符的(sptr) 当遇到数值的时候 入栈(dptr) 当遇到 + - * \ ( 的运算符的时候入栈(sptr) 当遇到 ) 的时候 sptr出栈,出栈的...

    /*

    • 首先声明两类型的栈每个类型两个栈, 其中一个栈存储数值(dptr) 一个用来存临时的运算符的(sptr)
    • 当遇到数值的时候 入栈(dptr)
    • 当遇到 + - * \ ( 的运算符的时候入栈(sptr)
    • 当遇到 ) 的时候 sptr出栈,出栈的结果 入栈(dptr) 直到 出栈得出的结果是(  ’(‘ )
    • 每次数值入栈后 判断运算符的栈顶符号 如果是 * / 则 出栈出栈结果到(dptr)

      最后得到的结果就是 一个反向的 后缀表达式

    */

    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    
    typedef double DateType;
    typedef char SymbolType;
    
    typedef struct RpnNode{
      SymbolType symol;
      DateType data;
    
      struct RpnNode *next;
    }RpnNode, *RpnNodeList;
    
    typedef struct RpnNodeSave{
      RpnNodeList top;
      RpnNodeList base;
      int count;
    }RpnNodeSave;
    
    // 数据进站
    void Push(RpnNodeSave *L, DateType data){
      RpnNode *node, *top;
    
      top = L->top;
      node = (RpnNode *)malloc(sizeof(RpnNode));
      node->data = data;
      node->next = top;
    
      L->top = node;
      L->count++;
    }
    
    // 运算符进站
    void symbolPush(RpnNodeSave *L, SymbolType symol){
      RpnNode *node, *top;
      top = L->top;
    
      node = (RpnNode *)malloc(sizeof(RpnNode));
      node->symol = symol;
      node->next = top;
    
      L->top = node;
      L->count++;
    }
    
    // 数值出站
    void Pop(RpnNodeSave *ptr, DateType *e){
      RpnNode *node, *topnext;
    
      node = ptr->top;
      *e = node->data;
      topnext = node->next;
    
      free(node);
    
      ptr->top = topnext;
      ptr->count--;
    }
    
    // 运算符出站
    void symbolPop(RpnNodeSave *ptr, SymbolType *e){
      RpnNode *node, *topnext;
    
      node = ptr->top;
      *e = node->symol;
      topnext = node->next;
    
      free(node);
    
      ptr->top = topnext;
      ptr->count--;
    }
    
    // 打印值
    void printStack(RpnNode *L){
      while(L->next){
        printf("(%f:%c)->", L->data, L->symol);
        L = L->next;
      }
    
      printf("\n");
    }
    
    char saveData(RpnNodeSave *dptr, char *data){
      int i = 0;
      char str[10];
      DateType store;
    
      while(isdigit(*data) || '.' == *data){
        str[i++] = *data;
        str[i] = '\0';
        if (i >= 10){
          printf("输入的单个数据过大\n");
          return '#';
        }
        scanf("%c", data);
        if(!isdigit(*data) && '.' != *data){
          store = atof(str);
          Push(dptr, store);
          i = 0;
          return *data;
        }
      }
    }
    
    int main(int argc, char const *argv[])
    {
      char data, tmp;
      int err = 0, i = 0;
    
      DateType start, end, result, store;
    
      // 数值的栈值
      RpnNode *dHead, *tmpStruct, *tmpNode, *tmpNext;
      dHead = (RpnNodeList)malloc(sizeof(RpnNode));
      dHead->next = NULL;
    
      // 数值统计的栈值
      RpnNodeSave *dptr;
      dptr = (RpnNodeSave *)malloc(sizeof(RpnNodeSave));
      dptr->top = dHead;
      dptr->base = dHead;
      dptr->count = 0;
    
      // 符号的栈值
      RpnNode *sHead, *tmpTop;
      sHead = (RpnNodeList)malloc(sizeof(RpnNode));
      sHead->next = NULL;
    
      // 符号统计的栈值
      RpnNodeSave *sptr;
      sptr = (RpnNodeSave *)malloc(sizeof(RpnNodeSave));
      sptr->top = sHead;
      sptr->base = sHead;
      sptr->count = 0;
    
      printf("请输入一串后缀表达式, 以Enter结束: \n");
      scanf("%c", &data);
    
      while(data != '\n'){
        saveData(dptr, &data);
    
        tmpTop = sptr->top;
        tmp = tmpTop->symol;
        if(tmp == '*' || tmp == '/'){
          symbolPop(sptr, &tmp);
          symbolPush(dptr, tmp);
        }
    
        if(data == '+' || data == '-' ||
           data == '*' ||
           data == '/' ||
           data == '('){
          symbolPush(sptr, data);
        }
    
        if(data == ')'){
          while(1){
            symbolPop(sptr, &tmp);
            if(tmp == '('){
              break;
            }
            symbolPush(dptr, tmp);
          }
        }
        scanf("%c", &data);
      }
    
      tmpStruct = sptr->top;
      while(tmpStruct->next){
        symbolPush(dptr, tmpStruct->symol); // 栈 1
        tmpStruct = tmpStruct->next;
      }
      printStack(dptr->top);
    
      // 开始按照逆波兰计算结果
      RpnNode *caclHead;
      caclHead = (RpnNodeList)malloc(sizeof(RpnNode));
      caclHead->next = NULL;
    
      tmpStruct = (RpnNodeList)malloc(sizeof(RpnNode));
      tmpStruct->next = NULL;
    
      // 数值统计的栈值
      RpnNodeSave *cptr;
      cptr = (RpnNodeSave *)malloc(sizeof(RpnNodeSave));
      cptr->top = caclHead;
      cptr->base = caclHead;
      cptr->count = 0;
    
      tmpNode = dptr->top;
      while(tmpNode->next){
        tmpNext = tmpNode->next;
    
        tmpNode->next = tmpStruct;
        tmpStruct = tmpNode;
        tmpNode = tmpNext;
      }
    
      while(tmpStruct->next){
        data = tmpStruct->symol;
    
        switch(data){
          case '+':
            Pop(cptr, &end);
            Pop(cptr, &start);
    
            Push(cptr, start + end);
            break;
          case '-':
            Pop(cptr, &end);
            Pop(cptr, &start);
    
            Push(cptr, start - end);
            break;
          case '*':
            Pop(cptr, &end);
            Pop(cptr, &start);
    
            Push(cptr, start * end);
            break;
          case '/':
            Pop(cptr, &end);
            Pop(cptr, &start);
    
            if(end == 0){
              printf("输入错误,除数不能为0\n");
              return -1;
            }
            Push(cptr, start / end);
            break;
          default:
            Push(cptr, tmpStruct->data);
        }
        tmpStruct = tmpStruct->next;
      }
    
    
      Pop(cptr, &result);
      printf("result: %f \n", result);
    
      getchar();
    
      return 0;
    }
    请输入一串后缀表达式, 以Enter结束: 
    1+(2-3)*4+10/5+10 
    (0.000000:+)->(0.000000:+)->(0.000000:+)->(10.000000:)->(0.000000:/)->(5.000000:)->(10.000000:)->(0.000000:*)->(4.000000:)->(0.000000:-)->(3.000000:)->(2.000000:)->(1.000000:)->
    result: 9.000000 
    

     

    展开全文
  • 1.数制转换数值进位制的换算是计算机实现计算和处理的基本问题。比如将十进制数m转换为n进制的数,最常用的算法是除n取余法。这种方法是将十进制数m每次除以n,直到商为0时为止。将所得的余数依次进栈,然后按“后进...

    1.数制转换

    数值进位制的换算是计算机实现计算和处理的基本问题。比如将十进制数m转换为n进制的数,最常用的算法是除n取余法。这种方法是将十进制数m每次除以n,直到商为0时为止。将所得的余数依次进栈,然后按“后进先出”的次序出栈便得到转换结果。其基本原理是:

    m=(m / n)* n + m % n ( 其中: / 为整除,%为求余 )

    将十进制数1567转换为八进制数。

    设m=1567 ,n=8。按照除8取余法,转换方法和结果如下:

    f994f4be8c5a0964eb02d5b26262b5b4.png

    按照上述除8取余法,得到的余数依次是7,3,0,3。在转换过程中每得到一个余数则进栈保存,最先得到的余数7在栈底,最后得到的余数3在栈顶,转换完毕后依次出栈,其输出顺序与计算顺序正好相反,为3、0、3、7。数值3037即为转换后的八进制数,可表示为:

    (1567)10 =(3037)8

    将十进制数转换为n进制数的过程中,计算顺序与输出顺序正好相反。因此,利用栈解决这个问题是很合适的。

    算法原理:

    (1)逐次计算得到相关结果,先计算得到的结果后输出;

    (2)把逐次得的余数依次进栈,计算结束后依次出栈。

    算法要点(采用顺序栈):

    (1)m!=0 ,m%n 的余数进栈;

    若m==0,结束求余运算,依次进行出栈操作;

    (2)m=m/n;

    (3)重复(1)和(2)。

    利用顺序栈将任意的十进制非负整数转换为等价的n进制数输出的完整程序如下 :

    #include#include#define MaxSize 100 /*定义顺序栈所能存储的最多的元素的个数*/typedef int ElemType; /*数据元素类型一般用ElemType表示*/struct SeqStack{ /*顺序栈的类型定义*/ElemType data[MaxSize]; /*用data数组存储栈中所有的数据元素*/int top; /*用整型变量top指示栈顶元素的位置*/};#include "顺序栈基本操作.c" /*顺序栈的6种运算包含在此文件中*/void transform(int m, int n) /*将一个十进制整数m转换为n进制数输出函数*/{int k; /*用来保存余数*/int mm=m; /*用来保存被转换的十进制数m*/ struct SeqStack S; /*顺序栈的变量定义*/InitStack(&S); /*将顺序栈a初始化*/while(m!=0) {k=m%n; /*将十进制数m除以n进制数的余数存入k*/Push(&S,k); /*将k的值进栈a中*/m=m/n; /*用m除以n的整数商又赋给m*/}printf("十进制数 %d 转换为 %d 进制数为:
    展开全文
  • C语言学习 - 表达式

    2019-07-26 13:53:12
    C语言的显著特征之一就是它更多地强调表达式,而不是语句,表达式是显示如何计算值的公式。最简单的表达式是变量和常量。变量表示程序运行时计算出的数值;常量表示不变的数值。更加复杂的表达式把运算符用于操作数...

    前言

    在工作的时候准备考研,学学C语言

    表达式

    C语言的显著特征之一就是它更多地强调表达式,而不是语句,表达式是显示如何计算值的公式。最简单的表达式是变量和常量。变量表示程序运行时计算出的数值;常量表示不变的数值。更加复杂的表达式把运算符用于操作数。

    运算符

    1. 算数运算符:算数运算符包括加法运算符,减法运算符,乘法运算符,除法运算符。加法和乘法类的运算符是二元运算符,需要两个操作数,而正负是一元操作符,只需要一个操作数。
      注意事项:运算符/和运算法%的注意事项,运算符/是通过丢掉分数部分的方法来截取结果的,运算符%要求操作数是整数,如果操作数有一个不是整数将无法编译通过,当/和%用于负数的时候结果与具体的实现有关系

      算数运算符的优先级和结核性:当两个或更多个运算符出现在同一个表达式中的时候,可以通过以运算符优先级从高到低的次序给表达式添加圆括号来确定编译表达式的方法。当运算符的优先级相同的时候,就要考虑运算符的结合性,一般二元运算符是从左至右结合的,一元运算符是从右至左结合的。

    2. 赋值运算符:一旦计算出表达式的值常常需要把这个值存储在变量中,C语言中的简单赋值(=) 可以用于此目的,C语言中还提供一种符合赋值运算符
      表达式v=e的赋值效果是求出表达式e的值,并把结果值复制给v,如果v和e的类型不同 那么会把e转化为v的类型。备注:C语言中 = 是一个运算符,赋值运算符的结合方向是右结合的

    3. 左值:大多数C语言的运算符作的操作数是变量,常量,或者是包含其他运算符的表达式,运算符要求它左边的操作数必须是左值,(左值表示的是存储在计算机内存中的对象,而不是常量或者计算的结果)变量是左值,后续几章中我们将继续介绍其他左值

    4. 复合赋值:利用变量原有的值计算出新值并重新赋值给这个变量是C语言程序中非常普遍的。(+=运算符是把右边的操作数的值加到左边在赋值给左侧的变量)

    展开全文
  • c语言运算符及表达式

    2018-11-07 23:10:17
    优先次序 !(非)>算数运算符>关系运算符>||和&amp;...用关糸运算符将两个数值或数值表达式连接起来的式子 关系表达式的值是一个逻辑值,真值为1,假值为0 例: d=a>b,若a>b为真,则d为...
  • 实际上C语言数值索引可以是负值,只不过并不是像python一样指向的是从最后数的第几个元素,这里C语言中的数组的元素有一个恒等的关系: *a[i] = (a+i) 只要指向的这个地址里面有内容就可以使用负值索引,另有一个...
  • 使用c语言实现后缀表达式计算器

    千次阅读 2016-06-16 23:10:39
    使用栈来进行后缀表达式计算,流程:从前向后读取后缀表达式的项目,遇到数值压入栈中,遇到运算符pop出栈顶的两项做运算,运算结果再放入栈中直到= 例子:求后缀表达式4x*2x*a-c*+=? 1.把4和x压入栈中接下来...
  • 词法分析是编译中很基础同时又是很重要的一步,以表达式词法分析为例,其主要思想是当扫描输入文件时,会根据规则识别每个单词,然后输出相关信息到输出文件...在表达式中,单词包括数值常数、标识符、运算符、分隔符。
  • C语言入门之关系表达式

    千次阅读 2019-05-16 22:47:18
    用关系运算符将两个数值或数值表达式连接起来的式子 关系表达式的值是一个逻辑值,即“真”或“假” 在C的逻辑运算中,以“1”代表“真”,以“0”代表“假” Ø3种逻辑运算符: &&(逻辑与) ||(逻辑...
  • #!/bin/bash#在进行数值计算时使用((...))实现C语言风格的循环很方便((i=0,s=0))#使用直到型循环until ((i==100));do ((i++,s+=i));doneecho sum\(1..100\)=$s
  • 表达式:由数字、变量、算符、数字分组符号(括号等)等能够求得数值的有意义的组合。 (a+b)*5 2、赋值运算符 = 将=右边的值赋值给左边的变量 8=5;//错误 赋值表达式:由操作数和赋值运算符构成的表达式 本质:...
  • C语言的运算符可分为以下几类: (1)算数运算符:用于各类数值运算。包括:加(+),减(-),乘(*),除(/),求余(%),自增(++),自减(–)共7种 (2)关系运算符:用于比较运算。包括:大于(&amp;...
  • 右值可以是常量,变量,表达式等 表示一个数值 赋值:从右到左赋值,就是将右边的值保存到左边的变量空间中。 例如: int a,b,c ; a = 10; //正确 10 = a; //错误 b = a; //正确 c = 2+4; //正确 2....
  • 第3章 数据类型运算符与表达式3.1 C的数据类型3.2 常量与变量3.3 整型数据3.4 实型数据第张3.5 字符型数据3.6 变量赋初值3.7各类数值型数据间的混合运算3.8算术运算符和算术表达式3.9赋值运算符和赋值表达式3.10 ...
  • 3.7 各类数值型数据间的混合运算 ;数值型数据间的混合运算; 3.8 算术运算符和算术表达式; 3.8 算术运算符和算术表达式; 3.8.2 算术运算符和算术表达式; 3.8.2 算术运算符和算术表达式; 3.8.2 算术运算符和算术表达式...
  • 3.8 算术运算符和算术表达式; 3.8 算术运算符和算术表达式... (2)类型转换 如果赋值运算符两侧的类型不一致但都 是数值型或字符型时在赋值时要进行类型 转换 如:为整型变量执行i=3.56的结果是使 的值为以整数形式存储在
  • /**************Fun:返回输入运算符的设定数值**************/ Status ReturnOpOrd(char oper, char *TestOp) { int i; for (i = 0; i; i++) { if (oper == TestOp[i]) return i; } } /**********FUN:...
  • c语言的基本类型与表达式

    千次阅读 2016-11-18 23:03:24
    c语言的基本类型有四种,基本类型,构造类型,指针类型,空类型。 基本类型:字符型char,数值类型分为整形和实型,实型有float,double. 构造类型:数组类型【】、结构体类型struct、共用体类型union和枚举类型enum...
  • 在数学中,数值是不分类型的,数值的运算是绝对准确的,例如:1/3的值是0.333333(循环小数)。而在计算机中,数据是存放在存储单元中的,它是具体存在的。而且,存储单元是由有限的字节构成的,每一个存储单元中存放...
  • 需要建一个操作符栈op和一个字符数组expop栈存放操作符字符数组用来存放转换以后的后缀表达式首先得到用户输入的中缀表达式将其存入str数组中对str数组逐个扫描如果是数字或小数点则直接存入exp数组中当扫描完数值后...
  • 两种,它们都是以二进制存放的,每种类型占不同的地址空间,所以其能表示的数值范围也都有所限制。当前机器各种类型的取值范围可在“limits.h”文件里查看 2.整型常量 常量就是指在程序运行过程中不能被改变的量,...
  • 根据 逆波兰表示法,求表达式的值。...换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。示例 1:输入: ["2", "1", "+", "3", "*"] 输出: 9 解释: 该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) ...
  • 【中国寒龙联盟出品】C语言基础视频教程第二课之:C语言的数据类型,数值数据的表示,文字数据的表示,变量的定义和贬值,C语言类型修饰符以及表达式中数据类型转换!本章节有中国寒龙联盟官方站点整理收集并且发布...
  • 将赋值运算符右侧表达式的类型自动转换为左侧表达式变量的类型. 问题: 在不同类型数据间赋值, 是安全的吗? 问题:何为数值溢出,为什么会发生数值溢出? 任何数据类型都只能用有限的位数来存储数据, 也就是说...
  • 表达式求值(C语言

    千次阅读 多人点赞 2018-11-01 14:47:49
    代码可以实现的功能: 可以计算任意整型 但是只可以进行 + - * / () 运算 ...因为定义了两个栈(存放不同类型的值,一个存放字符,一个存放数值),所以初始化,入栈,出栈,取栈顶元素的函数都要写两遍 然后核心就...
  • 表达式的求解的关键是将其转换成逆波兰表达式(即后缀表达式,如1+2*3它的逆波兰表达式为123*+),...(1)若ch为数字则直接将其放入后缀数组exp中并以#号标记数值串结束。 (2)若ch为"(",则直接将其压入字符栈op中。 ...
  • 需要建一个操作符栈op和一个字符数组expop栈存放操作符字符数组用来存放转换以后的后缀表达式首先得到用户输入的中缀表达式将其存入str数组中对str数组逐个扫描如果是数字或小数点则直接存入exp数组中当扫描完数值后...
  • 根据逆波兰表示法,求表达式的值。 有效的运算符包括+,-,*,/。...换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。 示例1: 输入: ["2", "1", "+", "3", "*"] 输出: 9 解释: ((2 + 1) * 3) = 9 示例2:...
  • * * * 不同类型的数据(int;float;char)可以进行混合运算 如: 10 + a + 1.5 - 8765.1234 * b (1)混合运算的规则 不同类型数据混合运算先...例 3.0+4/2 表达式的值 5.0 3.0+2 3.0+2.0 形式 (数据类型)表达式 当需要做一
  • title: 2017-10-17c语言的类型、运算符与表达式 tags: c程序设计语言 grammar_cjkRuby: true --- 1.1 数据类型 char 字符型,一个字节 int 整型,所用机器整数最自然的长度 float 单精度 double 双精度 1.2 常量 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 669
精华内容 267
关键字:

c语言数值表达式

c语言 订阅