提交 6e8d4ec4 创建 作者: 宋海霞's avatar 宋海霞

template

上级
流水线 #473 已失败 于阶段
/Debug
/Release
*.bak
image: "registry.cn-hangzhou.aliyuncs.com/engintime/ubuntu_16.04_cpp:latest"
stages:
- make
- case1
- teacher-check
variables:
TEMPLATE_REPO: "engintime/ds-lab/Project-Template/Lab008.git"
.codecode-runner: &codecode-runner
tags:
- ubuntu-16.04
- short-job
make:
stage: make
<<: *codecode-runner
script:
- make
- execscore.sh 40
only:
- master
case1:
stage: case1
<<: *codecode-runner
script:
- make
- ./app > user_output.txt
- diff output.txt user_output.txt -b -B -y -i --suppress-common-lines
- execscore.sh 100
only:
- master
teacher-check:
stage: teacher-check
<<: *codecode-runner
script:
- make
- ./app
- git clone ${CODECODE_PROTOCOL}gitlab-ci-token:${CI_JOB_TOKEN}@${CODECODE_DOMAIN}/${TEMPLATE_REPO} template
- diff template/.gitlab-ci.yml .gitlab-ci.yml -b -B -y -i --suppress-common-lines
- diff template/output.txt output.txt -b -B -y -i --suppress-common-lines
- fileidentity.sh
only:
- master
when: manual
allow_failure: false
#ifndef _SEQSTRING_H_
#define _SEQSTRING_H_
//
// 在此处包含 C 标准库头文件
//
#include <stdio.h>
//
// 在此处包含其他头文件
//
//
// 在此处定义数据结构
//
#define MAX_LENGTH 20 // 字符串的最大长度
typedef struct {
char data[MAX_LENGTH]; // 使用数组存储字符串中的字符,数组的最大长度即为字符串的最大长度。
int nLength; // 字符串的实际长度,即数组中字符的个数。
}SeqString;
//
// 在此处声明函数
//
int InsertBefore(SeqString* pSource, int pos, SeqString* pTarget);
#endif /* _SEQSTRING_H_ */
<?xml version="1.0" encoding="gb2312"?>
<OSLProject Version="1.00" Name="SeqString_Insert" SubjectID="cf4dda31-1275-49ef-9b0f-36a6eff372e4" ProjectTemplateID="e3645040-082c-49ae-b1ca-c6e53051bef6">
<Configurations>
<Configuration Name="Debug">
<Tool Name="PreBuildEventTool"/>
<Tool Name="CustomBuildTool"/>
<Tool Name="GCCCompilerTool" PreprocessorDefinitions="_DEBUG" GenerateDebugInformation="-1"/>
<Tool Name="PreLinkEventTool"/>
<Tool Name="GCCLinkerTool" AdditionalDependencies="&quot;$(DSLInstallDir)Dump\lib\SeqString_Insert_Demo.o&quot;"/>
<Tool Name="PostBuildEventTool"/>
<VisualContext>
<WatchPoints>
<WatchPoint FunctionName="InsertBefore" ObserverID="A3DD425E-262A-4789-8C4A-F26CCE8E56B4">
</WatchPoint>
</WatchPoints>
</VisualContext>
</Configuration>
<Configuration Name="Release">
<Tool Name="PreBuildEventTool"/>
<Tool Name="CustomBuildTool"/>
<Tool Name="GCCCompilerTool" PreprocessorDefinitions="NDEBUG"/>
<Tool Name="PreLinkEventTool"/>
<Tool Name="GCCLinkerTool"/>
<Tool Name="PostBuildEventTool"/>
</Configuration>
</Configurations>
<Files>
<Filter Name="ͷļ" Filter="h;hpp;hxx">
<File RelativePath=".\SeqString.h">
</File>
</Filter>
<Filter Name="Դļ" Filter="cpp;c;cc;cxx">
<File RelativePath=".\main.c">
</File>
</Filter>
<File RelativePath=".\makefile">
</File>
<File RelativePath=".\output.txt">
</File>
<File RelativePath=".\readme.md">
</File>
</Files>
</OSLProject>
#include "SeqString.h"
int main(int argc, char* argv[])
{
SeqString Source;
SeqString Target;
//
// 初始化源字符串
//
Source.data[0] = 'P';
Source.data[1] = 'R';
Source.data[2] = 'O';
Source.data[3] = 'M';
Source.data[4] = 'Q';
Source.data[5] = 'E';
Source.data[6] = 'X';
Source.data[7] = '1';
Source.data[8] = '4';
Source.data[9] = ';';
Source.nLength = 10;
//
// 初始化目标字符串
//
Target.data[0] = 'G';
Target.data[1] = 'R';
Target.data[2] = 'A';
Target.nLength = 3;
//
// 将目标字符串插入到源字符串中
//
InsertBefore(&Source, 4, &Target);
InsertBefore(&Source, 15, &Target); // 插入失败。插入位置非法。
return 0;
}
/*
功能:
在源字符串的第 i 个字符之前插入目标字符串。
参数:
pSource -- 源字符串
pos -- 插入位置。从 1 开始计数。
pTarget -- 目标字符串
返回值:
如果插入成功返回插入位置。
如果插入失败返回 0
*/
int InsertBefore(SeqString* pSource, int pos, SeqString* pTarget)
{
int nSourceIndex, nTargetIndex; // 字符串中的游标。作为数组下标,从 0 开始计数。
//
// TODO: 在此添加代码
//
return 0;
}
app:main.o
gcc -o app main.o
main.o:main.c SeqString.h
gcc -c -w -O3 -std=c99 -fsigned-char main.c -o main.o
P R O G R A M Q E X 1 4 ;
# 阅读实验源代码
**main.c文件**
在main函数中初始化了源字符串与目标字符串,然后调用了两次插入函数InsertBefore尝试将目标字符串插入到源字符串的不同位置,第一次调用插入成功,第二次调用插入失败。
在main函数的后面,定义了字符串插入函数InsertBefore,此函数的函数体还不完整,留给读者完成。
**SeqString.h文件**
定义了与顺序存储的字符串相关的数据结构并声明了相关的操作函数。
# 在演示模式下调试项目
**按照下面的步骤调试项目:**
1. 按F7生成项目。
2. 在演示模式下,按F5启动调试项目。程序会在观察点函数的开始位置中断。
3. 重复按F5,直到调试过程结束。
在调试的过程中,每执行“演示流程”窗口中的一行后,仔细观察“可视化数据”窗口内容所发生的变化,理解在源字符串中插入目标字符串的执行过程。“可视化窗口”窗口显示了源字符串(pSource)和目标字符串(pTarget)的数据信息(如下图所示),包括:
- 字符串的内容。字符串中超过其长度的部分,字符的底色为灰色。注意,由于字符串中超过其长度的部分使用的是内存中的随机数据,如果一个随机数据(一个字节)的值是一个能够显示的ASCII编码,就正常显示其字符;否则,就使用字符“?”代替。
- 在源字符串中,标识出了目标字符串要插入的位置和游标。
- 在执行的过程中,可以看到源字符串的游标或者目标字符串的游标的移动,当前字符串与上一次字符对应的字符不相同时,该字符就会用红色显示。
![字符串的顺序表示及插入操作](./img/8.png)
# 编写源代码并通过验证
**按照下面的步骤继续实验:**
1. 为InsertBefore函数编写源代码。注意,尽量使用已定义的局部变量。
2. 按F7生成项目。如果生成失败,根据“输出”窗口中的提示信息修改源代码中的语法错误。
3. 按Alt+F5启动验证。如果验证失败,可以使用“输出”窗口中的“比较”功能,或者在“非演示模式”下按F5启动调试后重复按F10单步调试读者编写的源代码,从而定位错误的位置,然后回到步骤1。
# 教师参考答案
访问教师参考答案[domain relative url](engintime/ds-lab/teachers-packet/Lab008.git)
\ No newline at end of file
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论