Другие языки программирования и технологии
Помогите написать программу на Си.
Дан целочисленный массив. Переместить все отрицательные элементы в начало, затем разместить нули, а затем положительные элементы.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 25
void run();
void stop();
void random(int*, int, int);
void print(int*);
void move(int*);
int main() {
srand((unsigned)time(NULL));
run();
stop();
return 0;
}
void run() {
int vector[SIZE];
random(vector, -5, 6);
print(vector);
move(vector);
print(vector);
}
void stop() {
fflush(stdin);
getchar();
}
void random(int* v, int l, int r) {
int i;
for (i = 0; i < SIZE; ++i) v[i] = l + rand() % (r - l);
}
void print(int* v) {
int i;
for (i = 0; i < SIZE; ++i) printf("%3i", v[i]);
printf("\n");
}
void move(int* v) {
int tmp[SIZE];
int i, j = -1;
for (i = 0; i < SIZE; ++i) if (v[i] < 0) tmp[++j] = v[i];
for (i = 0; i < SIZE; ++i) if (!v[i]) tmp[++j] = 0;
for (i = 0; i < SIZE; ++i) if (v[i] > 0) tmp[++j] = v[i];
for (i = 0; i < SIZE; ++i) v[i] = tmp[i];
}
#include <stdlib.h>
#include <time.h>
#define SIZE 25
void run();
void stop();
void random(int*, int, int);
void print(int*);
void move(int*);
int main() {
srand((unsigned)time(NULL));
run();
stop();
return 0;
}
void run() {
int vector[SIZE];
random(vector, -5, 6);
print(vector);
move(vector);
print(vector);
}
void stop() {
fflush(stdin);
getchar();
}
void random(int* v, int l, int r) {
int i;
for (i = 0; i < SIZE; ++i) v[i] = l + rand() % (r - l);
}
void print(int* v) {
int i;
for (i = 0; i < SIZE; ++i) printf("%3i", v[i]);
printf("\n");
}
void move(int* v) {
int tmp[SIZE];
int i, j = -1;
for (i = 0; i < SIZE; ++i) if (v[i] < 0) tmp[++j] = v[i];
for (i = 0; i < SIZE; ++i) if (!v[i]) tmp[++j] = 0;
for (i = 0; i < SIZE; ++i) if (v[i] > 0) tmp[++j] = v[i];
for (i = 0; i < SIZE; ++i) v[i] = tmp[i];
}
#include <stdio.h>
// O(n)
int* permutation(int* first, int* last, int (*cmp)(int)){
int* pos, tmp;
pos = first;
while(first != last && *first < 0)
pos = ++first;
for(; first != last; ++first) {
if((*cmp)(*first)) {
tmp = *first;
*first = *pos;
*pos = tmp;
++pos;
}
}
return pos;
}
int compare_neg(int n){ return (n < 0); }
int compare_zero(int n){ return (! n); }
int main(void){
int* ptr;
int arr[] = { 0, 2, -1, 4, -3, -5, 6, 0, -7, -9, 8, 0};
size_t num = sizeof(arr)/sizeof(arr[0]);
ptr = permutation(arr, arr + num, &compare_neg);
permutation(ptr, arr + num, &compare_zero);
for(ptr = &arr[0]; ptr != arr + num; ++ptr)
printf("%d ", *ptr);
return 0;
}
// O(n)
int* permutation(int* first, int* last, int (*cmp)(int)){
int* pos, tmp;
pos = first;
while(first != last && *first < 0)
pos = ++first;
for(; first != last; ++first) {
if((*cmp)(*first)) {
tmp = *first;
*first = *pos;
*pos = tmp;
++pos;
}
}
return pos;
}
int compare_neg(int n){ return (n < 0); }
int compare_zero(int n){ return (! n); }
int main(void){
int* ptr;
int arr[] = { 0, 2, -1, 4, -3, -5, 6, 0, -7, -9, 8, 0};
size_t num = sizeof(arr)/sizeof(arr[0]);
ptr = permutation(arr, arr + num, &compare_neg);
permutation(ptr, arr + num, &compare_zero);
for(ptr = &arr[0]; ptr != arr + num; ++ptr)
printf("%d ", *ptr);
return 0;
}
Добрый вечер.
Решил выложить код, в котором не применяется метод объектно-ориентированного программирования.
Любой метод сортировки решает Вашу задачу, т. к. не оговорен порядок перемещаемых отрицательных и положительных чисел, но, скорее всего это будет лишним.
Задачу решил самым простым и доступным для понимания способом. Использовал 4 массива.
1) Находим все отрицательные числа и помещаем их в массив 1.
2) Находим все нули и помещаем их в массив 2
3) Находим все положительные числа и помещаем их в массив 3.
Объединяем все массивы и вуаля.
Сам код:
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
using std::cout;
using std::endl;
using std::cin;
int main()
{
int sum=0;
int N=15;
int counter=0;
int отрицательные=0;
int нули=0;
int положительные=0;
int a[30];
int массив_отрицательных_чисел [30];
int массив_нулей [30];
int массив_положительных_чисел [30];
cout << "Enter " << N << " numbers:\n";
while (sum < N)
{
sum++;
cout << "a[" << sum << "]=";
cin >> a[sum];
if ( a[sum] > 0 )
{
положительные++;
массив_положительных_чисел [положительные] =a[sum];
}
if ( a[sum]<0 )
{
отрицательные++;
массив_отрицательных_чисел [отрицательные] =a[sum];
}
if ( a[sum]==0 )
{
нули++;
массив_нулей [нули] =a[sum];
}
}
cout <<"==================================================" << endl;
for ( int counter=1; counter<=отрицательные; counter++)
a[counter]= массив_отрицательных_чисел [counter];
for ( int counter=1; counter<=нули; counter++)
a[counter + отрицательные] = массив_нулей [counter];
for ( int counter=1; counter<=положительные; counter++)
a[counter + отрицательные + нули] = массив_положительных_чисел [counter];
for (counter=1; counter<=N; counter++)
cout << "a[" << counter << "]=" << a[counter] << endl;
}

А вот и результат. Числа вводятся с клавиатуры, как Вы и требуете.

Решил выложить код, в котором не применяется метод объектно-ориентированного программирования.
Любой метод сортировки решает Вашу задачу, т. к. не оговорен порядок перемещаемых отрицательных и положительных чисел, но, скорее всего это будет лишним.
Задачу решил самым простым и доступным для понимания способом. Использовал 4 массива.
1) Находим все отрицательные числа и помещаем их в массив 1.
2) Находим все нули и помещаем их в массив 2
3) Находим все положительные числа и помещаем их в массив 3.
Объединяем все массивы и вуаля.
Сам код:
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
using std::cout;
using std::endl;
using std::cin;
int main()
{
int sum=0;
int N=15;
int counter=0;
int отрицательные=0;
int нули=0;
int положительные=0;
int a[30];
int массив_отрицательных_чисел [30];
int массив_нулей [30];
int массив_положительных_чисел [30];
cout << "Enter " << N << " numbers:\n";
while (sum < N)
{
sum++;
cout << "a[" << sum << "]=";
cin >> a[sum];
if ( a[sum] > 0 )
{
положительные++;
массив_положительных_чисел [положительные] =a[sum];
}
if ( a[sum]<0 )
{
отрицательные++;
массив_отрицательных_чисел [отрицательные] =a[sum];
}
if ( a[sum]==0 )
{
нули++;
массив_нулей [нули] =a[sum];
}
}
cout <<"==================================================" << endl;
for ( int counter=1; counter<=отрицательные; counter++)
a[counter]= массив_отрицательных_чисел [counter];
for ( int counter=1; counter<=нули; counter++)
a[counter + отрицательные] = массив_нулей [counter];
for ( int counter=1; counter<=положительные; counter++)
a[counter + отрицательные + нули] = массив_положительных_чисел [counter];
for (counter=1; counter<=N; counter++)
cout << "a[" << counter << "]=" << a[counter] << endl;
}

А вот и результат. Числа вводятся с клавиатуры, как Вы и требуете.

С++?
Отсортируй массив
int v[10]
...
std::sort(std::begin(v), std::end(v));
Отсортируй массив
int v[10]
...
std::sort(std::begin(v), std::end(v));
#include <stdio.h> //printf()
#include <conio.h> //getch()
#include <time.h> //time
#include <stdlib.h> //srand()
int main(){
srand(time(NULL));//Функция нужна чтобы случйные числа были разными, каждый раз после запуска программы.
int a,b;//диапазон случайных чисел
a = -5;
b = 5;
const int n = 10;//размер массива
int Ar[n]; //массив
int temp = 0; //Переменная, для временного хранения значения ячейки массива во время сортировки.
//Заполняем массив случайными числами в дипазоне от a до b.
for(int i = 0; i < n; i++){
Ar[i] = rand() % (b - a) + a;
printf("%d ",Ar[i]);
}
//Сортировка пузырьком.
for(int i = 0; i < n; i++)
for(int j = 0; j < n-1-i; j++){
if(Ar[j+1] < Ar[j]){
//swap(Ar[i+1],Ar[i]); //Не работает, почему-то. (
temp = Ar[j];
Ar[j] = Ar[j+1];
Ar[j+1] = temp;
}
}
printf("\n");
//Выводим на экран отсортированный массив.
for(int i = 0; i < n; i++)
printf("%d ",Ar[i]);
getch();
return 0;
}
#include <conio.h> //getch()
#include <time.h> //time
#include <stdlib.h> //srand()
int main(){
srand(time(NULL));//Функция нужна чтобы случйные числа были разными, каждый раз после запуска программы.
int a,b;//диапазон случайных чисел
a = -5;
b = 5;
const int n = 10;//размер массива
int Ar[n]; //массив
int temp = 0; //Переменная, для временного хранения значения ячейки массива во время сортировки.
//Заполняем массив случайными числами в дипазоне от a до b.
for(int i = 0; i < n; i++){
Ar[i] = rand() % (b - a) + a;
printf("%d ",Ar[i]);
}
//Сортировка пузырьком.
for(int i = 0; i < n; i++)
for(int j = 0; j < n-1-i; j++){
if(Ar[j+1] < Ar[j]){
//swap(Ar[i+1],Ar[i]); //Не работает, почему-то. (
temp = Ar[j];
Ar[j] = Ar[j+1];
Ar[j+1] = temp;
}
}
printf("\n");
//Выводим на экран отсортированный массив.
for(int i = 0; i < n; i++)
printf("%d ",Ar[i]);
getch();
return 0;
}
Похожие вопросы
- Помогите написать программу на Си
- помогите написать программу на Си
- помогите написать программу на Си
- помогите написать программу на си
- Помогите написать программу в СИ. буду очень благодарин
- помогите написать программу в Си
- Помогите написать программу на Си с помощью ФУНКЦИЙ.
- <<ПОМОГИТЕ! НАПИСАТЬ ПРОГРАММУ НА СИ ИЛИ ПАСКАЛЕ КОТОРАЯ ВЫВОДИТЬ СУММУ ЦИФР ЧИСЛА ОТ 1 ДО N
- Помогите написать программу на СИ++.Определить попадает ли точку в заштрихованную область
- Помогите написать программу со switch в СИ