Дан файл f, содержащий сведения о веществах. Найти удельные веса и названия всех полупроводников. - C (СИ)
Формулировка задачи:
Дан файл f, содержащий сведения о веществах: указывается название вещества, его удельный вес и проводимость (проводник, полупроводник, изолятор). 1) Найти удельные веса и названия всех полупроводников. 2) Выбрать данные о проводниках и упорядочить их по убыванию удельных весов.
Решение задачи: «Дан файл f, содержащий сведения о веществах. Найти удельные веса и названия всех полупроводников.»
textual
Листинг программы
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
typedef enum
{
Conductor = 1,
Semiconductor = 2,
Insulator = 3
}Conduction;
char* ConductionToStr(Conduction n)
{
switch(n)
{
case 1:
return "Conductor";
case 2:
return "Insulator";
case 3:
return "Semiconductor";
default:
return "Unknown";
}
}
typedef struct
{
char name[100];
Conduction cond;
double specificWeight;
} Substance;
void Swap( Substance * x, Substance *y)
{
Substance temp = *x;
*x = *y;
*y = temp;
}
int GetEntriesLength( FILE * inf)
{
char chartmp[80];
int len = 0;
while(fgets(chartmp,80,inf)!= NULL)
len++;
return len;
}
void BubbleSort(Substance arr[], int n)
{
int i, j;
for (i = 0; i < n-1; i++)
for (j = 0; j < n-i-1; j++)
if (arr[j].specificWeight < arr[j+1].specificWeight)
Swap(&arr[j], &arr[j+1]);
}
void PrintArr(const Substance arr[], int n)
{
int i = 0;
printf("Name | Specific Weight | Conduction: \n");
for(i = 0; i < n;i++)
{
printf("%s %.2lf %s\n",
arr[i].name, arr[i].specificWeight,ConductionToStr(arr[i].cond));
}
}
int main(void)
{
const char* path = "Substanses.txt";
int arrLen = 0, i = 0;
FILE* inf = NULL;
Substance *arr = NULL;
Substance curr = {"",0,0};
if ((inf = fopen(path,"r")) == NULL)
{
fprintf(stderr, "Error in opening file.\n");
exit(EXIT_FAILURE);
}
arrLen = GetEntriesLength(inf);
fseek(inf,0,SEEK_SET);
arr= malloc(sizeof(Substance) * arrLen);
for(;;)
{
if( fscanf(inf,"%s %lf %u",curr.name, &curr.specificWeight,&curr.cond) != 3)
break;
arr[i] = curr;
i++;
}
PrintArr(arr, arrLen);
BubbleSort(arr,arrLen);
puts("\nSorted Array:");
PrintArr(arr, arrLen);
fclose(inf);
free(arr);
}