Delphi 对程序进行编码,以显示用户名的前3个辅音和user'的最后3个字母;姓氏和身份证的第二个数字

Delphi 对程序进行编码,以显示用户名的前3个辅音和user'的最后3个字母;姓氏和身份证的第二个数字,delphi,delphi-xe,Delphi,Delphi Xe,我正在尝试编写一个程序,显示用户名的前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 := '';

我正在尝试编写一个程序,显示用户名的前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) ;

任何帮助都将不胜感激。

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

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);
i:=0;
j:=0;
新名称:='';
而我<长度(名称)
开始
公司(一);
如果不是(用元音命名[i]),那么
开始
公司(一);
newname:=newname+name[i];
如果j=3,则i:=长度(名称);
结束;
结束;
i:=长度(姓氏);
如果i>3
然后newsurname:=副本(姓氏,i-3,3)
else newsurname:=姓氏;
newid:='';
对于k:=1到长度(id)do newid:=newid+id[2*k];
结果:=newname+newsurname+newID);
插入(“*”,结果,7);

我会将所有解析代码移动到一个函数中,您只需传递名字、姓氏和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.

不,我不是故意这样写的,你的方式看起来更复杂。你在任务的哪一部分遇到了麻烦?您是否已经费心使用调试器了?您尝试了哪些输入,得到了哪些输出?您希望得到什么样的输出呢?@SirRufo将我的代码改成了其他代码,所以我无法准确地引用。我的名字部分有问题,我总是收到元音字母。@ SirRufo,请把它改回原来的样子。我不喜欢这个。不要用自己的代码来替换元音,而是考虑使用Strutus.SrrrRePi饰()。你的代码被破解了。第二个
inc(i)
应该是
inc(j)
。然后
如果j=3,则断开
甚至更好,根本不使用
j
,并且
如果长度(newname)=3,则中断,这更容易理解。然后,对于k:=1到length(id)的最后一个
,执行newid:=newid+id[2*k]刚刚被破坏,将使缓冲区溢出。。。因此,对于k:=1到长度(id)div 2 do…..