Почему не выводит последний столбик в таблице? - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Написал программу для вывода таблицы, но он отказывается запоминать и корректно выводить последний столбик, что делать? Реализация Введите команду:1 Количество записей 0 Введите команду:3 Введите номер записи: 0 Введите данные: Соя Б 13000 45 Данные записаны. Введите команду:3 Введите номер записи: 1 Введите данные: Чумиза З 8000 17 Введите команду:3 Введите номер записи: 2 Введите данные: Рис З 25650 24 Данные записаны. Введите команду:5
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
struct Table {
    FILE *f;
    struct Info{
        char name[20],group[5], power [5];
        double mass;        
    } info;
};
void table_open(Table *t);  // открыть файл
void table_close(Table *t);
int table_size(Table *t); // количество записей
void table_read(Table *t, int n); // считать запись n (0..size-1)
void table_write(Table *t, int n); // записать запись n (0..size) n==size – добавить новую
void table_delete(Table *t, int n); // удалить запись n (0..size-1)
void table_print(Table *t); // напечатать содержимое таблицы
void resize(Table *t, int n);
int main()
{ Table t;
 setlocale(LC_ALL, "Russian");
  int cmd=1,n;
  table_open(&t);
  while(cmd!=0){
    printf("Введите команду:"); scanf("%d",&cmd);
    switch(cmd){
         case 1: 
            printf("Количество записей %d\n",table_size(&t)); break;
        case 2: 
            if(!table_size(&t)){
            printf("Нет записей\n");
            break;
        }
            printf("Введите номер записи:"); 
                    scanf("%d",&n);
                        table_read(&t,n);
                        printf("Запись %d содержит: %37s %10s %12s %10.0lf \n",n, t.info.name,t.info.group,t.info.power, t.info.mass);
               break;
        case 3:
            printf ("Введите номер записи: "); 
                    int i;
                    i=table_size(&t);
                    do {
                        scanf ("%d", &n);
                        if (n>i)
                        printf ("Ошибка. \n Введите правильный номер записи", i);
                        else break;
                    } while (1);
                        printf ("Введите данные: ");
                        scanf ("%s %s %s %lf", t.info.name,t.info.group,t.info.power, &t.info.mass);
                        table_write(&t, n);
                        printf ("Данные записаны. \n"); 
               break;
         case 4:
                    if (!table_size(&t)){
                        printf ("Пусто\n");
                        break;
                     }
            printf ("Введите номер записи: "); 
            do{
            scanf ("%d", &n);
            if (n>i)
            printf ("Ошибка. Введите правильный номер записи", i);
            else
            break;} while(1);
            table_delete(&t,n);
                        printf ("Данные удалены. \n"); 
            break;
         case 5:
                        printf ("Таблица:\n");
                        printf("\t\t\t\tСельскохозяйственные культуры \n\n"); 
                        printf ("\t \t \t \tНаименование  Тип  Посевная площадь   Урожайност \n");
                        table_print (&t);
               break;
   }
  }
  table_close(&t);
}
 
void table_open(Table *t){
   int n=0;
    t->f=fopen("table.txt","r+b"); 
    if(t->f==NULL){ 
        t->f=fopen("table.txt","w+b"); 
        fwrite(&n,sizeof(n),1,t->f);
    }
}
void resize(Table *t, int n){
fseek(t->f, 0, SEEK_SET);
fwrite(&n, sizeof(int), 1, t->f);
}
void table_close(Table *t){
   fclose (t->f);
}
int table_size(Table *t)
{
   int n;
   fseek (t->f, 0 , SEEK_SET);
   fread (&n, sizeof (int), 1,t->f);
   return n;
}
void table_read(Table *t, int n)
{
    fseek (t->f, n*sizeof (t->info) + sizeof(int), SEEK_SET);
    fread (t, sizeof (t->info), 1,t->f);
}
void table_write(Table *t, int n)
{
    fseek (t->f,n*sizeof (t->info) + sizeof(int), SEEK_SET);
    fwrite (t, sizeof (t->info), 1, t->f);
    int k=table_size (t);
    if (k==n) 
    resize (t,n+1);
}
void table_delete(Table *t, int n)
{
    int k=table_size(t);
    table_read (t, k-1);
    table_write (t,n);
    resize (t, k-1);
}
 
void table_print(Table *t)
{
    int k=table_size(t);
    for (int i=0; i<k; i++)
    {
        table_read (t,i); 
        printf ("%37s %10s %12s %10.0lf \n" ,t->info.name,t->info.group,t->info.power, t->info.mass);
    }
    
}

Решение задачи: «Почему не выводит последний столбик в таблице?»

textual
Листинг программы
char name[20],group[5], power [5];
printf ("%37s %10s %12s %10.0lf \n"

Объяснение кода листинга программы

  1. Объявлены три строковые переменные: name, group, power типа char с фиксированной длиной в 20, 5 и 5 символов соответственно.
  2. Выполняется функция printf, которая выводит на экран с помощью формата строки с общим количеством символов 37, из которых 10 отведены под столбец group, 12 под столбец power и оставшиеся 15 под столбец name.
  3. В формате строки используются спецификаторы для заполнения всех доступных символов в строке.
  4. Число 37 в спецификаторе %37s указывает на то, что нужно вывести строку, которая будет заполнена пробелами до 37 символов.
  5. Число 10 в спецификаторе %10s указывает на то, что нужно вывести строку, которая будет заполнена пробелами до 10 символов.
  6. Число 12 в спецификаторе %12s указывает на то, что нужно вывести строку, которая будет заполнена пробелами до 12 символов.
  7. Число 10 в спецификаторе %10.0lf указывает на то, что нужно вывести число с точностью до 10 знаков после запятой.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.2 из 5
Похожие ответы