C语言控制台的输入与输出

printf语句小结:

1.学会printf的的用法,注意参数以逗号分开;

2.使用%d来打印整数,使用%04d来控制宽度;

3.%f来打印小数,使用%.4f来控制小数点后位数;

4.学会定义int型变量:表示整数;

5.学会定义double型变量:表示小数;

6.初步学习简单的+ - * / 的表示;


scanf语句小结:

scanf输入数据的方法:

(1)先定义变量,整数使用int型,小数使用double型;

(2)使用%d或%lf;

(3)参数前面注意使用&号;

练习:

例一


例二




  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设我们已经定义好了状态(State)和转移(Transition)两个结构体,其中状态结构体包含一个整型的状态编号以及一个指向转移结构体的指针,转移结构体包含一个字符型的输入符号以及一个指向下一个状态的指针。 那么,实现ε-closure(I)的程序代码如下: ```c #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define MAX_STATES 100 // 最大状态个数 #define MAX_TRANSITIONS 100 // 最大转移个数 // 状态结构体 typedef struct state { int id; // 状态编号 struct transition *transitions; // 转移数组 } State; // 转移结构体 typedef struct transition { char input; // 输入符号 struct state *next_state; // 下一个状态 } Transition; // 用于存储状态的栈 typedef struct stack { int top; State *items[MAX_STATES]; } Stack; // 创建一个新的状态 State* new_state(int id) { State *s = (State*) malloc(sizeof(State)); s->id = id; s->transitions = NULL; return s; } // 添加一个新的转移到状态中 void add_transition(State *s, char input, State *next_state) { Transition *t = (Transition*) malloc(sizeof(Transition)); t->input = input; t->next_state = next_state; // 将新的转移加入到转移数组中 if (s->transitions == NULL) { s->transitions = t; t->next = NULL; } else { t->next = s->transitions; s->transitions = t; } } // 判断一个状态是否在栈中 bool is_state_in_stack(Stack *stack, State *state) { for (int i = 0; i <= stack->top; i++) { if (stack->items[i] == state) { return true; } } return false; } // 将状态加入到栈中 void push(Stack *stack, State *state) { stack->items[++stack->top] = state; } // 从栈中取出一个状态 State* pop(Stack *stack) { return stack->items[stack->top--]; } // 计算ε-closure(I) void epsilon_closure(State *start_state) { Stack *stack = (Stack*) malloc(sizeof(Stack)); stack->top = -1; push(stack, start_state); while (stack->top != -1) { State *s = pop(stack); printf("%d ", s->id); // 输出状态编号 // 遍历状态的转移数组,将所有输入符号为ε的下一个状态加入栈中 for (Transition *t = s->transitions; t != NULL; t = t->next) { if (t->input == 'ε' && !is_state_in_stack(stack, t->next_state)) { push(stack, t->next_state); } } } } int main() { // 创建一些状态和转移 State *s0 = new_state(0); State *s1 = new_state(1); State *s2 = new_state(2); State *s3 = new_state(3); add_transition(s0, 'a', s1); add_transition(s0, 'ε', s2); add_transition(s1, 'b', s3); add_transition(s2, 'a', s2); add_transition(s2, 'b', s2); add_transition(s2, 'ε', s3); add_transition(s3, 'a', s3); add_transition(s3, 'b', s3); // 计算ε-closure({s0}) printf("ε-closure({%d}): ", s0->id); epsilon_closure(s0); printf("\n"); return 0; } ``` 以上代码中,我们创建了一些状态和转移,并定义了一个epsilon_closure函数用于计算ε-closure(I)。在函数中,我们使用了一个栈来存储需要处理的状态,并在遍历状态的转移数组时,将所有输入符号为ε的下一个状态加入到栈中。最后,我们在控制台输出了计算结果。 注意,以上代码中的状态和转移只是举例用的,实际使用时需要根据具体的文法进行定义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值