Использовать указатели вместо ссылок - C (СИ)
Формулировка задачи:
там надо указатели вместо ссылок использовать вроде, но у меня не получилось сделать для си, уже не работает голова, а сделать надо, на с++ работает верно, в задача вводим массив слов и вызываем функцию которая во второй массив заносит все повторяющиесчя слова
#include <iostream> #include <stdlib.h> #include <string.h> using namespace std; void newarray(char** &arrw1,int &razm,char** &arrw2); int main() { char** a=0;char** b;char s[100]; int i,n=0; printf("skolko slov hotite vvesti?"); scanf("%d",&n); a=(char**)malloc(sizeof(char*)*n); for(i=0;i<n;i++) { printf("\nslovo%d ",i+1); scanf("%s",&s); *(a+i)=(char*)malloc(sizeof(char)*(strlen(s)+1)); strcpy(*(a+i),s); } newarray(a,n,b); for(i=0;i<n;i++) printf("\n%s",b[i]); system("PAUSE"); return EXIT_SUCCESS; } void newarray(char** &arrw1,int &razm,char** &arrw2) { int m=0,i,j; arrw2=(char**)malloc(sizeof(char*)*razm); for(i=0;i<razm-1;i++) { for(j=i+1;j<razm;j++) if(!(strcmp(arrw1[i],arrw1[j]))) { *(arrw2+m)=(char*)malloc(sizeof(char)*(strlen(arrw1[j])+1)); strcpy(arrw2[m],arrw1[j]); m++; break; } /*if(k) { *(arrw2+m)=(char*)malloc(sizeof(char)*(strlen(arrw1[i])+1)); strcpy(arrw2[m],arrw1[i]); m++; k=0; }*/ } razm=m+1; }
Решение задачи: «Использовать указатели вместо ссылок»
textual
Листинг программы
#include <iostream> // эту строку удалить #include <stdlib.h> #include <string.h> using namespace std; // эту строку удалить void newarray(char** &arrw1,int &razm,char** &arrw2); // при объявлении прототипов, необязательно писать // имена всех переменных. Также тут не требуются символы амперсандов int main() { char** a=0; // оба указателя можно объявить в одной строке //и необязательно присваивать ему ноль (в этом случае) char** b; char s[100]; int i, n=0; printf("skolko slov hotite vvesti?"); scanf("%d",&n); a=(char**)malloc(sizeof(char*)*n); // не нужно писать (char**). //В Си, в отличие от C++ приведение типов происходит автоматически for(i=0; i<n; i++) { printf("\nslovo%d ",i+1); scanf("%s",&s); // перед именем массива не пишут символ амперсанда. s - сам по себе указатель *(a+i)=(char*)malloc(sizeof(char)*(strlen(s)+1)); // *(a+i) лучше заменить на a[i]. Будет более читабельно // Также не нужно явно приводить тип (char*). // Не нужно писать sizeof(char), потому что char итак // всегда занимает 1 байт strcpy(*(a+i),s); // *(a+i) лучше поменять на a[i] } newarray(a,n,b); for(i=0; i<n; i++) // Тут цикл проделывает лишнее количество повторений printf("\n%s",b[i]); system("PAUSE"); return EXIT_SUCCESS; } void newarray(char** &arrw1,int &razm,char** &arrw2) // символы амперсанда не требуются { int m=0,i,j; arrw2=(char**)malloc(sizeof(char*)*razm); // эту строку нужно вписать перед вызовом функции for(i=0; i<razm-1; i++) { for(j=i+1; j<razm; j++) if(!(strcmp(arrw1[i],arrw1[j]))) { *(arrw2+m)=(char*)malloc(sizeof(char)*(strlen(arrw1[j])+1)); //строку можно упростить strcpy(arrw2[m],arrw1[j]); m++; break; } /*if(k) { *(arrw2+m)=(char*)malloc(sizeof(char)*(strlen(arrw1[i])+1)); strcpy(arrw2[m],arrw1[i]); m++; k=0; }*/ } razm=m+1; // это вообще непонятно для чего }
Объяснение кода листинга программы
- Программа создает массив слов из ввода пользователя и сохраняет его в двухмерном массиве.
- Ввод количества слов осуществляется с помощью функции scanf().
- Для каждого введенного слова выделяется память с помощью функции malloc() и сохраняется указатель на это слово в массиве.
- В конце программы вызывается функция newarray(), которая создает новый массив, используя старый массив, и сохраняет его в переменной arrw2.
- Затем программа выводит новый массив на экран с помощью цикла for и функции printf().
- Для выхода из программы используется функция system(
PAUSE
). - Возвращаемое значение функции main() - EXIT_SUCCESS.
- В функции newarray() используется два вложенных цикла for.
- Внутренний цикл for выполняется до тех пор, пока не будет найден элемент, который повторяется в массиве.
- Если такой элемент найден, то для него выделяется память с помощью функции malloc() и сохраняется указатель на этот элемент в новом массиве.
- Функция strcmp() используется для сравнения двух строк.
- Если строки равны, то они копируются в новый массив с помощью функции strcpy().
- Переменная m используется для подсчета количества элементов в новом массиве.
- В конце функции newarray() переменная razm присваивается новое значение - m+1. Непонятно, для чего это делается.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д