1

print_vector 関数を変更せずに C のベクトルから要素を削除するにはどうすればよいですか?

1)キーボードから指定された位置の要素を削除するために作成したコードは次のとおりです。

void remove_a_cost(int a)
{
int nr, c;
printf("Give the number of cost for remove: ");
scanf("%d", &nr);
if(nr>a)
{
    printf("The remove is impossible!\n");
}
else
{
    for(c=nr;c<=a;c++)
    {
            chelt[c]=chelt[c+1];
    }
}
}

2)これが印刷機能です

void print_costs(int a)
{
int i;
if(a>0 && a<=n)
{
    for(i=1;i<=a;i++)
    {
        printf("\nCost %d\n\n",i);
        printf("Day: %s\n", chelt[i].day);
        printf("Sum: %d\n", chelt[i].sum);
        printf("Type: %s\n", chelt[i].type);
    }
}

}

3) これが add_new_cost() 関数です

int add_new_cost()
{
    int a,i;
    printf("Nr of costs = ");
    scanf("%d", &a);
    if(a>0 && a<=n)
        {
            for(i=1;i<=a;i++)
                {
                    printf("\nType the attributes for cost %d",i);
                    printf("\nDay = ");
                    scanf("%s",chelt[i].day);
                    printf("Sum = ");
                    scanf("%d", &chelt[i].sum);
                    printf("Type = ");
                    scanf("%s",chelt[i].type);
                }
        }
        return a;
}

4) これが主な機能です

int main()
{
    setbuf(stdout,NULL);
    int b,choice;

    do
    {
     printf("\nMenu\n\n");
     printf("1 - Add a cost\n");
     printf("2 - Print a cost\n");
     printf("3 - Update a cost\n");
     printf("4 - Delete a cost\n");
     printf("5 - Exit\n\n");
     printf("Command = ");
     scanf("%d",&choice);

     switch (choice)
     {
     case 1: b=add_new_cost();
              break;
     case 2: print_costs(b);
              break;
     case 3: update_cost(b);
             break;
     case 4: remove_a_cost(b);
             break;
     case 0: printf("Goodbye\n");
             break;
     default: printf("Wrong Choice. Enter again\n");
              break;
     }

    } while (choice != 0);
    return 0;
}

例: ベクトルに 4 つの要素がある場合:

1)Type the attributes for cost
Day = luni
Sum = 2
Type = dsasa

Type the attributes for cost 2
Day = marti
Sum = 23
Type = adsds

Type the attributes for cost 3
Day = miercuri
Sum = 23
Type = asd

Type the attributes for cost 4
Day = joi
Sum = 232
Type = asdas

そして私は削除しようとします.3番目の要素としましょう.これは私が印刷したときに受け取るものです:

Cost 1
Day: luni
Sum: 20
Type: maradf

Cost 2
Day: marti
Sum: 23
Type: afas

Cost 3
Day: joi
Sum: 45
Type: sdfadsf

Cost 4
Day: 
Sum: 0
Type:

要素 (COST 4) は、削除されるべきときに表示されます。印刷機能を変更せずに要素を削除する解決策はありますか?

4

2 に答える 2

1

質問を更新した後、すべてが明確になりました。次の変更を行います。

int remove_a_cost(int a)
{
    int nr, c;
    printf("Give the number of cost for remove: ");
    scanf("%d", &nr);
    if (nr > a)
    {
        printf("The remove is impossible!\n");
    }
    else
    {
        for (c = nr; c <= a; c++)
        {
            chelt[c] = chelt[c + 1];
        }
        a--; // decrease a
    }
    return a; // return new size
}

switch (choice)
{
case 1: b = add_new_cost();
    break;
case 2: print_costs(b);
    break;
case 3: update_cost(b);
    break;
case 4: b = remove_a_cost(b); // <- store returned value in b
    break;
case 0: printf("Goodbye\n");
    break;
default: printf("Wrong Choice. Enter again\n");
    break;
}
于 2013-03-09T17:21:05.933 に答える
0

あなたのコードは少し面倒です。変数には意味のある名前を付けるようにしてください。

しかし、私が理解しているように、print_costs 関数は、出力する必要がある最後の「コスト」の値を受け取ります。

おそらく、「コスト」を削除した後に間違った値を渡している可能性があります。

于 2013-03-09T16:36:22.243 に答える