Да се напише функция на езика С, която приема едномерен масив от цели числа и неговия размер, като масивът се подава чрез указател. Функцията трябва да намери и върне максималния елемент в масива, като използва указателна аритметика за обхождането.
#include <stdio.h>
int findMax(int *arr, int size) {
// 1. Инициализираме max със стойността, към която сочи началният адрес
int max = *arr;
// 2. Създаваме помощен указател p, който тръгва от началото
// Движим го, докато стигне адреса на последния елемент (arr + size)
for (int *p = arr; p < arr + size; p++) {
// Сравняваме текущата стойност (*p) с текущия максимум
if (*p > max) {
max = *p;
}
}
return max;
}
int main() {
int numbers[] = {12, 45, 7, 89, 34, 23};
int n = sizeof(numbers) / sizeof(numbers[0]);
int maxVal = findMax(numbers, n);
printf("Максималният елемент е: %d\n", maxVal);
return 0;
}Да се състави функция, която приема квадратна матрица от цели числа и нейния размер. Матрицата трябва да се подава чрез указател, а функцията трябва да извърши транспониране на матрицата на място, без да използва допълнителна памет за друга матрица.
#include <stdio.h>
// Функцията приема указател към първия елемент, и размера N (квадратна матрица)
void transposeInPlace(int *matrix, int n) {
for (int i = 0; i < n; i++) {
// Започваме j от i + 1, за да обхождаме само горния триъгълник над диагонала
for (int j = i + 1; j < n; j++) {
// Намираме адресите на двата елемента за размяна:
// Елемент [i][j]
int *p1 = matrix + (i * n + j);
// Елемент [j][i]
int *p2 = matrix + (j * n + i);
// Класическа размяна (swap) чрез помощна променлива
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
}
}
void printMatrix(int *matrix, int n) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("%d ", *(matrix + i * n + j));
}
printf("\n");
}
}
int main() {
int n = 3;
int matrix[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
printf("Оригинална матрица:\n");
printMatrix((int *)matrix, n);
transposeInPlace((int *)matrix, n);
printf("\nТранспонирана матрица:\n");
printMatrix((int *)matrix, n);
return 0;
}Да се дефинира структура Book, съдържаща заглавие, автор и брой страници. Да се напише функция, която приема масив от такива структури чрез указател и намира книгата с най-голям брой страници, като извежда нейните данни.
#include <stdio.h>
#include <string.h>
// Дефиниране на структурата Book
struct Book {
char title[100];
char author[50];
int pages;
};
// Функция, която приема масив от структури чрез указател
void findThickestBook(struct Book *books, int size) {
// Приемаме, че първата книга е с най-много страници първоначално
struct Book *thickest = books;
for (int i = 1; i < size; i++) {
// Използваме оператора -> за достъп до елементите чрез указател
if ((books + i)->pages > thickest->pages) {
thickest = books + i; // Запазваме адреса на книгата с повече страници
}
}
// Извеждаме данните
printf("Книга с най-много страници:\n");
printf("Заглавие: %s\n", thickest->title);
printf("Автор: %s\n", thickest->author);
printf("Брой страници: %d\n", thickest->pages);
}
int main() {
// Създаваме масив от структури
struct Book library[3] = {
{"Под игото", "Иван Вазов", 500},
{"Тютюн", "Димитър Димов", 900},
{"Бай Ганьо", "Алеко Константинов", 250}
};
findThickestBook(library, 3);
return 0;
}Да се напише функция, която приема едномерен масив от цели числа и неговия размер чрез указател. Функцията трябва да намери минималния и максималния елемент в масива и да разменя техните стойности, като използва указатели за достьп до елементите.
#include <stdio.h>
void swapMinMax(int *arr, int size) {
if (size <= 1) return; // Няма какво да разменяме при 0 или 1 елемент
// 1. Инициализираме указателите да сочат към първия елемент
int *minPtr = arr;
int *maxPtr = arr;
// 2. Обхождаме масива с указателна аритметика
for (int *p = arr + 1; p < arr + size; p++) {
if (*p < *minPtr) {
minPtr = p; // Запомняме адреса на новия минимум
}
if (*p > *maxPtr) {
maxPtr = p; // Запомняме адреса на новия максимум
}
}
// 3. Разменяме стойностите на адресите, които намерихме
// Използваме временна променлива 'temp'
int temp = *minPtr;
*minPtr = *maxPtr;
*maxPtr = temp;
printf("Разменени са елементите: %d и %d\n", *maxPtr, *minPtr);
}
void printArray(int *arr, int size) {
for (int i = 0; i < size; i++) {
printf("%d ", *(arr + i));
}
printf("\n");
}
int main() {
int data[] = {7, 2, 9, 1, 5, 8};
int n = sizeof(data) / sizeof(data[0]);
printf("Преди размяната: ");
printArray(data, n);
swapMinMax(data, n);
printf("След размяната: ");
printArray(data, n);
return 0;
}Да се създаде програма за работа с информация за ученици и техните оценки. Да се дефинира структура Student, която съдържа име на студент и масив от оценки. Да се реализират функции, които приемат масив от такива структури чрез указател. Една функция трябва да въвежда данните за учениците, друга да изчислява средния успех на всеки ученик, трета да намира ученика с най-висок среден успех и да връща указател към него, а четвърта да сортира масива от ученици по среден успех. В решението трябва да се използват указатели към структури, масиви в структури и подаване на параметри към функции чрез указатели.
#include <stdio.h>
#include <string.h>
#define MAX_GRADES 5
typedef struct {
char name[50];
int grades[MAX_GRADES];
float average; // Добавяме поле за среден успех за по-лесно сортиране
} Student;
// 1. Функция за въвеждане на данни
void inputStudents(Student *arr, int count) {
for (int i = 0; i < count; i++) {
printf("Име на студент %d: ", i + 1);
scanf("%s", (arr + i)->name);
printf("Въведете %d оценки: ", MAX_GRADES);
for (int j = 0; j < MAX_GRADES; j++) {
scanf("%d", &(arr + i)->grades[j]);
}
}
}
// 2. Функция за изчисляване на среден успех
void calculateAverages(Student *arr, int count) {
for (int i = 0; i < count; i++) {
int sum = 0;
for (int j = 0; j < MAX_GRADES; j++) {
sum += (arr + i)->grades[j];
}
(arr + i)->average = (float)sum / MAX_GRADES;
}
}
// 3. Функция, която намира най-добрия и ВРЪЩА УКАЗАТЕЛ към него
Student* findTopStudent(Student *arr, int count) {
Student *top = arr;
for (int i = 1; i < count; i++) {
if ((arr + i)->average > top->average) {
top = (arr + i);
}
}
return top;
}
// 4. Сортиране на масива по среден успех (Bubble Sort)
void sortStudents(Student *arr, int count) {
for (int i = 0; i < count - 1; i++) {
for (int j = 0; j < count - i - 1; j++) {
if ((arr + j)->average < (arr + j + 1)->average) {
// Размяна на целите структури
Student temp = *(arr + j);
*(arr + j) = *(arr + j + 1);
*(arr + j + 1) = temp;
}
}
}
}
void printStudents(Student *arr, int count) {
printf("\n--- Списък на студентите ---\n");
for (int i = 0; i < count; i++) {
printf("%s - Среден успех: %.2f\n", (arr + i)->name, (arr + i)->average);
}
}
int main() {
int n = 3;
Student class[3];
inputStudents(class, n);
calculateAverages(class, n);
printf("\nПреди сортиране:");
printStudents(class, n);
sortStudents(class, n);
printf("\nСлед сортиране (низходящо):");
printStudents(class, n);
Student *best = findTopStudent(class, n);
printf("\nНай-висок успех има: %s (%.2f)\n", best->name, best->average);
return 0;
}