Сортировка массива - исправить код и кодировку - C (СИ)
Формулировка задачи:
Дело такое, пишу так сказать проект на автомат, вроде всё закончил, но есть две беды.
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>
void arr_input(int *arr, int n,int a, int b) {
for (int i = 0; i < n; i++)
arr[i]=a+rand()%(b-a);
}
void arr_output (int *arr, int n) {
for (int i = 0; i < n; i++)
printf(" %d ",arr[i]);
}
void arr_sort (int *arr, int n){
int tmp;
for (int i = n; i > 0; i--)
if (arr[i]<arr[i-1]) {
tmp=arr[i];
arr[i]=arr[i-1];
arr[i-1]=tmp;
}
}
int arr_count (int *arr, int n) {
int count_ch = 0;
for (int i = 0; i < n; i++) {
int count = 1;
while (count != 0) {
int ch = arr[i]%10;
if (ch<0)
ch *= -1;
if (ch == 4)
count_ch++;
count --;
}
}
return count_ch;
}
int* arr_ent (int *arr, int *brr, int n) {
int j=0;
for (int i = 0; i < n; i++) {
int count = 1;
while (count != 0) {
int ch = arr[i]%10;
if (ch<0)
ch *= -1;
if (ch == 4) {
brr[j]=arr[i];
j++;
}
count --;
}
}
return brr;
}
void first(void) {
system("cls");
printf("Г‡Г*Г¤Г*Г·Г* В№1.\n");
int *arr, *array, n, min, max, count,res;
FILE *fo;
printf("Ââåäèòå n:\n ");
scanf("%d",&n);//ââîä Г°Г*çìåðГ*îñòè
printf("Ââåäèòå ëåâóþ ГЈГ°Г*Г*ГЁГ¶Гі ïðîìåæóòêГ*:\n ");
scanf("%d",&min);//ââîä ГЈГ°Г*Г*ГЁГ¶Г» Г*Г*Г·Г*Г«Г*
printf("Ââåäèòå ГЇГ°Г*ГўГіГѕ ГЈГ°Г*Г*ГЁГ¶Гі ïðîìåæóòêГ*:\n ");
scanf("%d",&max);//ââîä ГЈГ°Г*Г*ГЁГ¶Г» ГЄГ®Г*Г¶Г*
system("cls");
srand(time(NULL));
arr = (int *)malloc(n*sizeof(int));
arr_input(arr,n,min,max);
printf("ÈñõîäГ*ûé Г¬Г*Г±Г±ГЁГў: \n");
arr_output(arr,n);
count = arr_count(arr,n);
if (count == 0) {
printf("\n\nÂûõîäÿùèé Г¬Г*Г±Г±ГЁГў ГЇГіГ±ГІ.");
fo = fopen("kr.dat","wt");
if (fo == 0)
perror("\nError opening file!");
else
fprintf(fo,"NO MASSIVE!");
fclose(fo); //Г§Г*ГЇГЁГ±Гј Гў ГґГ*éë
}
else {
array=(int *)malloc(sizeof(count));
arr_ent(arr,array,n);
//arr_sort(array,count);
fo = fopen("kr.dat","wt");
if (fo == 0)
perror("\nError opening file!");
else
res=fwrite(array,sizeof(int),count,fo);
fclose(fo);
fo = fopen("kr.dat","rb");
if (fo == 0)
perror("\nError opening file!");
else
res=fread(array,sizeof(int),count,fo);
fclose(fo);
printf("\n\nÂûõîäÿùèé Г¬Г*Г±Г±ГЁГў ñîñòîèò ГЁГ§ %d ýëåìåГ*òîâ(-Г*): \n",count);
arr_output(array,count);
}
printf("\n\nÄëÿ ïåðåõîäГ* Г*Г*æìèòå <Enter>.");
free(arr);
free(array);
getch();
}void arr_sort (int *arr, int n){
int tmp;
for (int i = n; i > 0; i--)
if (arr[i]<arr[i-1]) {
tmp=arr[i];
arr[i]=arr[i-1];
arr[i-1]=tmp;
}
}#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <locale.h>
#include "mod.h"
int main() {
int a;
setlocale(LC_ALL, "Russian");
do {
system("cls");
printf("\n Ââåäèòå: \n 1 ГЁ Enter - äëÿ âûâîäГ* ðåøåГ*ГЁГї 1 Г§Г*Г¤Г*Г·ГЁ\n 2 ГЁ Enter - äëÿ âûâîäГ* ðåøåГ*ГЁГї 2 Г§Г*Г¤Г*Г·ГЁ\n 3 ГЁ Enter - äëÿ âûâîäГ* ðåøåГ*ГЁГї 3 Г§Г*Г¤Г*Г·ГЁ\n 0 ГЁ Enter - äëÿ âûõîäГ* ГЁГ§ ïðîãðГ*ììû\n\n Ââåäèòå ГЂ: ");
scanf("%d",&a);
switch(a) {
case 1: first();
break;
case 2: second();
break;
case 3: third();
break;
}
} while (a!=0);
printf("\n\nÄëÿ âûõîäГ* Г*Г*æìèòå <Enter>.");
getch();
return 0;
}#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>
typedef struct SP {
char name[40];
char firm[40];
char *kind;
char lg[40];
};
void sp_input(SP *num, int n){
int d;
for (int i = 0; i < n; i++){
system("cls");
printf("Ââåäèòå Г¤Г*Г*Г*ûå %d-îé Г*ГЇГІГҐГЄГЁ.\n", i+1);
printf("Ââåäèòå Г*Г*Г§ГўГ*Г*ГЁГҐ ëåêГ*ðñòâГ*:\n ");
scanf("%s",num[i].name);
printf("\nÂâåäèòå ôèðìó:\n ");
scanf("%s",num[i].firm);
do {
printf("\nÂâåäèòå ГўГЁГ¤ ïðîäГ*æè (1 - ГЇГ® ðåöåïòó 2 - ñâîáîäГ*ûé):\n ");
scanf("%d",&d);
switch(d) {
case 1: num[i].kind = "ïî ðåöåïòó"; break;
case 2: num[i].kind = "ñâîáîäГ*ûé"; break;
}
}while(d != 1 && d != 2);
printf("\nÏðèГ*Г*äëåæèò ëüãîòГ*îé ГЄГ*òåãîðèè (Г¤Г*/Г*ГҐГІ):\n ");
scanf("%s",num[i].lg);
}
}
void sp_sort(SP *num, int n){
SP plur;
for(int i = 0;i < n;i++)
for(int j = 0; j < n;j++)
if(strcmp(num[i].name,num[j].name)<0){
plur=num[i];
num[i]=num[j];
num[j]=plur;
}
}
void sp_output_kind(SP *num,int n){
int u,res;
char *kind;
FILE *fo;
system("cls");
printf("\nÂâåäèòå ГўГЁГ¤ ïðîäГ*æè (1 - ГЇГ® ðåöåïòó 2 - ñâîáîäГ*ûé):\n ");
scanf("%d",&u);
do {
switch(u) {
case 1: kind = "ïî ðåöåïòó"; break;
case 2: kind = "ñâîáîäГ*ûé"; break;
}
}while(u!=1 && u!=2);
setlocale(LC_ALL, "Russian");
printf("\nГ’Г*áëèöГ* Г*ГЇГІГҐГЄ.");
printf("\n| id | ËåêГ*ðñòâî | ÔèðìГ* | Âèä ïðîäГ*æè | Ëüãîòû |");
for (int i = 0; i < n; i++)
if(strcmp(num[i].kind,kind)==0){
printf("\n| %3d| %11s | %9s | %13s | %6s |",i+1,num[i].name,num[i].firm,num[i].kind,num[i].lg);
fo = fopen("kr.dat","wt");
if (fo == 0)
perror("\nError opening file!\n");
else
res=fwrite(&num,sizeof(int),40,fo);
fclose(fo);
}
}
void sp_output(SP *num, int n){
system("cls");
setlocale(LC_ALL, "Russian");
printf("\nГ’Г*áëèöГ* Г*ГЇГІГҐГЄ.");
printf("\n| id | ËåêГ*ðñòâî | ÔèðìГ* | Âèä ïðîäГ*æè | Ëüãîòû |");
printf("\n____________________________________________________________");
for (int i = 0; i < n; i++)
printf("\n| %3d| %11s | %9s | %13s | %6s |",i+1,num[i].name,num[i].firm,num[i].kind,num[i].lg);
printf("\n\nГЌГ*æìèòå ëþáóþ ГЄГ«Г*ГўГЁГёГі äëÿ âûçîâГ* ìåГ*Гѕ.\n ");
getch();
}
void third(void){
system("cls");
int n,a,res;
FILE *fo;
printf("Ââåäèòå êîëè÷åñòâî Г¤Г*Г*Г*ûõ:\n ");
scanf("%d",&n);
SP num[n];
sp_input(num,n);
fo = fopen("kr.dat","wt");
if (fo == 0)
perror("\nError opening file!\n");
else
res=fwrite(&num,sizeof(int),40,fo);
fclose(fo);
fo = fopen("kr.dat","rb");
if(fo == 0)
perror("\nError opening file!");
else {
res = fread(&num,sizeof(int),40,fo);
}
sp_output(num,n);
printf("\n\nÂûáåðèòå ГґГіГ*ГЄГ¶ГЁГѕ:\n\t1 - ÑîðòèðîâêГ* ГЇГ® Г*Г*Г§ГўГ*Г*ГЁГѕ ëåêГ*ðñòâГ*\n\t2 - ÈçìåГ*ГҐГ*ГЁГҐ Г*îìåðГ*\n\t0 - Âûõîä\n");
scanf("%d",&a);
do {
switch(a){
case 1: sp_sort(num,n);sp_output(num,n);break;
case 2: sp_output_kind(num,n); break;
}
}while(a!=1 && a!=2);
printf("\n\nÄëÿ ïåðåõîäГ* Г*Г*æìèòå <Enter>.");
getch();
}Решение задачи: «Сортировка массива - исправить код и кодировку»
textual
Листинг программы
void sp_sort(SP* num, int n)
{
SP plur;
for (int i = 0; i < n - 1; i++)
for (int j = i + 1; j < n; j++)
if (strcmp(num[i].name, num[j].name) < 0)
{
plur = num[i];
num[i] = num[j];
num[j] = plur;
}
}
Объяснение кода листинга программы
- В функции sp_sort() необходимо исправить ошибку в имени функции сортировки, которое сейчас называется sp_sort()
- В данной функции используется алгоритм сортировки пузырьком.
- Для сортировки используется два массива: первый массив называется num и содержит в себе структуры типа SP, второй массив называется plur и используется для временного хранения значения переменной.
- В функции используется два вложенных цикла: внешний цикл выполняется n-1 раз, где n - это размер массива num.
- Внутренний цикл выполняется n-i-1 раз, где n - это размер массива num, i - это значение переменной из внешнего цикла.
- Если значение переменной num[i].name меньше значения переменной num[j].name, то происходит обмен значений переменных num[i] и num[j] с использованием временной переменной plur.