# Mumps Name Search 函数

**URL:** <https://www.isharkfly.com/t/mumps-name-search/15226>\
**Category:** 程序语言\
**Tags:** mumps\
**Created:** [January 6, 2024, 5:38am UTC](https://www.isharkfly.com/t/mumps-name-search/15226 "2024-01-06T05:38:50Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![honeymoose](https://www.isharkfly.com/user_avatar/www.isharkfly.com/honeymoose/32/20796_2.png) [@honeymoose](https://www.isharkfly.com/u/honeymoose)\
**Post date:** [January 6, 2024, 5:38am UTC](https://www.isharkfly.com/t/mumps-name-search/15226/1 "2024-01-06T05:38:50Z")

</div>

需要创建的函数要求为：

> In this exercise, you’ll create a function that returns a set of names matching a search string.
> 
> Create a function named findNames(search,nameAry,matches):
> 
> - search is the search string.
> - Names that begin with the search string are considered a match
> - Remember to use $$up(str) to capitalize strings as needed
> 
> - nameAry is the set of sorted names
> - The names are the subscripts in the array, in all caps
> - The value is the number of times that name was placed in nameAry
> 
> - matches is an array of matching names.
> - The structure of matches is the same as nameAry, but matches only includes names from nameAry that start with search
> 
> - QUIT from findNames with the total number of matches
> - Remember, some names are in nameAry more than once

## 测试用例

下面的代码使用了可用的测试用例。

我们可以使用测试用例来对代码进行校验。

```auto
1 - Exact match, single result
  *Data: nameAry("LOBLAW,BOB B")=1
  *Test: s result=$$findNames^XCHR310EX5YCH("LOBLAW,BOB B",.nameAry,.matches)
  *Run Error: <COMMAND>searchNamesTestHelper+8^XCHR310TESTS *Function must
    return a value at findNames+7^XCHR310EX5YCH

2 - Exact match, two duplicate results
  *Data: nameAry("LOBLAW,BOB B")=2
  *Test: s result=$$findNames^XCHR310EX5YCH("LOBLAW,BOB B",.nameAry,.matches)
  *Run Error: <COMMAND>searchNamesTestHelper+8^XCHR310TESTS *Function must
    return a value at findNames+7^XCHR310EX5YCH

3 - Multiple non-exact unique matches, one leading and one trailing non-match
  *Data: nameAry("ALGEBRA,B B")=1,nameAry("LOB,B B")=1,nameAry("LOBLAW,BOB
    B")=1,nameAry("ZEBRA,B B")=1
  *Test: s result=$$findNames^XCHR310EX5YCH("LOB",.nameAry,.matches)
  *Run Error: <COMMAND>searchNamesTestHelper+8^XCHR310TESTS *Function must
    return a value at findNames+7^XCHR310EX5YCH

4 - Exact match, lower-case search string
  *Data: nameAry("LOBLAW,BOB B")=1
  *Test: s result=$$findNames^XCHR310EX5YCH("loblaw,bob b",.nameAry,.matches)
  *Run Error: <COMMAND>searchNamesTestHelper+8^XCHR310TESTS *Function must
    return a value at findNames+7^XCHR310EX5YCH

5 - Multiple non-exact duplicate matches, one leading and one trailing non-match
  *Data: nameAry("ALGEBRA,B B")=3,nameAry("LOB,B B")=2,nameAry("LOBLAW,BOB
    B")=5,nameAry("ZEBRA,B B")=3
  *Test: s result=$$findNames^XCHR310EX5YCH("LOB",.nameAry,.matches)
  *Run Error: <COMMAND>searchNamesTestHelper+8^XCHR310TESTS *Function must
    return a value at findNames+7^XCHR310EX5YCH

```

## 源代码

下面是本函数使用的源代码。

```auto
  SET nameAry("ALGEBRA,B B")=1
  SET nameAry("ALGEBRA,B B")=1
  SET nameAry("LOB,B B")=1
  SET nameAry("LOBLAW,BOB B")=1
  SET nameAry("ZEBRA,B B")=1
  ;SET nameAry(3)="Tom"
  ;SET nameAry(4)="Carrie"
  ;SET nameAry(5)="Tomcat"
  ;SET nameAry ="t"
  S search="LOB"
  DO findNames(search,.nameAry,.matches)
  SET name=""
  ;f s name=$O(array(name)) q:name="" w !,array(name)
  f s name=$O(matches(name)) q:name="" w !,name
  QUIT
findNames(search,nameAry,matches)
 n name
 n matchCount
 S search=$$up(search)
 S name=""
 S matchCount=0
 FOR SET name=$O(nameAry(name)) Q:name="" D
 . If ($FIND($$up(name),search)>0) D
 . . S matches(name)=nameAry(name)
 . . S matchCount=matchCount+nameAry(name)
 w !,matchCount
 QUIT matchCount
up(str)
 QUIT $TRANSLATE(str,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ")

```
