Почему не выводит последний столбик в таблице? - 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"
Объяснение кода листинга программы
- Объявлены три строковые переменные: name, group, power типа char с фиксированной длиной в 20, 5 и 5 символов соответственно.
- Выполняется функция printf, которая выводит на экран с помощью формата строки с общим количеством символов 37, из которых 10 отведены под столбец
group
, 12 под столбецpower
и оставшиеся 15 под столбецname
. - В формате строки используются спецификаторы для заполнения всех доступных символов в строке.
- Число 37 в спецификаторе %37s указывает на то, что нужно вывести строку, которая будет заполнена пробелами до 37 символов.
- Число 10 в спецификаторе %10s указывает на то, что нужно вывести строку, которая будет заполнена пробелами до 10 символов.
- Число 12 в спецификаторе %12s указывает на то, что нужно вывести строку, которая будет заполнена пробелами до 12 символов.
- Число 10 в спецификаторе %10.0lf указывает на то, что нужно вывести число с точностью до 10 знаков после запятой.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д