void DealData() { while (dataQueue.Count != 0) { for (int i = 0; i < dataQueue.Count; i++) { outStr += dataQueue.Dequeue(); if (outStr.Length == 2) { //数据开头“[” if (outStr == "5B") { isStart = true; } //将所有数据从开始拼接到一起 if (isStart) { //接收的是十六进制的数据,要完成一下转化 receiveStr.Append(ToMyString(outStr)); } else { Debug.Log("错误数据: " + receiveStr); } //数据结尾“]” if (outStr == "5D") { isStart = false; //将接收的完整的数据添加到队列。待加 Debug.Log(receiveStr); //开头和结尾都对了才能够加入队列中处理 inputStr.Enqueue(receiveStr.ToString()); //清空接收的数据 receiveStr.Remove(0, receiveStr.Length); } outStr = string.Empty; } } } }怎么理解上面的代码
时间: 2023-04-09 19:04:03 浏览: 200
这是一段 C# 代码,主要是用于处理数据队列中的数据。代码中使用了一个 while 循环,当数据队列不为空时,会遍历数据队列中的每一个元素。对于每一个元素,如果其长度为 2,就会根据其内容进行不同的处理。如果是开头标志“[”,则将 isStart 标志设置为 true,表示开始接收数据;如果是结尾标志“]”,则将 isStart 标志设置为 false,表示数据接收结束,并将接收到的完整数据添加到 inputStr 队列中。如果接收到的数据不符合要求,则会输出错误信息。最后,将 outStr 清空,以便下一次处理。
相关问题
#include <stdio.h> #include <stdlib.h> #include <string.h> #pragma warning (disable:4996) #define MAXN 10001 typedef struct { char ch[MAXN]; int length; }List; List Dictionary[MAXN], InPut; int n = 0; void InitList(List InPut) { int i, j, k, count, flag = 1; for (i = 0; i < n; i++) { if (strcmp(Dictionary[i].ch, InPut.ch) == 0) { printf("%s is correct\n", InPut.ch); flag = 0; break; } } if (flag) { printf("%s:", InPut.ch); for (i = 0; i < n; i++) { if (InPut.length == Dictionary[i].length + 1) { count = 0; for (j = 0, k = 0; Dictionary[i].ch[j] != '\0'; j++, k++) { if (Dictionary[i].ch[j] != InPut.ch[k]) { count++; j--; } if (count >= 2) break; } if (count <= 1) printf(" %s", Dictionary[i].ch); } if (InPut.length == Dictionary[i].length - 1) { count = 0; for (j = 0, k = 0; InPut.ch[k] != '\0'; j++, k++) { if (Dictionary[i].ch[j] != InPut.ch[k]) { count++; k--; } if (count >= 2) break; } if (count <= 1) printf(" %s", Dictionary[i].ch); } if (InPut.length == Dictionary[i].length) { count = 0; for (j = 0, k = 0; Dictionary[i].ch[j] != '\0'; j++, k++) { if (Dictionary[i].ch[j] != InPut.ch[k]) count++; if (count >= 2) break; } if (count <= 1) printf(" %s", Dictionary[i].ch); } } printf("\n"); } } int main() { while (scanf("%s", Dictionary[n].ch) != EOF) { if (Dictionary[n].ch[0] == '#') break; Dictionary[n].length = strlen(Dictionary[n].ch); n++; } while (scanf("%s", InPut.ch) != EOF) { if (InPut.ch[0] == '#') break; InPut.length = strlen(InPut.ch); InitList(InPut); } return 0; } 描述上述代码的ADT设计
该代码没有设计特定的 ADT(抽象数据类型),而是实现了一个简单的单词纠错程序。该程序的功能是:
1. 读取一个单词列表(由用户输入),保存在一个 List 数组中。
2. 读取一个用户输入的单词,查找该单词是否在单词列表中出现过。
3. 如果该单词在列表中出现过,则输出 "单词是正确的" 的提示信息。
4. 如果该单词在列表中未出现,则输出 "单词:" 和一些相关的单词列表,这些列表包括:
- 长度比该单词多 1 个字符的单词列表;
- 长度比该单词少 1 个字符的单词列表;
- 长度与该单词相同的单词列表。
5. 每个列表中的单词都与该单词最多只有一个字符不同,且仅输出这些满足条件的单词。
该程序的 List 结构体包含两个成员变量:一个 char 数组 ch,用于存储单词;一个 int 变量 length,用于存储单词的长度。InitList 函数是程序的主要部分,用于初始化单词列表和输出单词纠错的结果。该函数的输入参数是一个 List 类型的变量 InPut,表示用户输入的单词。函数首先遍历单词列表,查找该单词是否在列表中出现过。如果出现过,则输出 "单词是正确的" 的提示信息;否则,输出相关的单词列表。输出列表的方法是,分别遍历单词列表中的每个单词,分类讨论它们与用户输入的单词的长度关系,并分别计算它们与用户输入的单词的差别程度。若差别程度不超过 1,则将这些单词输出到结果中。最后,将结果输出到屏幕上。
修改下列代码错误#include<bits/stdc++.h> using namespace std; char s[13][20]={0}; struct ArcNode { int adjest; ArcNode *next; }; typedef struct { int vertex; int count; ArcNode *firstedge; } VNode; class AdjGraph { private: int VertexNum; int ArcNum; public: VNode adjlist[100]; AdjGraph(int a[],int n,int e); ~AdjGraph(); }; AdjGraph::AdjGraph(int a[],int n,int e) { int i,j,k; VertexNum=n; ArcNum=e; for(i=1;i<=VertexNum;i++) { adjlist[i].vertex=a[i]; adjlist[i].firstedge=NULL; } int q; for(k=0;k<ArcNum;k++) { char s2[20]={0}; char s3[20]={0}; char s0[20]={0}; cin>>s2; cin>>s3; for(q=1;q<=n;q++) { s0=s[q]; if(strcmp(s0,s2)==0) i=q; if(strcmp(s0,s3)==0) j=q; } ArcNode *s=new ArcNode; s->adjest=j; s->next=adjlist[i].firstedge; adjlist[i].firstedge=s; } } AdjGraph::~AdjGraph() { } void TopSort(AdjGraph *G,int n) { int i,j,l=0; int b[100]={0}; int St[100],top=-1; ArcNode p; for (i=1;i<=n;i++) G->adjlist[i].count=0; for (i=1;i<=n;i++) { p=G->adjlist[i].firstedge; while (p!=NULL) { G->adjlist[p->adjest].count++; p=p->next; } } for (i=n;i>0;i--) if (G->adjlist[i].count==0) { top++; St[top]=i; } while (top>-1) { i=St[top];top--; b[l]=i; l++; p=G->adjlist[i].firstedge; while (p!=NULL) { j=p->adjest; G->adjlist[j].count--; if (G->adjlist[j].count==0) { top++; St[top]=j; } p=p->next; //找下一个邻接点 } } if(l!=n) { cout<<"False"; } else { for(i=0;i<l;i++) { cout<<s[b[i]]<<" "; } } } int main() { int n,e,i; ArcNode p; cin>>n>>e; char s1[20]={0}; for(i=1;i<=n;i++) { cin>>s1; s[i]=s1; } int a[100]={0}; for(i=1;i<=n;i++) { a[i]=i; } AdjGraph A(a,n,e); / for(i=1;i<=n;i++) { cout<<A.adjlist[i].vertex<<"--->"; p=A.adjlist[i].firstedge; while(p!=NULL) { cout<<p->adjest<<"--->"; p=p->next; } cout<<endl; }/ AdjGraph *G=&A; TopSort(G,n); }
这段代码存在多处错误,包括:
1. 包含了不必要的头文件 `<bits/stdc++.h>`,应该只包含需要的头文件。
2. `char s[13][20]={0}` 中,应该使用 `'\0'` 表示空字符,而不是 `0`。
3. `ArcNode *s=new ArcNode` 中,应该使用 `ArcNode* s=new ArcNode`。
4. `p->adjest` 中,应该使用 `p->adjvex`。
5. `//找下一个邻接点` 应该换行。
以下是修改后的代码:
```cpp
#include <iostream>
#include <cstring>
using namespace std;
char s[13][20] = {'\0'};
struct ArcNode {
int adjvex;
ArcNode* next;
};
struct VNode {
int vertex;
int count;
ArcNode* firstedge;
};
class AdjGraph {
private:
int VertexNum;
int ArcNum;
public:
VNode adjlist[100];
AdjGraph(int a[], int n, int e);
~AdjGraph();
};
AdjGraph::AdjGraph(int a[], int n, int e) {
int i, j, k;
VertexNum = n;
ArcNum = e;
for (i = 1; i <= VertexNum; i++) {
adjlist[i].vertex = a[i];
adjlist[i].firstedge = NULL;
}
int q;
for (k = 0; k < ArcNum; k++) {
char s2[20] = {'\0'};
char s3[20] = {'\0'};
char s0[20] = {'\0'};
cin >> s2;
cin >> s3;
for (q = 1; q <= n; q++) {
strcpy(s0, s[q]);
if (strcmp(s0, s2) == 0) i = q;
if (strcmp(s0, s3) == 0) j = q;
}
ArcNode* s = new ArcNode;
s->adjvex = j;
s->next = adjlist[i].firstedge;
adjlist[i].firstedge = s;
}
}
AdjGraph::~AdjGraph() {}
void TopSort(AdjGraph* G, int n) {
int i, j, l = 0;
int b[100] = {0};
int St[100], top = -1;
ArcNode* p;
for (i = 1; i <= n; i++) G->adjlist[i].count = 0;
for (i = 1; i <= n; i++) {
p = G->adjlist[i].firstedge;
while (p != NULL) {
G->adjlist[p->adjvex].count++;
p = p->next;
}
}
for (i = n; i > 0; i--)
if (G->adjlist[i].count == 0) {
top++;
St[top] = i;
}
while (top > -1) {
i = St[top];
top--;
b[l] = i;
l++;
p = G->adjlist[i].firstedge;
while (p != NULL) {
j = p->adjvex;
G->adjlist[j].count--;
if (G->adjlist[j].count == 0) {
top++;
St[top] = j;
}
p = p->next; //找下一个邻接点
}
}
if (l != n) {
cout << "False";
} else {
for (i = 0; i < l; i++) {
cout << s[b[i]] << " ";
}
}
}
int main() {
int n, e, i;
ArcNode* p;
cin >> n >> e;
char s1[20] = {'\0'};
for (i = 1; i <= n; i++) {
cin >> s1;
strcpy(s[i], s1);
}
int a[100] = {0};
for (i = 1; i <= n; i++) {
a[i] = i;
}
AdjGraph A(a, n, e);
// for(i=1;i<=n;i++) {
// cout<<A.adjlist[i].vertex<<"--->";
// p=A.adjlist[i].firstedge;
// while(p!=NULL) {
// cout<<p->adjvex<<"--->";
// p=p->next;
// }
// cout<<endl;
// }
AdjGraph* G = &A;
TopSort(G, n);
return 0;
}
```
阅读全文