0%

先放工程文件内容(工程内容为第一次做的母本,实际写实验报告时建议修改代码蓝本)

第一次实验代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#pragma warning(disable:4996)
typedef struct student
{
int elem;
int num;
char name[20];
char adress[30];
char sex[20];
int year;
struct student *next;
}link;
link * creatLink(int * initelem, int len) {
int i;
//最初状态下,头指针 H 没有任何结点,所以,插入第一个元素,就相当于是创建结点 H
link *H = (link*)malloc(sizeof(link));
H->elem = initelem[0];
H->next = NULL;
//如果采用头插法插入超过 1 个元素,则可添加到第一个结点 H 之前
for (i = 1; i < len; i++) {
link * a = (link*)malloc(sizeof(link));
a->elem = initelem[i];
//插入元素时,首先将插入位置后的链表链接到新结点上
printf("学号:");
scanf("%d", &(a->num));
printf("名字:");
scanf("%s", &(a->name));
printf("地址:");
scanf("%s", &(a->adress));
printf("性别(可填武装直升机):");
scanf("%s", &(a->sex));
printf("年龄:");
scanf("%d", &(a->year));
printf("\n");
a->next = H;
//然后再链接头指针 H
H = a;
}
return H;
}
void display(struct student *p) {
while (((p->elem) > 1)&& ((p->elem) = 1)) {
printf("学生:");
printf("%d\t", p->num);
printf("%s\t", p->name);
printf("%s\t", p->adress);
printf("%s\t", p->sex);
printf("%d\t", p->year);
printf("\n");
p = p->next;
}
printf("\n");
}
int main(void)
{
int a, i;
int elem[20] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
printf("结构体数目:");
scanf("%d", &i);
link *Head = creatLink(elem,i+1);
display(Head);
system("pause");
return 0;
}

第二次实验代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#include<stdio.h>
#include <stdlib.h>
#include<malloc.h>
#pragma warning (disable:4996)
struct Node//结构体
{
char data;
struct Node* link;
};
struct Node* buildLinkedList(char* arr, int n) //尾插法初始化链表并插入元素的函数
{
struct Node*p, *pre, *head;
head = (struct Node*)malloc(sizeof(struct Node));
head->link = NULL;
pre = head;
for (int i = 0; i < n; i++) {
p = (struct Node*)malloc(sizeof(struct Node));
p->data = arr[i];
p->link = NULL;
pre->link = p;
pre = p;
}
return head;
}
struct Node* insertElem(Node * p, char elem, int add) // 插入函数
{
Node * temp = p;//创建临时结点temp
//首先找到要插入位置的上一个结点
for (int i = 2; i < add*2; i++) {
if (temp == NULL) {
printf("插入位置无效\n");
return p;
}
temp = temp->link;
}
//创建插入结点c
Node * c = (Node*)malloc(sizeof(Node));
c->data = elem;
//向链表中插入结点
c->link = temp->link;
temp->link = c;
return p;
}
struct Node * delElem(Node * p, int add)
{
Node * temp = p;
//temp指向被删除结点的上一个结点
for (int i = 2; i < add*2; i++) {
temp = temp->link;
}
Node * del = temp->link;//单独设置一个指针指向被删除结点,以防丢失
temp->link = (temp->link)->link;//删除某个结点的方法就是更改前一个结点的指针域
free(del);//手动释放该结点,防止内存泄漏
return p;
}
void printLinkedList(struct Node* head) //打印链表的函数
{
head = head->link;
printf("%c", head->data);
head = head->link;
while (head != NULL) {
printf("%c", head->data);
head = head->link;
}
}
int Length(struct Node* L)//表长统计函数
{
int len = 0; //统计表长
struct Node *p = L;
while (p->link != NULL) {
p = p->link;
len = len + sizeof(struct Node);
}
return len;
}
void getItem(Node head, int j)//通过位置获取对应结构体子数据的函数
{
Node *p = head.link;
int i = 2;
while (p&&i < j*2) //找到第j个位置,当遍历到链表尾或j的值小于1时跳出循环
{
p = p->link;
i++;
}
if (!p || i > j*2) //判断找到的位置是否正确,表尾或i>j均输出错误
{ //i<j是指输入的位置小于0,即不在链表内
printf("请输入正确的位置,%d该位置不在范围内\n", j);
}
else
{
printf("第%d个位置的字符为%c\n", j, p->data);
}
}
void LocateElem(Node L) //对应元素位置寻找
{
//声明一个指针
Node *p=L.link;
char j = 'a';
//计数器
int i = 2;
//当指针指向的结点不为空,并且指针指向的结点的数据域与要查找的值不相等
while (p && p->data != j)
{
p = p->link;
i++;
}
i = i / 2;
if (p)
printf("位置为:1\n");//如果指针指向的结点不为空,则输出计数器的内容,也即是结点数据域的位置
else
printf("未找到该数据\n");//如果指针为空,则表明未找到该数据
}

int main(void)
{
int n, i,pos(1),len;
char newelem;
char* a;
printf("结构体总数:");
scanf("%d\n", &n);
a = (char*)malloc(n * sizeof(char)); //动态内存分配申请字符串空间
len = n;
n = n * 2;
for (i = 0; i < n; i++)
{
scanf("%c", &a[i]);
}
printf("\n");
struct Node* temp = NULL; //声明一个指针变量temp
temp = buildLinkedList(a, n);//创建链表,把返回的头指针赋值给temp指针变量
printLinkedList(temp);//打印链表:整个链表用temp来代表。
printf("\n结构体总长度:%d\n", Length(temp));
if (temp->link == NULL)
printf("空");
else
printf("非空");//判断单链表是否为空
printf("\n输入所求字符位置:");
scanf("%d",&pos);
getItem(*temp,pos);
printf("寻找字符a的位置\n");
LocateElem(*temp);
printf("输入修改字符位置:");
scanf("%d", &pos);
printf("输入修改的字符:");
scanf("%s", &newelem);
temp=insertElem(temp, newelem, pos);
printLinkedList(temp);//再次打印链表
printf("输入删除的位置:");
scanf("%d", &pos);
temp = delElem(temp, pos);
printLinkedList(temp);//再次打印链表
system("pause");
return 0;
}

先放下软件资源链接

【Quartus II 11.0】:https://pan.baidu.com/s/1CVmXib6hR2muBT384f1epA提取密码:ywgt

** 如果电脑空间允许强烈建议保留全部安装文件 **

1.解压后可以看见这几个文件

crack文件夹是存放最后使用的破解文件的。
quartus文件夹才是我们马上要使用的安装文件。
其他的内容可以忽略不计。

2.在quartus文件夹里安装包的作用

第一个安装包和设备存储有关,里面存储的是相关的intel的芯片数据,如果没有安装则无法识别和导入芯片的种类。
第二个安装包和数电模拟有关,里面有内嵌式的modelsim模拟器,如果没有安装则无法进行波形图和芯片模拟。
第三个安装包和程序框架有关,也是必须第一个安装的安装包。

3.关于安装流程注意事项

** 安装前先关闭杀毒软件,注意安装路径不能有中文和空格,安装包路径也不要有中文空格 **

具体的流程可以参考这篇CDSN文章,在此不做赘述。

完成全部的三个软件的安装后你的软件根目录应该是这样的。

其中的ModelSim路径为:软件根目录\modelsim_ase\win32aloem

** 如果没有安装第二个安装包无法找到该文件 **

至于破解内容,如果编译时出现license错误即为破解问题,删除license.dat文件重新进入选择第二个选项试用30天。
具体的实验内容我会放在下一篇文章讲。

##先放一下样板工程文件的链接##
工程文件:https://pan.baidu.com/s/1m9PljkW4VRmEQG6QcOgHFQ提取密码:5re7

解压后可以看见这些东西

** 然而这并不重要 **

打开Quartus

选择File>Open Object,选择解压后工程文件文件夹中的.qdf文件,就可以导入该工程。

** 如果能够自己完成工程文件自然最好 **

关于示波器和模拟的问题

在使用模拟器前必须对工具路径进行补全。Tools>options>EDA tool options,选择ModelSim,填入上篇文章介绍的地址。


关于老师给的教程中的6.3 添加仿真所需测试文件,图22中的toolname注意选择ModelSim_altera而不是图中的ModelSim,一般补全该工具路径后系统会自动为你选择ModelSim_altera,除非你想自己重新下一个独立的ModelSim。