Добрый день
друзья. Продолжаем изучать одномерные массивы. Сегодня у нас важная тема.
Изучим основные алгоритмы работы с массивами: поиск в массиве и его сортировка.
Почему я
говорю, что этот урок важный? Просто обработка массивов, наряду с работой со строками, это одна из самых типичных задач в
программировании. Ни для кого не секрет,
компьютеры появились для решения вычислительных задач математики. А вычислительные задачи, обычно связаны с
большим объемом однотипных данных, которые где хранятся? Ага, правильно.
Массивы.
Итак, не
будем тянуть быка за хвост, ухватимся сразу за рога. Начнем с самого простого.
Поиск минимального элемента в массиве.
Поставим
задачку. Пускай имеется массив из целых чисел. Необходимо среди всех элементов
массива, найти элемент с минимальным значением.
Это задачка
даже не на одну трубку. Сначала
взгляните на картинку, и найдите в этом столбике минимальный элемент.
Рис.1 Одномерный массив |
А теперь
стоп. Задумайтесь на секундочку, как вы
это сделали? Скорее всего, вы пробежались по столбику глазами, и выявили там
самое меньшее число. Аналогичную
процедуру должна выполнить и наша программа.
Первым делом
следует подумать, где будет храниться минимальное значение. Для него необходима
отдельная переменная. Назовем её min. Сохраним в неё значение первого элемента массива, чтобы нам
было с чем сравнивать. Дальше нужно пройтись по массиву. Это не сложно,
организуем для этого цикл. В работе с массивами в большинстве случаев
используется цикл for. Так
как там сразу же есть счетчик, который меняется
каждой итерации. Теперь основная часть алгоритма. Нам нужно
последовательно сравнивать элементы массива с минимальным, и если окажется так,
что элемент массива меньше минимального, то следует сохранить это значение
вместо него. Вот, в принципе, и весь
алгоритм.
Теперь
запишем это все в виде программы.
Листинг
12.1
#include <stdio.h>
int main(){
int min, arr[11]={5,14,7,4,11,2,6,12,8,7,3};
min = arr[0];
for (int i=1; i<11; i++){
if (arr[i]<min)
min = arr[i];
}
printf("%d\n", min);
return(0);
}
int main(){
int min, arr[11]={5,14,7,4,11,2,6,12,8,7,3};
min = arr[0];
for (int i=1; i<11; i++){
if (arr[i]<min)
min = arr[i];
}
printf("%d\n", min);
return(0);
}
Обратите
внимание, что в данном случае мы задали элементы массива при его объявлении.
Запомните этот способ, он тоже иногда бывает полезен. Кстати, если бы мы объявили не все элементы,
а лишь часть из них, то все остальные, автоматически заполнились бы нулями.
Можете это проверить самостоятельно.
В дополнение
к словесному описанию проиллюстрируем картинкой работу нашей программы.
Рис. 2 Иллюстрация поиска минимума в одномерном массиве. |
Еще раз посмотрите
приведенный выше код, вам должно быть в нем все понятно. Аналогично можно найти
максимальный элемент в массиве.
Сортировка массива.
Теперь
пускай нам необходимо отсортировать массив, например, по возрастанию. То есть в
начале стоит самый маленький элемент, а в конце самый большой. Будем
рассматривать самый простой алгоритм сортировки – сортировка обменом. Другое
название этой сортировки - сортировка «пузырьком».
Рассмотрим,
как говорит мой преподаватель по курсу «методы оптимизации», философию метода.
Для
определенности будем считать, что имеем дело с целочисленным массивом. Начиная с первого элемента, поочередно
сравниваем соседние элементы, т.е.
первый и второй, второй и третий, третий и четвертый и так до конца массива.
Если упорядоченность массива нарушена, то меняем эти элементы местами. Так как мы
упорядочиваем массив по возрастанию, в нашем случае первый элемент должен быть
меньше следующего.
Давайте
рассмотрим иллюстрирующую этот шаг алгоритма картинку.
Рис. 3. Пример первого шага сортировки одномерного массива методом обмена. |
Как
видите, самый тяжелый элемент – тонет,
то есть опускается на самый низ. А более легкие элементы, как бы всплывают, как
пузырьки в воде. Отсюда, в принципе, и название алгоритма. Как видите, после
одного прохода алгоритма, на последнее место. Получается, после одного шага
алгоритма один элемент уже точно занимает свое место, и при следующем проходе,
нам уже нет необходимости сравнивать предпоследний и последний элемент, так как
последний элемент уже на своем месте и ничего менять не придется, так зачем лишнее
действие? Правильно, незачем. А мы и не будем.
Повторяя
описанную процедуру n-1
раз (здесь n – размерность массива) получим полностью отсортированный
массив.
На следующем
рисунке проиллюстрирована работа алгоритма, на примере небольшого массива.
Рис. 4. Иллюстрация сортировки массива методом "пузырька". |
Приведем код
реализации алгоритма сортировки пузырьком, на языке Си. Обратите внимание на поясняющие
комментарии.
Листинг 12.2
#include <stdio.h>
int main(){
int n=6, // размерность массива
arr[6]={5,14,7,4,11,2}; // массив для сортировки
for (int i=n-1;i>0;i--)
for (int j=0;j<i;j++)
if(arr[j]>arr[j+1]){ // если порядок нарушен
//меняем j и j+1 элементы массива местами
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
}
//выводим массив на экран
for (int i=0;i<n; i++)
printf("%d\n", arr[i]);
return(0);
}
int main(){
int n=6, // размерность массива
arr[6]={5,14,7,4,11,2}; // массив для сортировки
for (int i=n-1;i>0;i--)
for (int j=0;j<i;j++)
if(arr[j]>arr[j+1]){ // если порядок нарушен
//меняем j и j+1 элементы массива местами
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
}
//выводим массив на экран
for (int i=0;i<n; i++)
printf("%d\n", arr[i]);
return(0);
}
Помните, мы
говорили, что на каждом шаге нам нужно сокращать длину основного цикла? Т.е. сначала
проходим все элементы до n-1,
на следующем шаге до n-2
и т.д. В приведенном выше алгоритме это
реализовано внешним циклом. Обратите внимание, что мы впервые используем
направление цикла «сверху вниз». Т.е. движемся не от единицы к n, а наоборот, от n-1 к 1.
На этом сегодняшнее
занятие окончено.
Задание для
практической работы.
- Задан целочисленный массив a. Написать программу, которая ищет максимальный элемент в массиве и выводит на экран его номер. Обратите внимание не значение, а номер элемента в массиве.
- Задан целочисленный массив arr[1000], в котором существует минимум 10 различных значений. Найти 10 по величине элемент массива.
- Задан целочисленный массив arr[40] . Найти количество элементов массива, которые по модулю меньше произвольного наперед заданного числа. Вывести количество таких элементов в массиве.
- Составьте функцию, которая по заданному массиву определяет, есть ли в массиве хотя бы один отрицательный элемент.
- В уроке был приведен кусок кода, в котором с помощью дополнительной переменной меняются местами два элемента массива. Подумайте, как можно обменять значения двух переменных, не используя дополнительной переменной. Т.е. например, int a=3, b=5; должно стать a=5, b=3; Помните, что использовать дополнительные переменные нельзя.
При выполнении заданий, помните о нашей договоренности, код
программы оформлять в виде отдельных функций.
Если Вам понравился этот урок, расскажите о нем вашим друзьям. В этом Вам могут помочь кнопки основных социальных сетей, расположенные ниже. Вам остается всего лишь кликнуть по любой из них.
Если Вам понравился этот урок, расскажите о нем вашим друзьям. В этом Вам могут помочь кнопки основных социальных сетей, расположенные ниже. Вам остается всего лишь кликнуть по любой из них.
Первых программ код пока выложить не могу т.к. компилятора под рукой нету, в блокноте все писал :-D не проверенное выкладывать не буду :)
ОтветитьУдалитьТак и не разобрался как в функцию передавать массив, вроде все должно быть так же, но что-то ошибки лезут одна за другой. Попробую еще разобраться, и надеюсь у вас в уроках то же это будет.
Последняя задача:
int a=3, b=5;
a+=b; //а=3+5=8
b=a-b;//b=8-5=3
a-=b; //a=8-3=5
?
p.s. на главной (http://youngcoder.blogspot.ru/p/blog-page_16.html) видно только 11 уроков :) Все ждал 12, а оказывается уже 13 вышел :-D
Да, есть такой грешок. Сам как-то забыл про эту страницу.=) Чтобы не пропускать обновления, можете подписаться на нашу страницу https://vk.com/lang_c
УдалитьДа, это обязательно будет в уроках.
Ну и последняя задача умаю не требует проверки. Вы же сами видите, что получилось так, как надо.
Задан целочисленный массив arr[n], n не больше 1000.
ОтветитьУдалитьМы такого не проходили :)
Просто так задать массив размером n нельзя. Будет ругаться на неправильный размер.
Знаю, что не проходили. Вообще можно, конечно, задать, только не совсем просто так. ) Может быть в будущем уроке расскажу про это.
УдалитьНо сейчас не об этом.
В задании естественно подразумевалось, что можно просто задать массив arr[100], и не париться. ) Поправлю, чтобы не вызывало смущений.
Вторая
ОтветитьУдалить#include "stdio.h"
#include "time.h"
#include "locale.h"
#include "stdlib.h"
int main () {
int arr[1000], n = 1000, j, k=0, i;
srand(time(NULL));
for (i = 0; i < n; i++) {
arr[i] = rand()%101;
}
for (i = n-1; i > 0; i--) {
for (j = 0; j < i; j++) {
if (arr[j] > arr[j+1]) {
arr[j]+=arr[j+1];
arr[j+1]=arr[j]-arr[j+1];
arr[j]-=arr[j+1];
}
}
}
for (i = 0; i < n; i++) {
if (arr[i] < arr[i+1]) {
k++;
if ( k == 10) {
printf("\n10й по величине элемент массива: %d", arr[i]);
}
}
}
return (0);
}
Дима добрый день. Я не проверял на компиляторе, думаю вы сделали это сами, но сам ход мысли правильный. Хотя это не самый оптимальный способ решения. =)
УдалитьОптимальность в смысле количество элементарных операций выполняемых в программе. Элементарные операции это присваивание, сложение, вычитание, умножение, деление, сравнение.
Если это интересно, могу об этом рассказать. )
//1st task
ОтветитьУдалить#include
int main(){
int mas[7]={25, 14, 32, 27, 21, 5, 16}, max, n;
max=mas[0];
for (int i=1; i<7; i++)
if (max<mas[i])
{
max=mas[i];
n=i;
}
printf("No of max value %d\n", n);
return(0);
}
Хорошо. )
Удалить//2nd task
ОтветитьУдалить#include
int main()
{
int arr[1000]={25, 14, 32, 27, 21, 5, 16, 50, 17, 34, 58, 41, 92, 12, 37}, n=0;
for (int i=0; i<1000; i++)
if (n<arr[i])
n=arr[i];
int big[10]={n};
for (int i=1; i<10; i++)
for (int j=0;j<1000; j++)
if (big[i]<arr[j]&&arr[j]<big[i-1])
big[i]=arr[j];
printf("10th biggest number %d\n", big[9]);
return(0);
}
Нет. =)
Удалить//3rd task
ОтветитьУдалить#include "stdio.h"
int main()
{
int arr[40]={15, 41, 21, 64, 72, 19, 31, 4, 17, 9, 12, 34, 10, 37, 45}, def, var, cnt=0;
printf("pls enter the number\n");
scanf("%d", &def);
for (int i=0; i<40; i++)
{
if (arr[i]<0)
var=arr[i]*-1;
else
var=arr[i];
if (var<def&&var!=0)
cnt++;
}//for
printf("quantity of numbers less than defined - %d\n", cnt);
return (0);
}//main
Хорошо, но свистопляска с модулем лишняя. Можно было использовать стандартную функцию.Хотя все равно, все правильно. )
Удалитьпервая:
ОтветитьУдалить#include
#include
#include
using namespace std;
int main(){
int arr[5] = {3,444,5,1,33};//nomera yacheek massiva s 0
int n=5;
int max=0;
int k=0;
max = arr[0];
for (int i=0; i<n; i++){
if(max < arr[i]){
max = arr[i];
k = i;
}
}
cout << "index naibolwego elementa - " << k << endl;
system ("pause");
}
Ну суть верна, но это С++ )))
УдалитьЗадание 1
ОтветитьУдалить#include "stdio.h"
#define n 4
int main()
{
int m[n],i,max,b=0;
printf("Vvedite massiv\n");
for(i=0;i<n;i++)
scanf("%d",&m[i]);
printf("Ishodnii massiv:\n");
max=m[0];
for(i=0;i<n;i++)
printf("%3d",m[i]);
for(i=1;i<n;i++)
if(max<m[i])
{
max=m[i];
b=i;
}
printf("\nMax element :%d",max);
printf("\nNomer elementa v massive %d\n",b);// первый элемент=m[0]
//можно написать b+1 для облегчения
}
Задание 2
Удалить#include"stdio.h"
//#include
#define n 10
int main()
{
int m[n],i,b;
printf("Vvedite massiv iz %d elementov\n",n);
for(i=0;i0;j--)
for(i=0;im[i+1])
{
int temp=m[i];
m[i]=m[i+1];
m[i+1]=temp;
}
printf("\nSortirovannii massiv:\n");
for(i=0;i<n;i++)
printf("%4d",m[i]);
printf("\nIskomoe chislo %d po velechine: \n%3d\n",b,m[b-1]);
return 0;
}
Задание 3
Удалить#include
#define n 10
int main()
{
int m[n],x,i,b=0;
printf("Vvedite massiv iz %d elementov\n",n);
for(i=0;i<n;i++)
scanf("%d",&m[i]);
printf("Vvedite chislo:\n");
scanf("%d",&x);
for(i=0;i<n;i++)
{
if(m[i]<0)
m[i]=m[i]*(-1);
if(m[i]<x)
b++;
}
printf("\nKolichestvo chisel po moduly,menshih zadannogo:%3d\n",b);
return 0;
}
Задание 4
Удалить#include"stdio.h"
#define n 10
int main()
{
int m[n],i;
printf("Vvedite massiv iz %d elementov\n",n);
for(i=0;i<n;i++)
scanf("%d",&m[i]);
for(i=0;i<n;i++)
{
if(m[i]<0)
{
printf("Yes\n");
return 0;
}
}
printf("No");
return 0;
}
Задание 5
Удалить#include"stdio.h"
int main()
{
int a=3,b=5;
b=b+a;
a=b-a;
b=b-a;
printf("%d%2d\n",a,b);
}
1. Много лишнего. Но работает. И еще, если вы используете именованные константы через DEFINE, то обычно их принято обозначать большими буквами
Удалить#define N 4
2. Это даже не скомпилируется.))
3. Нормально.
4. Хорошо.
5. Да.
На счет первого согласен)
УдалитьНе понимаю...Куда-то съедаются символы...
Скину по частям
#include
//#include
#define n 10
int main()
{
int m[n],i,b;
printf("Vvedite massiv iz %d elementov\n",n);
for(i=0;i<n;i++)
scanf("%d",&m[i]); //m[i]=rand()%100
printf("Vvedite iskomoe chislo po velechine\n");
scanf("%d",&b);
printf("Ishodnii massiv:\n");
for(i=0;i<n;i++)
printf("%4d",m[i]);
for(int j=n-1;j>0;j--)
Удалитьfor(i=0;i<j;i++)
if(m[i]>m[i+1])
Удалить{
int temp=m[i];
m[i]=m[i+1];
m[i+1]=temp;
}
printf("\nSortirovannii massiv:\n");
for(i=0;i<n;i++)
printf("%4d",m[i]);
printf("\nIskomoe chislo %d po velechine: \n%3d\n",b,m[b-1]);
return 0;
}
Как-то так)
Удалитьскажите мне идею решения. =)))
УдалитьТак)
УдалитьЗначит!Сортируем массив по возрастанию.После ищем число заданное пользователем(число по величине)...Или задание состояло не в этом?
Можно, но затратно. Сортировка, например пузырьком это n^2 операций.
Удалитьпредставьте, что у вас массив из 1000 элементов.
Можно проще и эффективнее. Хотя мне кажется в своей программе вы еще не учли, что цифры могут повторяться.))
ZADANIE 1:
ОтветитьУдалить#include
int main()
{
int n,i;
printf("Vvedite razmernost massiva \n");
scanf("%d",&n);
int mass[n];
for (int i=0;i0;i--)
if (mass[i]>max)
{
i=max;
}
printf("Naibolshee znachenie=%d\n", max);
return (0);
Нет, не правильно. Так просто нельзя создать массив размерность [n]. Ну и конечно же не оформлено функцией.
УдалитьВ остальных программах такие же ошибки.
Удалить#include
ОтветитьУдалитьint main()
{
int n,i;
printf("Vvedite razmernost massiva \n");
scanf("%d",&n);
int mass[n];
for (int i=0;i0;i--)
if (mass[i]>max)
{
i=max;
}
printf("Naibolshee znachenie=%d\n", max);
return (0);
}
Задание 2
ОтветитьУдалить#include
int main()
{
int mass[1000],tmp;
for (int i=0; i<=999;i++)
for (int i=999;i>0;i--)
for (int j=0;jmass[j+1]){
tmp=mass[j];
mass[j]=mass[j+1];
mass[j+1]=tmp;
}
printf("10-y elment massiva=%D \n", mass[990]);
return (0);
}
#include
ОтветитьУдалитьint main()
{
int mass[1000],tmp;
for (int i=999;i>0;i--)
for (int j=0;jmass[j+1]){
tmp=mass[j];
mass[j]=mass[j+1];
mass[j+1]=tmp;
}
printf("10-y elment massiva=%D \n", mass[990]);
return (0);
}
Эта программа работает неправильно. Вы не учли, что элементы в массиве могут повторяться. )
Удалитьзадание 2
ОтветитьУдалить#include (())// задание 2
#include (())
int main ()
{
int arr[1000], i,n,vr;
for (i = 0; i < 1000; i++) {//for1 заполнение массива случайными числами
arr[i] = rand()%101;
}//for1
for (n=0; n<998; n++){//for 2 сортировка max-->min
for (i=0; i<(999-n); i++){//for3
if (arr[i] < arr[i+1]){
vr=arr[i];
arr[i]= arr[i+1];
arr[i+1]=vr;
}//if
}//for3
}//for2
n=1;
i=0;
while(n<10){// while поиск 10-го
if (arr[i]>arr[i+1]) n+=1;
if (n==10) printf("\n %d", arr[i+1]);
i++;
}//while
printf("\n");
return(0);
}
Суть верна, и ответ скорее всего правильный. Но можно сделать оптимальнее. =)))
Удалитьзадание 2
ОтветитьУдалить#include ((stdio.h))// задание 2
#include ((math.h))
int main ()
{
int arr[40],n=0, i,A;
printf ("zadaite chislo\n");
scanf( "%d",&A);
printf("Vvedite dannye massiva\n");
for (i=0; i<(40); i++){//for ввод массива и расчёт кол-ва чисел с меньшим модулем
scanf(" %d", &arr[i]);
if (abs(arr[i]) < A) n++;
}//for
printf(" kol-vo chisel po modulyu < %d ravno %d \n",A,n);
return(0);
}
блин! это задание 3
УдалитьВы не оформили свою программу в виде функции. Это плохо.
УдалитьЕще плохо, что вы пишите число 40 постоянно. Лучше обозначить это переменной, или даже константой. Чтобы можно было быстро изменять количество элементов.
//задание 4
ОтветитьУдалить#include "stdio.h"
int mis(int bam[], int);
int main()
{
int arra[7];
mis(arra, 7);
}
int mis( int arr[], int k)
{
//Составьте функцию, которая по заданному массиву определяет, есть ли в массиве хотя бы один отрицательный элемент.
int i, j;
j = 0;
for ( i = 0; i < k; i++)
{
printf("vvodim %d 4len massiva \n", i + 1);
scanf_s("%d", &arr[i], 1);
if(arr[i] < 0)
{
j++;
}
}
if( j > 0)
{
printf("bingo! I found minus!\n");
}
else
{
printf("=((((((((\n");
}
return 0;
}
Иван, к сожалению нет. Массив сначала нужно создать в программе, а потом уже передать его в функцию, которая определит есть ли в нем отрицательные элементы или нет. )) Переделайте, я думаю у вас легко это получится.
Удалить#include "stdio.h"
Удалитьint mis(int arr[], int);
int main()
{
int i;
int arra[7];
for ( i = 0; i < 7; i++)
{
printf("vvodim %d 4len massiva \n", i + 1);
scanf_s("%d", &arra[i], 1);
}
mis(arra, 7);
return 0;
}
int mis( int arr[], int k)
{
int minus = 0;
int i;
//Составьте функцию, которая по заданному массиву определяет, есть ли в массиве хотя бы один отрицательный элемент
for ( i = 0; i < k; i++)
{
if(arr[i] < 0)
{
minus = 1;
}
}
if(minus == 0)
{
printf("positive\n");
}
else
{
printf("negative\n");
}
return 0;
}
Я надеюсь вы сами проверили и у вас все работает. Теперь поговорим о другом.
УдалитьСтарайтесь избегать вот таких непонятных чисел, как у вас семерка. Представьте, что у вас 20 разных циклов. Если нужно поменять длину массива с 7 на 100, вам придется изменить её везде. Это неудобно. Для таких целей используйте именованные константы. Подробнее о них в 20 уроке http://youngcoder.blogspot.ru/2013/12/osobennosti-chikla-for-imenovannie-constanty.html
Задали один раз, и всем все понятно, что это и как это.))
И второе. Можно несколько упростить вашу функцию. Вам ведь достаточно встретить один элемент отрицательный, и после этого остальной массив не проверять. Так используйте это для сокращения кода программы. =)
#include "stdio.h"
Удалить# define N 7
int mis(int arr[], int);
int main()
{
int i;
int arra[N];
for ( i = 0; i < N && (arra[i - 1] >= 0); i++)
{
printf("vvodim %d 4len massiva \n", i + 1);
scanf("%d", &arra[i]);
}
mis(arra, N);
return 0;
}
int mis( int arr[], int k)
{
int minus = 0;
int i;
//Составьте функцию, которая по заданному массиву определяет, есть ли в массиве хотя бы один отрицательный элемент
for ( i = 0; i < k; i++)
{
if(arr[i] < 0)
{
minus = 1;
}
}
if(minus == 0)
{
printf("positive\n");
}
else
{
printf("negative\n");
}
return 0;
}
KaDeaT спасибо за ваше время и нужные похвалы)) очень туго идет
ОтветитьУдалитьЗадание 1
ОтветитьУдалить#include "stdio.h>"
int main(){
int max,k=0,a[11]={1,14,24,32,88,4,12,54,22,3,4};
max=a[0];
for(int i=1; i<11; i++){
if(a[i]>max)
max=a[i];}
for(int i=0; a[i]!=max; i++){
k++;}
printf("Nomer elementa massiva %d\n", k);
return(0);
}
Не оптимально сначала искать максимальный элемент в массиве, а потом еще отдельно идти по массиву и определять его номер. Гораздо правильнее было бы завести дополнительную переменную, в которую сохранять номер максимального элемента.)
Удалить#include
ОтветитьУдалить#include
#include
int main()
{
int mas[7]={25, 14, 32, 27, 21, 5, 16}, max, n;
max=mas[0];
for (int i=1; i<7; i++)
if (max<mas[i])
{
max=mas[i];
n=i;
}
printf("max:%d\n", n);
_getch();
}
написал я так вот..другие тоже так писали и вы им отвечали "хорошо", хотя программа работает как то странно...в чем проблема:без разницы какие числа у меня в массиве введены, выводится какая то цифра на экран, которая с номером массива не связанна...в данном случае выводится "Мах:2" ,хотя большее число стоит в массиве 3
в чем проблемка?)прошу помощи
Проблемка в невнимательности. )
УдалитьНумерация элементов массива начинается с нуля. Именно поэтому всё не так как нужно. Более того, в вашей программе первый элемент вообще не проверяется. Т.е. если там будет максимальный элемент, то он не найдется.
Спасибо, быстро и доступно понятно)
Удалить#include
ОтветитьУдалить#include
#include
int main()
{
int arr[40],n,a=0,b,c=0;
printf("Vvedite 4islo:");
scanf_s("%d",&b);
for(int i=0;i<40;i++)
{
printf("Vvedite 4islo dlja massiva:");
scanf_s("%d",&n);
arr[i]=n;
a++;
if(n==0)
{
break;
}
}
for(int i=0;i<a-1;i++)
if(arr[i]<b)
{
c++;
}
printf("koli4estwo elementow w massive menjsche vvedennogo 4isla:%d",c);
_getch();
}
#include
ОтветитьУдалить#include
#include
int main()
{
int arr[40],n,a=0,c=0;
for(int i=0;i<40;i++)
{
printf("Vvedite 4islo dlja massiva:");
scanf_s("%d",&n);
arr[i]=n;
a++;
if(n==0)
{
break;
}
}
for(int i=0;i<a-1;i++)
if(arr[i]<0)
{
c++;
}
printf("negative numbers:%d",c);
_getch();
}
впринципе почти тоже самое, что и в задании выше...если я правильно понял постановку задачи(
#include
ОтветитьУдалитьint main(){
int n=6, tmp=0,// размерность массива
arr[6]={5,14,7,4,11,2}; // массив для сортировки
for (int i=n-1;i>0;i--)
for (int j=0;jarr[j+1]){ // если порядок нарушен
//меняем j и j+1 элементы массива местами
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
}
//выводим массив на экран
for (int i=0;i<n; i++)
printf("%d\n", arr[i]);
return(0);
}
best@mydebian:~/PROGRAMMIROVANIE$ gcc listing12.12.c -lm -std=c99 -o listing12.12
best@mydebian:~/PROGRAMMIROVANIE$ ./listing12.12
0
0
0
2
0
0
/////////////////////////////////////////////////////////
Полностью переписал программу, только пришлось объявить tmp, и вот какой результат
А вот это что такое?
Удалитьfor (int j=0;jarr[j+1])
Из-за этого ничего не работает.
Ну и tmp не нужна, тут моя опечатка. В этой строке
arr[j+1]=tmp;
очевидно нужно temp.
Если вы поняли алгоритм, то скорее всего должны были догадаться.
.
задача 4
ОтветитьУдалить#include "stdio.h"
#include "stdafx.h"
int main(){
int n=6, k=0;
int a[6]={-5,-14,7,4,11,-2};
for (int i=0;i<n;i++){
if (a[i]<0) printf ("%d element\n", k+1);
k++;}
return(0);
}
код какой-то маленький совсем получился... но вроде работает! :)
А теперь функцию, на вход которой подается массив, а она возвращает 1 если отрицательный элемент есть, в противном случае возвращает 0. ))
Удалитьhttp://ideone.com/Xrq966
ОтветитьУдалитьПопытался разбить на функции, так компилятор только ругается и пишет непонятные фразы типа: "результатом вычисления фрагмента не является функция, принимающая 0 аргументов", уже 2 дня сижу не могу понять в чем дело. Помогите пожалуйста.
http://ideone.com/G8Bzl7
УдалитьТаки разобрался сам, извиняюсь за панику. Спасибо за проделанную работу, очень интересно потратить время с пользой, изучая ваши уроки.
Добрый день.
УдалитьСпасибо за добрые слова.
Во-первых, поздравляю, что вы самостоятельно разобрались со своими ошибками. Это залог успеха вас, как программиста.
Во-вторых, есть и печальная новость. Ни одна из ваших программ не выполняет то действие, которое от нее требуется в задании.
1 задача. Вы выводите сам максимальный элемент, а требуется вывести его позицию в массиве.
2 задача. Начнем с того, что в вашем массиве нет 10 различных элементов.
0, 1, 2, 5, 12, 24, 34, 54 - всего 8. ) Далее, пусть бы их было даже 10.
arr[1000] = {1,2,3,4,5,6,7,8,9,1,2,10,11,12,13,1};
в этом массиве встречаются следующие элементы
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13
десятый по величине элемент это число 9, ваша же программа выдает 4.
Так что придется подумать еще немного.)
Я считал 10-й по величине элемент начиная с самого большого. Вот зачем искал максимальное. Очевидно сам себя запутал
УдалитьЭтот комментарий был удален автором.
ОтветитьУдалитьЗадание №2
ОтветитьУдалитьПрограмма находит 10-ый по возрастанию элемент. Кроме задания принятия массива функцией все, вроде, верно.
#include "stdio.h"
int min (int arr[1000], int min=arr[0]) {
for (int i=1; i<1001; i++) {
if (arr[i]<min) {
min=arr[i];
}
}
return (min);
}
Вторая часть программы
Удалитьint main () {
int arr[1000], min=arr[0], nextmin;
nextmin=min (arr[1000], min);
for (int i=1; i<11; i++) {
for (int i=0; i<1001; i++) {
if (arr[i]>min) {
nextmin=arr[i];
for (int i=1; i<1001; i++) {
if (arr[i]<nextmin) {
nextmin=arr[i];
}
}
}
}
}
printf ("%d", nextmin);
return(0);
}
http://pastebin.ru/rp7XW8OW
ОтветитьУдалитьвторое задание
Никак не могу разобраться.Отсутствует заголовок футкции.Программа без функции работает
Так у вас там точка с запятой стоит, она там не нужна.
УдалитьЕсли вы ставите точку с запятой то вы просто описываете прототип функции. В таких случаях где-то ниже снова нужно написать полный заголовок и тело функции. Обычно так делают когда функций очень много. Сначала пишут их прототипы, а рядом, в комментариях, подписывают что эта функция делает. А потом, уже в отдельном месте, обычно после все программы, дают полное описании функций.
Кстати, это не единственная ошибка у вас. )
http://pastebin.ru/4jH2aeAz
УдалитьС freopen сколько ни пытался не получается!С rand получилось.Что за причина?Выдает правильное число,в ручную считал.Но программа ругается
Скорее всего у вас VS 2013. Дело в том, что с некоторых пор функция freopen, как и некоторые другие, признана небезопасной. Для того, чтобы ей пользоваться нужно в программе отключить предупреждения о небезопасных функциях. Для этого добавьте самой первой строкой
Удалить#define _CRT_SECURE_NO_WARNINGS
либо заменяйте её безопасным аналогом
freopen_s().
Спасибо,Кирилл!С этим делом разобрался насилу
Удалитьhttp://pastebin.ru/1bZcQVyI
ОтветитьУдалитьДобрый день.Почему программа ругается,как только выходишь на функцию?
Добрый день, Александр.
УдалитьА как конкретно ругается-то? Пока вижу только одну ошибку. Вы создаете динамический массив, а удаляете потом другой массив.
Кроме того, динамический массив mass нигде не используется. Зачем же тогда вы его сделали?
Код я немного подкорректировал. Посмотрите, разберитесь. http://pastebin.ru/KoYsst8b
Программа ругалась:Expression:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse) .Как теперь понятно из за new и delete.Спасибо за подсказку.Кирилл!А динамический массив можно заполнить только с клавиатуры,или другие способы годятся?
УдалитьВсе способы пригодны.)
Удалитьhttp://pastebin.ru/CNvKgFyj
ОтветитьУдалитьДобрый день!
Не могу передать через return два значения в функции "обмен".Подскажите,что тут сделать?
Как я понял,return вообще плохо передаёт сложные переменные типа mass[i] или mass10 ?
Программа сразу выдает,что передача возможна не на всех путях.Заранее благодарен!.
//Задание 1
ОтветитьУдалить#include
#include
int main()
{
int max, a[10];
std::cout<<"Vvedite znachenia elementov massiva\n";
for (int i=0; i<10; i++)
{
std::cout << "Element"<> a[i];
}
max=a[0];
for (int i=0; i<11;i++)
{
if (a[i]>max)
{
max=a[i];
}
}
std::cout << "Max=" << max <<"\n";
return(0);
}
преобразил до неузнаваемости просто) понять как оно работало тут увы не выйдет
Удалить//Задание 2
ОтветитьУдалить#include
#include
#include
#include
int main()
{
setlocale(LC_ALL, "Rus");
int arr[1000],temp,n=1000;
int arr2[1000];
srand(time(NULL));//Рандомайз вкл
for(int i=0;i0;i--)
{
for(int j=0;jarr2[j+1])
{
arr2[j]+=arr2[j+1];
arr2[j+1]=arr2[j]-arr2[j+1];
arr2[j]-=arr[j+1];// упорядочил копию
}
}
}
std::cout<<"Элемент 10="<<arr2[10]<<"\n";
for(int p=0;p<1000;p++)
{
if(arr[p]==arr2[10])
{
std::cout<<"10 по велечине элемент="<< p <<"\n";// при совпадении значения элементов Arr с 10 значением его копии
}
}
return(0);// мне же нужно было номер элемента а не значение найти верно? я же не зря копию отсеевал.... не.... зря.....?Иначе потерял бы порядок значений и всё решилось бы на элемент 10 по значению = 10элемент :D
}
кароче смысла выкладывать не вижу.автор не побеспокоился о надлежащем подходе к написанию коментариев. больше половины текста порой сжирает( особенно при использовании iostream, но сканф меня доканал
УдалитьЭтот комментарий был удален автором.
ОтветитьУдалить