【问题标题】:Coding a program to display first 3 consonants of users name and last 3 letters of user's surname and every second digit of ID编写一个程序以显示用户名的前 3 个辅音和用户姓氏的后 3 个字母以及 ID 的每隔一个数字
【发布时间】:2014-06-18 17:03:05
【问题描述】:

我正在尝试编写一个程序来显示用户名的前 3 个辅音和用户姓氏的后 3 个字母以及 ID 的每隔一个数字,并在第 7 位添加一个星号。我得到了正确的 ID 部分,但不是姓名和姓氏部分。

procedure TForm1.N31Click(Sender: TObject);


var
 Name,Surname,ID,newname,newsurname,newID,newstring:string;
 i,j,k:integer;
begin
newname:='';
newsurname:='';
newid := '';
name := UPPERCASE(inputbox('Name','First name',''));
Surname := inputbox('Surname','Last name','');
ID := Inputbox('ID','ID boy','');
for i := length(name) downto 1 do
begin
if name[i] in ['A','E','I','O','U'] then
 delete(name,i,1);
 newname := newname + name[i];
 newname := copy(newname,1,3);
 end;

 begin
j := length(surname);
 newsurname := copy(surname,j-2,3);
  end;
 for k := 1 to length(id) do
   newid := newid + id[2*k];

 newstring := (newname+newsurname+newID);
 insert('*',newstring,7);

 redoutput.Lines.Add(newstring) ;

任何帮助将不胜感激。

【问题讨论】:

  • 不,我不是故意这样写的,你的方式看起来更复杂。
  • 您在任务的哪一部分遇到了问题?你有没有费心使用调试器?你尝试过什么输入,得到了什么输出?你期望得到什么输出?
  • 好吧@SirRufo 将我的代码更改为其他内容,因此我无法准确引用。我的名字部分有问题,我总是收到带有元音的字母。
  • @SirRufo 请将它改回我不喜欢这个的样子。
  • 与其编写自己的代码来替换元音,不如考虑使用 StrUtils.StringReplace()。

标签: delphi delphi-xe


【解决方案1】:

我会将您所有的解析代码移动到一个函数中,您可以只传递名字、姓氏和 ID 并获得返回的生成值。这是一个测试应用程序,可以做到这一点 - 然后你可以使用任何你想要的方式来获取传递给它的值。

program Project1;

uses
  SysUtils;

function GetID(const sName, sSurname, sID: string): string;
var
  i: Integer;
const
  // You can remove the lower case letters if you want to always
  // convert sName to upper case first.
  VowelChars = ['A', 'E', 'I', 'O', 'U', 'a', 'e', 'i', 'o', 'u'];
begin
  Result := '';
  for i := 1 to Length(sName) do
  begin
    // Earlier versions of Delphi: if not (sName[i] in VowelChars) then
    if not CharInSet(Name[i], VowelChars) then 
      Result := Result + sName[i];
    if Length(Result) = 3 then
      Break;
  end;

  // Last 3 characters of Surname
  Result := Result + Copy(sSurName, Length(sSurName) - 2, 3);

  // Every even digit of ID
  for i := 1 to Length(sID) do
    if not Odd(i) then
      Result := Result + sID[i];
  // Star in 7th position
  if Length(Result) > 7 then
    Result[7] := '*';
end;

begin
  WriteLn(GetID('James', 'Johnson', '123456ABCD'));
  ReadLn;
end.

【讨论】:

    【解决方案2】:

    我将代码的主要部分重写如下

    i:= 0;
    j:= 0;
    newname:= '';
    while i < length (name)
     begin
      inc (i);
      if not (name[i] in vowels) then
       begin
        inc (i);
        newname:= newname + name[i];
        if j = 3 then i:= length (name);
       end;
     end;
    
    i:= length (surname);
    if i > 3
     then newsurname:= copy (surname, i - 3, 3) 
     else newsurname:= surname;
    
    newid:= '';
    for k := 1 to length (id) do newid := newid + id[2*k];
    result:= newname + newsurname + newID);
    insert ('*', result, 7);
    

    【讨论】:

    • 您的代码已损坏。第二个inc(i) 应该是inc(j)。然后if j = 3 then break; 或者甚至最好不要jif length(newname)=3 then break;,这更容易理解。然后你的最后一个for k := 1 to length (id) do newid := newid + id[2*k]; 刚刚坏了,会溢出缓冲区......所以应该是for k := 1 to length(id) div 2 do ....
    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 2014-08-21
    • 2022-07-30
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    • 2021-05-05
    • 2013-01-30
    相关资源
    最近更新 更多