Список разделов › Прочее › Свои темы
Куратор темы: unicorn55
Сделаноunicorn55 писал(а):Наша задача написать программку которая считывает этот текст и заносит данные в оперативную память (в массив)
#include <stdlib.h>
#include <stdio.h>
// число УИКов
#define NUIK 95185
// имя исходного текстового файла, откуда будем считывать данные
char* txt_filename = "p2011.txt";
// сам файл
FILE* txt_file;
// буфер для скачивания сюда первой ненужной строки
char str[2000];
// фиктивная переменная для записи в нее ненужных данных
int t;
// Тип из которых будет состоять большой массив по всем УИКам
typedef struct {
int nib; // число недействительных избирательных беллютеня
int dib; // число действительных избирательных беллютеня
int spr; // число проголосовавших за Справедливую Россию
int ldpr; // число проголосовавших за ЛДПР
int pr; // число проголосовавших за Правое Дело
int kprf; // число проголосовавших за КПРФ
int yabl; // число проголосовавших за Яблоко
int er; // число проголосовавших за Единую Россию
int pd; // число проголосовавших за Правое Дело
} t_uik;
// Большой массив данных по всем 95185 УИКам
// первые две строчки не используются чтобы номера элементов массива
// соответствовали номерам строк в исходной Excel-таблице
t_uik All[NUIK+2];
// функция считывает символы из текстового файла f пока не считает символ табуляции
// таким образом она пропускает одно значение в таблице и переходит к следующему
void skip_to_tab(FILE* f) {
while (fgetc(f) != '\t');
}
//=====================================//
//======= Главная программа ===========//
//=====================================//
int main() {
int i; // счетчик для цикла от 2 до 95186
txt_file = fopen(txt_filename,"r"); // открываем текст для чтения
if (txt_file==NULL) {printf("Error: fopen\n"); exit(1);}
fgets(str,2000,txt_file); // считываем первую строку, это заголовки столбцов, они нам не нужны
// цикл считывания данных по всем УИКам
for (i=2;i<2+NUIK;i++) {
// пропускаем первые 4 текстовые значения таблицы (они нам не нужны)
skip_to_tab(txt_file);
skip_to_tab(txt_file);
skip_to_tab(txt_file);
skip_to_tab(txt_file);
// а дальше идут числа, считываем их с помощью fscanf
fscanf(txt_file,
"%d%d%d%d%d%d%d%d%d" // 9 ненужных
"%d%d" // 2 нужных (это NIB и DIB)
"%d%d%d%d%d%d%d%d" // 8 ненужных
"%d%d%d%d%d%d%d", // 7 нужных — это голоса за каждые из 7 партий
&t,&t,&t,&t,&t,&t,&t,&t,&t, // ненужные, считываем в фиктивную переменную
&(All[i].nib),&(All[i].dib), // заполняем NIB и DIB
&t,&t,&t,&t,&t,&t,&t,&t, // ненужные, считываем в фиктивную переменную
// считываем голоса за 7 партий
&(All[i].spr), // СПР
&(All[i].ldpr), // ЛДПР
&(All[i].pr), // Патриоты России
&(All[i].kprf), // КПРФ
&(All[i].yabl), // Яблоко
&(All[i].er), // ЕР
&(All[i].pd)); // Правое Дело
}
// данные считаны, закрываем файл
fclose(txt_file);
// Выводим данные любой строчки для сверки с данными в Excel, чтобы удостоверится что
// данные считались успешно
// Например, возьмем самую последнюю строчку.
i = 95186;
printf("i=%d NIB=%d DIB=%d spr=%d ldpr=%d pr=%d kprf=%d yabl=%d er=%d pd=%d\n",
i, All[i].nib, All[i].dib,
All[i].spr, All[i].ldpr, All[i].pr, All[i].kprf, All[i].yabl, All[i].er, All[i].pd);
}
unicorn55 писал(а):Нас интересуют столбцы под номерами
14 Число недействительных избирательных бюллетеней (сокращенно НИБ)
15 число действительных избирательных бюллетеней (сокращенно ДИБ)
...
24 СПР
25 ЛДПР
26 ПР
27 КПРФ
28 ЯБЛ
29 ЕР
30 ПД
#include <stdlib.h>
#include <stdio.h>
// число УИКов
#define NUIK 95185
// имя исходного текстового файла, откуда будем считывать данные
char* txt_filename = "p2011.txt";
// сам файл
FILE* txt_file;
// буфер для скачивания сюда первой ненужной строки
char str[2000];
// фиктивная переменная для записи в нее ненужных данных
int t;
// Тип из которых будет состоять большой массив по всем УИКам
typedef struct {
int izb; // число избирателей в списке
int nib; // число недействительных избирательных беллютеня
int dib; // число действительных избирательных беллютеня
int spr; // число проголосовавших за Справедливую Россию
int ldpr; // число проголосовавших за ЛДПР
int pr; // число проголосовавших за Правое Дело
int kprf; // число проголосовавших за КПРФ
int yabl; // число проголосовавших за Яблоко
int er; // число проголосовавших за Единую Россию
int pd; // число проголосовавших за Правое Дело
} t_uik;
// Большой массив данных по всем 95185 УИКам
// первые две строчки не используются чтобы номера элементов массива
// соответствовали номерам строк в исходной Excel-таблице
t_uik All[NUIK+2];
// функция считывает символы из текстового файла f пока не считает символ табуляции
// таким образом она пропускает одно значение в таблице и переходит к следующему
void skip_to_tab(FILE* f) {
while (fgetc(f) != '\t');
}
//=====================================//
//======= Главная программа ===========//
//=====================================//
int main() {
int i; // счетчик для цикла от 2 до 95186
txt_file = fopen(txt_filename,"r"); // открываем текст для чтения
if (txt_file==NULL) {printf("Error: fopen\n"); exit(1);}
fgets(str,2000,txt_file); // считываем первую строку, это заголовки столбцов, они нам не нужны
// цикл считывания данных по всем УИКам
for (i=2;i<2+NUIK;i++) {
// пропускаем первые 4 текстовые значения таблицы (они нам не нужны)
skip_to_tab(txt_file);
skip_to_tab(txt_file);
skip_to_tab(txt_file);
skip_to_tab(txt_file);
// а дальше идут числа, считываем их с помощью fscanf
fscanf(txt_file,
"%d" // 1 ненужный (номер уика)
"%d" // 1 нужный — число избирателей в списке
"%d%d%d%d%d%d%d" // 7 ненужных
"%d%d" // 2 нужных (это NIB и DIB)
"%d%d%d%d%d%d%d%d" // 8 ненужных
"%d%d%d%d%d%d%d", // 7 нужных — это голоса за каждые из 7 партий
&t, // ненужный считываем в фиктивную переменную
&(All[i].izb), // число избирателей в списке
&t,&t,&t,&t,&t,&t,&t, // ненужные, считываем в фиктивную переменную
&(All[i].nib),&(All[i].dib), // заполняем NIB и DIB
&t,&t,&t,&t,&t,&t,&t,&t, // ненужные, считываем в фиктивную переменную
// считываем голоса за 7 партий
&(All[i].spr), // СПР
&(All[i].ldpr), // ЛДПР
&(All[i].pr), // Патриоты России
&(All[i].kprf), // КПРФ
&(All[i].yabl), // Яблоко
&(All[i].er), // ЕР
&(All[i].pd)); // Правое Дело
}
// данные считаны, закрываем файл
fclose(txt_file);
// Выводим данные любой строчки для сверки с данными в Excel, чтобы удостоверится что
// данные считались успешно
// Например, возьмем самую последнюю строчку.
i = 95186;
printf("i=%d IZB=%d NIB=%d DIB=%d spr=%d ldpr=%d pr=%d kprf=%d yabl=%d er=%d pd=%d\n",
i, All[i].izb, All[i].nib, All[i].dib,
All[i].spr, All[i].ldpr, All[i].pr, All[i].kprf, All[i].yabl, All[i].er, All[i].pd);
}
unicorn55 писал(а):Дополнительные библиотеки — Glut (для вывода графики, она кроссплатформенная)
#include <SDL.h> // Нужно для графики
#include <stdlib.h>
#include <stdio.h>
SDL_Surface* screen = 0;
SDL_Event event;
int running = 0;
#define WIDTH 700 // Ширина экрана
#define HEIGHT 700 // Высота экрана
void putpixel(SDL_Surface* screen, int x, int y, int color) {
int* pixels=(int*)screen->pixels;
y=HEIGHT-y-1;
if (x>=WIDTH || y>=HEIGHT || x <0 || y <0) {printf("%d %d\n", x,y); return;}
pixels[WIDTH*y+x]=color;
SDL_UpdateRect(screen, x, y, 1, 1);
}
// число УИКов
#define NUIK 95185
// имя исходного текстового файла, откуда будем считывать данные
char* txt_filename = "p2011.txt";
// сам файл
FILE* txt_file;
// буфер для скачивания сюда первой ненужной строки
char str[2000];
// фиктивная переменная для записи в нее ненужных данных
int t;
int total_izb;
int total_golos;
// Тип из которых будет состоять большой массив по всем УИКам
typedef struct {
int izb; // число избирателей в списке
int nib; // число недействительных избирательных беллютеня
int dib; // число действительных избирательных беллютеня
int spr; // число проголосовавших за Справедливую Россию
int ldpr; // число проголосовавших за ЛДПР
int pr; // число проголосовавших за Правое Дело
int kprf; // число проголосовавших за КПРФ
int yabl; // число проголосовавших за Яблоко
int er; // число проголосовавших за Единую Россию
int pd; // число проголосовавших за Правое Дело
} t_uik;
// Большой массив данных по всем 95185 УИКам
// первые две строчки не используются чтобы номера элементов массива
// соответствовали номерам строк в исходной Excel-таблице
t_uik All[NUIK+2];
// функция считывает символы из текстового файла f пока не считает символ табуляции
// таким образом она пропускает одно значение в таблице и переходит к следующему
void skip_to_tab(FILE* f) {
while (fgetc(f) != '\t');
}
//=====================================//
//======= Главная программа ===========//
//=====================================//
int main(int argc, char *argv[]) {
int i; // счетчик для цикла от 2 до 95186
int bull; // число бюллетеней действительных плюс недействительных
txt_file = fopen(txt_filename,"r"); // открываем текст для чтения
if (txt_file==NULL) {printf("Error: fopen\n"); exit(1);}
fgets(str,2000,txt_file); // считываем первую строку, это заголовки столбцов, они нам не нужны
// цикл считывания данных по всем УИКам
for (i=2;i<2+NUIK;i++) {
// пропускаем первые 4 текстовые значения таблицы (они нам не нужны)
skip_to_tab(txt_file);
skip_to_tab(txt_file);
skip_to_tab(txt_file);
skip_to_tab(txt_file);
// а дальше идут числа, считываем их с помощью fscanf
fscanf(txt_file,
"%d" // 1 ненужный (номер уика)
"%d" // 1 нужный — число избирателей в списке
"%d%d%d%d%d%d%d" // 7 ненужных
"%d%d" // 2 нужных (это NIB и DIB)
"%d%d%d%d%d%d%d%d" // 8 ненужных
"%d%d%d%d%d%d%d", // 7 нужных — это голоса за каждые из 7 партий
&t, // ненужный считываем в фиктивную переменную
&(All[i].izb), // число избирателей в списке
&t,&t,&t,&t,&t,&t,&t, // ненужные, считываем в фиктивную переменную
&(All[i].nib),&(All[i].dib), // заполняем NIB и DIB
&t,&t,&t,&t,&t,&t,&t,&t, // ненужные, считываем в фиктивную переменную
// считываем голоса за 7 партий
&(All[i].spr), // СПР
&(All[i].ldpr), // ЛДПР
&(All[i].pr), // Патриоты России
&(All[i].kprf), // КПРФ
&(All[i].yabl), // Яблоко
&(All[i].er), // ЕР
&(All[i].pd)); // Правое Дело
}
// данные считаны, закрываем файл
fclose(txt_file);
// Выводим данные любой строчки для сверки с данными в Excel, чтобы удостоверится что
// данные считались успешно
// Например, возьмем самую последнюю строчку.
i = 95186;
printf("i=%d IZB=%d NIB=%d DIB=%d spr=%d ldpr=%d pr=%d kprf=%d yabl=%d er=%d pd=%d\n",
i, All[i].izb, All[i].nib, All[i].dib,
All[i].spr, All[i].ldpr, All[i].pr, All[i].kprf, All[i].yabl, All[i].er, All[i].pd);
// Посчитаем сколько всего было избирателей в списках и
// Сколько всего проголосовавших, таким образом мы узнаем общую явку по стране
total_izb = 0;
total_golos = 0;
for (i=2;i<NUIK+2;i++){
total_izb+=All[i].izb;
total_golos+=All[i].nib + All[i].dib;
}
printf("total_izb = %d\ntotal_golos = %d\nyavka = %f\n",
total_izb, total_golos, (double)total_golos/(double)total_izb);
//---------------- Графика --------------------------//
printf("Initializing SDL.\n");
/* Initialize defaults, Video and Audio */
if((SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO)==-1)) {
printf("Could not initialize SDL: %s.\n", SDL_GetError());
exit(-1);
}
printf("SDL initialized.\n");
SDL_WM_SetCaption("unicorn55 for FDK",NULL);
screen = SDL_SetVideoMode(WIDTH, HEIGHT,32,SDL_SWSURFACE);
for (i=2;i<NUIK+2;i++){
bull = All[i].nib+All[i].dib;
if (All[i].izb && bull)
putpixel(screen,(double)bull*(WIDTH-1)/(double)All[i].izb,
(double)All[i].er // Именно здесь определяется график какой партии рисуем
*(HEIGHT-1)/(double)bull, 0xFFFFFFFF);
}
printf("ok\n");
// Ждем когда пользователь закроет окошко
running = 1;
while (running) {
if (SDL_PollEvent(&event)) {
if (event.type == SDL_QUIT) {
running = 0;
}
}
}
printf("Quiting SDL.\n");
/* Shutdown all subsystems */
SDL_Quit();
exit(0);
}
#include <SDL.h> // Нужно для графики
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <fenv.h>
SDL_Surface* screen = 0;
SDL_Event event;
int running = 0;
int povtor = 0;
#define WIDTH 1001 // Ширина экрана
#define HEIGHT 800 // Высота экрана
int diagram[WIDTH]; // Массив по которому будет строиться столбчатая диаграмма
double yavka = 0; // явка на данном УИК
double vote = 0; // процент проголосовавших за конкретную партию
// рисует пиксел
void putpixel(SDL_Surface* screen, int x, int y, int color) {
int* pixels=(int*)screen->pixels;
y=HEIGHT-y-1;
if (x>=WIDTH || y>=HEIGHT || x <0 || y <0) {printf("%d %d\n", x,y); return;}
pixels[WIDTH*y+x]=color;
SDL_UpdateRect(screen, x, y, 1, 1);
}
// рисует ветрикальную линию из точки (x,y) вверх на длину length
void vert_line(SDL_Surface* screen, int x, int y, int length, int color) {
int i=0;
if (y+length>=HEIGHT) {
printf("x=%d y=%d length=%d\n",x,y,length);
length = HEIGHT-y;
}
while (i<length) {
putpixel(screen,x,y+i,color);
i++;
}
}
// число УИКов
#define NUIK 95185
// имя исходного текстового файла, откуда будем считывать данные
char* txt_filename = "p2011.txt";
// сам файл
FILE* txt_file;
// буфер для скачивания сюда первой ненужной строки
char str[2000];
// фиктивная переменная для записи в нее ненужных данных
int t;
int total_izb;
int total_golos;
// Тип из которых будет состоять большой массив по всем УИКам
typedef struct {
int izb; // число избирателей в списке
int nib; // число недействительных избирательных беллютеня
int dib; // число действительных избирательных беллютеня
int spr; // число проголосовавших за Справедливую Россию
int ldpr; // число проголосовавших за ЛДПР
int pr; // число проголосовавших за Правое Дело
int kprf; // число проголосовавших за КПРФ
int yabl; // число проголосовавших за Яблоко
int er; // число проголосовавших за Единую Россию
int pd; // число проголосовавших за Правое Дело
} t_uik;
// Большой массив данных по всем 95185 УИКам
// первые две строчки не используются чтобы номера элементов массива
// соответствовали номерам строк в исходной Excel-таблице
t_uik All[NUIK+2];
// функция считывает символы из текстового файла f пока не считает символ табуляции
// таким образом она пропускает одно значение в таблице и переходит к следующему
void skip_to_tab(FILE* f) {
while (fgetc(f) != '\t');
}
//=====================================//
//======= Главная программа ===========//
//=====================================//
int main(int argc, char *argv[]) {
int i; // счетчик для цикла от 2 до 95186
int bull; // число бюллетеней действительных плюс недействительных
txt_file = fopen(txt_filename,"r"); // открываем текст для чтения
if (txt_file==NULL) {printf("Error: fopen\n"); exit(1);}
fgets(str,2000,txt_file); // считываем первую строку, это заголовки столбцов, они нам не нужны
// цикл считывания данных по всем УИКам
for (i=2;i<2+NUIK;i++) {
// пропускаем первые 4 текстовые значения таблицы (они нам не нужны)
skip_to_tab(txt_file);
skip_to_tab(txt_file);
skip_to_tab(txt_file);
skip_to_tab(txt_file);
// а дальше идут числа, считываем их с помощью fscanf
fscanf(txt_file,
"%d" // 1 ненужный (номер уика)
"%d" // 1 нужный — число избирателей в списке
"%d%d%d%d%d%d%d" // 7 ненужных
"%d%d" // 2 нужных (это NIB и DIB)
"%d%d%d%d%d%d%d%d" // 8 ненужных
"%d%d%d%d%d%d%d", // 7 нужных — это голоса за каждые из 7 партий
&t, // ненужный считываем в фиктивную переменную
&(All[i].izb), // число избирателей в списке
&t,&t,&t,&t,&t,&t,&t, // ненужные, считываем в фиктивную переменную
&(All[i].nib),&(All[i].dib), // заполняем NIB и DIB
&t,&t,&t,&t,&t,&t,&t,&t, // ненужные, считываем в фиктивную переменную
// считываем голоса за 7 партий
&(All[i].spr), // СПР
&(All[i].ldpr), // ЛДПР
&(All[i].pr), // Патриоты России
&(All[i].kprf), // КПРФ
&(All[i].yabl), // Яблоко
&(All[i].er), // ЕР
&(All[i].pd)); // Правое Дело
}
// данные считаны, закрываем файл
fclose(txt_file);
// Выводим данные любой строчки для сверки с данными в Excel, чтобы удостоверится что
// данные считались успешно
// Например, возьмем самую последнюю строчку.
i = 95186;
printf("i=%d IZB=%d NIB=%d DIB=%d spr=%d ldpr=%d pr=%d kprf=%d yabl=%d er=%d pd=%d\n",
i, All[i].izb, All[i].nib, All[i].dib,
All[i].spr, All[i].ldpr, All[i].pr, All[i].kprf, All[i].yabl, All[i].er, All[i].pd);
// Посчитаем сколько всего было избирателей в списках и
// Сколько всего проголосовавших, таким образом мы узнаем общую явку по стране
total_izb = 0;
total_golos = 0;
for (i=2;i<NUIK+2;i++){
total_izb+=All[i].izb;
total_golos+=All[i].nib + All[i].dib;
}
printf("total_izb = %d\ntotal_golos = %d\nyavka = %f\n",
total_izb, total_golos, (double)total_golos/(double)total_izb);
//---------------- Графика --------------------------//
printf("Initializing SDL.\n");
/* Initialize defaults, Video and Audio */
if((SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO)==-1)) {
printf("Could not initialize SDL: %s.\n", SDL_GetError());
exit(-1);
}
printf("SDL initialized.\n");
SDL_WM_SetCaption("unicorn55 for FDK",NULL);
screen = SDL_SetVideoMode(WIDTH, HEIGHT,32,SDL_SWSURFACE);
// Обнуняем диаграмму
for (i=0;i<WIDTH;i++) diagram[i]=0;
fesetround(FE_TONEAREST); // задаем направление округления — к ближайшему целому
for (i=2;i<NUIK+2;i++){
bull = All[i].nib+All[i].dib;
if (All[i].izb && bull) {
yavka = (double)bull/(double)All[i].izb;
vote = (double)All[i].er // Именно здесь определяется график какой партии рисуем
/(double)bull;
t=round((WIDTH-1)*vote);
diagram[t]++;
//putpixel(screen, yavka*(WIDTH-1), vote*(HEIGHT-1), 0xFFFFFFFF);
}
}
for (i=0;i<WIDTH;i++) {
//putpixel(screen, i,diagram[i], 0xFFFFFFFF);
vert_line(screen,i,0,diagram[i], 0xFFFFFFFF);
}
printf("povtor = %d\n", povtor);
// Ждем когда пользователь закроет окошко
running = 1;
while (running) {
if (SDL_PollEvent(&event)) {
if (event.type == SDL_QUIT) {
running = 0;
}
}
}
printf("Quiting SDL.\n");
/* Shutdown all subsystems */
SDL_Quit();
exit(0);
}
Сейчас этот раздел просматривают: 14 гостей