noobsa
@noobsa
Поступил на 1 курс в вуз, учу программирование

Почему при выводе блока с таблицой выбивает ошибку?

#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <math.h>
#include <Windows.h>
#define LG	73		
char linija1[LG + 1] = "------------------------------------------------------";
char linija2[LG + 1] = "-----------------------------";
int k = 1;
struct tableI
{
	char* name[4];
	float doctor[100];
	float bunk[100];
} tableI;

void get_name(char nm[]) {
	printf("Введите %d-ую страну : ", k);
	scanf_s("%s", &nm, 80);
	++k;

}
void get_doc(float dc[]) {
	float res = 1;
	do {
		if (dc < 0 || res != 1)
			printf("Вы ошиблись, введите повторно кол-во врачей: ");
		else
			printf("Введите  кол-во врачей: ");
		res = scanf_s("%f", &dc);
		while (getchar() != '\n');

	} while (dc < 0 || res != 1);
}
void get_bunk(float bk[]) {
	float res = 1;
	do {
		if (bk < 0 || res != 1)
			printf("Вы ошиблись, введите повторно кол-во врачей: ");
		else
			printf("Введите  кол-во врачей: ");
		res = scanf_s("%f", &bk);
		while (getchar() != '\n');
	} while (bk < 0 || res != 1);
}
int main()
{
	setlocale(LC_ALL, "rus");

	int i;
	float n, min, j;
	struct tableI a;	// struct Counry
	printf("Введите страны: ");
	get_name(a.name[0]);
	get_name(a.name[1]);
	get_name(a.name[2]);
	get_name(a.name[3]);
	struct tableI b;						// count doc
	printf("Введите кол-во врачей за 1940: ");
	get_doc(&b.doctor[0]);						// 1940
	get_doc(&b.doctor[1]);
	get_doc(&b.doctor[2]);
	get_doc(&b.doctor[3]);
	printf("Введите кол-во врачей за 1960: ");
	get_doc(&b.doctor[4]);						// 1960
	get_doc(&b.doctor[5]);
	get_doc(&b.doctor[6]);
	get_doc(&b.doctor[7]);
	struct tableI c;	// count bunk
	printf("Введите кол-во коек в 1940");
	get_bunk(&c.bunk[0]);						// 1940
	get_bunk(&c.bunk[1]);
	get_bunk(&c.bunk[2]);  
	get_bunk(&c.bunk[3]);
	printf("Введите кол-во коек в 1940");
	get_bunk(&c.bunk[4]);						// 1960
	get_bunk(&c.bunk[5]);
	get_bunk(&c.bunk[6]);
	get_bunk(&c.bunk[7]);

	//вывод шапки 
	printf("%s\n", linija1);
	printf("| Республика | Число врачей | Число коек | Отношение |\n");
	printf("%s\n", linija1);
	// вывод данных
	min = b.doctor[1] / c.bunk[1];
	for (i = 0; i <= 3; i++)
	{
		n = b.doctor[i] / c.bunk[i];
		printf("|   %-9s|   %-11.2f|   %-9.2f|   %-8.2f| \n", a.name[i], b.doctor[i], c.bunk[i], n);
		printf("%s\n", linija1);
		if (min > n)
			min = n;
	}
	printf("min: %.2f \n", min);

	printf("Введите число врачей: ");
	scanf_s("%f", &j);
	//вывод шапки table 2
	printf("%s \n", linija2);
	printf("| Республика | Число врачей | \n");
	printf("%s \n", linija2);
	// вывод данных
	for (i = 0; i <= 3; i++)
	{
		if (b.doctor[i + 4] < j)
		{
			printf("|   %-9s|   %-11.2f| \n", a.name[i], b.doctor[i + 4]);
			printf("%s\n", linija2);
		}
	}

	return 0;
}


spoiler
/* Примеры вывода, когда доходит до таблицы просто ее не выводит

---------------------------------------------------------------------------------
| Республика | 1940 г || 1960 г |
---------------------------------------------------------------------------------
| | Число врачей | Число коек || Число врачей | Число коек |
---------------------------------------------------------------------------------
| РСФСР | 82.2 | 482 || 221.2 | 939.4 |
---------------------------------------------------------------------------------
| Украина | 33.4 | 157.6 || 73.8 | 318 |
---------------------------------------------------------------------------------
| Латвия | 1.7 | 12 || 5.2 | 23.2 |
---------------------------------------------------------------------------------
| Эстония | 0.07 | 0.1 || 2.7 | 11.2 |
---------------------------------------------------------------------------------
*/

/* Вывод на А , найти min Соотношения

------------------------------------------------------
| Республика | Число врачей | Число коек | Отношение |
------------------------------------------------------
| РСФСР | 82.2 | 482 | 82.2/482 |
------------------------------------------------------
| Украина | 33.4 | 157.6 | 33.4/157.6|
------------------------------------------------------
| Латвия | 1.7 | 12 | 1.7/12 |
------------------------------------------------------
| Эстония | 0.07 | 0.1 | 0.07/0.1 |
------------------------------------------------------
*/

/* // Вывод на B 1960 г. в каких республиках врачей < M тыс. |-- республика --|-- число врачей --|

М = 100 тыс
----------------------------------
| Республика | Число врачей |
----------------------------------
| РСФСР | 221.2 |
----------------------------------
| Украина | 73.8 |
----------------------------------
| Латвия | 5.2 |
----------------------------------
| Эстония | 2.7 |
----------------------------------



ПРограмма на Си, #си - не нашел.
  • Вопрос задан
  • 55 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
struct tableI
{
  char* name[4];
  float doctor[100];
  float bunk[100];
} tableI;
...
  struct tableI a;
...
  get_name(a.name[0]);

Почему при выводе блока с таблицой выбивает ошибку?

Потому что ты вызываешь get_name с неинициализированным указателем a.name[...]. Чтобы это место заработало, надо каким-нибудь образом выделить память для a.name[...]. Например таким:

struct tableI
{
  char name[4][100];
  float doctor[100];
  float bunk[100];
} tableI;
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы