JavaRush /Курсы /Harvard CS50 /Задание 0. Инициализация

Задание 0. Инициализация

Harvard CS50
2 уровень , 6 лекция
Открыта

Давайте поближе познакомимся со строками. Для этого создадим файл initials.c, а в нём напишем программу, которая запрашивает имя пользователя (имя в виде строки мы получим с помощью функции GetString) и затем выводит первые буквы имени (или имен) и фамилии в верхнем регистре без пробелов, точек и прочих знаков, только с переводом строки (\n).
Предполагаем, что пользователи вводят исключительно буквы (в нижнем или верхнем регистре, или обоих сразу) плюс по одному пробелу между словами. Считайте, что ребята с именами Joseph Gordon-Levitt, Conan O’Brien или David J. Malan не будут пользоваться нашей программой. 

Для автоматизации проверки кода, программа должна работать, как в приведённом ниже примере. Подчеркнутый текст — то, что пользователь набрал на клавиатуре.

jharvard @ appliance (~/Dropbox/pset2) ./initials
Zamyla Chan
ZC
jharvard @ appliance (~/Dropbox/pset2) ./initials
robert thomas bowden
RTB

Для проверки корректности работы программы вызывайте check50:

check50 2015.fall.pset2.initials initials.c

Хотите поиграться с реализацией программы, подготовленной сотрудниками CS50? Набирайте строку:

~cs50/pset2/initials
Комментарии (77)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
xephos23 Уровень 1
30 октября 2025
видел здесь что кто-то также реализовал с нуля перевод в верхний регистр

#include <stdio.h>
#include <cs50.h>
#include <string.h>

char char_to_upper(char c);

int main(void)
{
    string name = get_string("Введите имя: ");

    printf("%c", char_to_upper(name[0]));

    for (int i = 0, l = strlen(name); i < l; i++)
    {
        if (name[i] == ' ')
        {
            printf("%c", char_to_upper(name[i+1]));
        }
    }
    printf("\n");
}


char char_to_upper(char c)
{
    int ascii = (int)c;
    if (ascii >= 97 && ascii <= 122)
    {
        return (char)(ascii-32);
    }
    return c;
}

LankerTD Уровень 2
13 июля 2025
Сделал настолько коротко, насколько получилось

#include <stdio.h>
#include <cs50.h>
#include <string.h>

int main(void)
{
    string s = get_string("");
    for(int i = 0, n = strlen(s); i < n; i ++)
    {
        if((int)s[i] >= 65 && (int)s[i] <= 90)
        printf("%c", s[i]);
    }
    printf("\n");
}
KLACCACIN 234 Уровень 1
4 июля 2025
Попытался сделать как можно проще

#include <stdio.h>
#include <cs50.h>

int main(int argc, string argv[])
{
    for (int i = 1; i < argc; i++)
    {
         if (argv[i][0] >=97 && argv[i][0] <= 122)
             {
                 argv[i][0] -= 32;
             }
         printf("%c", argv[i][0]);
    }
    printf("\n");
}
Hennadii Nosach Уровень 1
10 января 2023

#include <ctype.h> // библиотека для преобразования символов
#include <string.h>
#include <stdio.h>
#include <cs50.h>

int main(void)
{
    string s = get_string("");
    int z = strlen(s); //подсчет кол-ва введенных символов
    printf("%c", toupper(s[0])); //выводим первый символ, toupper меняет регистр с нижнего на верхний (если уже верхний, то пропускает)
    for(int i=0; i<z; i++) //цикл для поиска пробелов
        {
            if (s[i]==' ')
            {
            printf("%c",toupper(s[i+1])); //печатаем символ после пробела, заодно меняем регистр по надобности
            }
        }
    printf("\n");
}
Anonymous #3604180 Уровень 11
5 августа 2025
Почему если в 13 строке поставить двойные кавычки то компилятор выдает ошибку?
Виктор Ларькин Уровень 3
7 ноября 2022
#include <stdio.h> #include <cs50.h> #include <string.h> int main(int avgc, char** argv) { string person; person = get_string("Введи свою ФИО: "); for (int i = 0, n = strlen(person); i < n; i++) { if ((int)person[i] > 64 && (int)person[i] < 91){ printf("%c", person[i]); } } printf("\n"); }
8 сентября 2022
#include <stdio.h> #include <cs50.h> #include <string.h> #include <ctype.h> int main (void) { string input = get_string ("Введите имя и фамилию,\n");; printf ("%c", toupper (input [0])); for (int i = 0, s = strlen (input); i < s; i++ ) if (input [i] == ' ' || input [i] == '\n' || input [i] == '\t') printf ("%c", toupper (input [i+1])); printf ("\n"); }
5 сентября 2022
#include <cs50.h> #include <stdio.h> #include <string.h> int main(void) { printf("Please, input your fullname: \n"); string fullname = get_string(""); // выводим первый символ if (fullname[0] >= 'a' && fullname[0] <= 'z') { printf("Your initials is: %c", fullname[0] - ('a' - 'A')); } else { printf("Your initials is: %c", fullname[0]); } // ищем символы после пробелов for (int i = 0, n = strlen(fullname); i < n; i++) { if (fullname[i] == ' ') { // делаем пропись в заглавные if (fullname[i+1] >= 'a' && fullname[i+1] <= 'z') { printf("%c", fullname[i+1] - ('a' - 'A')); } else { printf("%c", fullname[i+1]); } } } printf("\n"); }
Dinosaur Уровень 1
25 августа 2022
#include <stdio.h> #include <cs50.h> int main(void) { string fullname = get_string("Enter your first name and last name: \n"); // Чтобы сразу вывести первый символ из инициалов if (fullname[0] >= 'A' && fullname[0] <= 'Z') printf("%c", fullname[0]); else if (fullname[0] >= 'a' && fullname[0] <= 'z') printf("%c", fullname[0] - 'a' + 'A'); // Нам необходимо выводить первую букву не важно какого слова якобы инициал // Так как мы первый инициал уже вывели, можно начинать с i = 1, и в целях найти след инициал я проверяю чтобы перед началом слова стоял пробел for (int i = 1; fullname[i] != '\0'; i++) { if (fullname[i] >= 'A' && fullname[i] <= 'Z' && fullname[i-1] == ' ') printf("%c", fullname[i]); else if (fullname[i] >= 'a' && fullname[i] <= 'z' && fullname[i-1] == ' ') printf("%c", fullname[i] - 'a' + 'A'); } printf("\n"); }
Павел Зуев Уровень 1
24 августа 2022
#include <stdio.h> #include <cs50.h> #include <string.h> #include <ctype.h> int main(int argc,string argv[]) { for (int i=1; i<argc; i++) { for (int j=0, n=strlen(argv[i]); j<1 ; j++) { printf("%c", toupper (argv[i][j])); } } printf("\n"); }
weingeneer Уровень 1
11 февраля 2022
Реализация без использования библиотек для определения длины строки и перевода символа в верхний регистр. strlen в цикле for заменен на проверку существования name[i] вместо toupper написана функция print_upper, которая определяет по таблице ASCII относится ли символ к нижнему регистру и переводит в верхний.

#include <stdio.h>
#include <cs50.h>

void print_upper(char);

int main(void)
{
    string name = get_string("Enter a your name: ");
    for (int i = 0; name[i]; i++)
    {
        if (i == 0)
        {
            print_upper(name[i]);
        }
        else if (name[i] == ' ')
        {
            print_upper(name[i + 1]);
        }
    }
    printf("\n");
    return 0;
}

void print_upper(char let)
{
    if (let > 90)
    {
        printf("%c", let - ('a' - 'A'));
    }
    else
    {
        printf("%c", let);
    }
}
Alex Уровень 1
29 мая 2022
Интересная реализация. Найденный баг - неверно работает, если начать вводимое имя с пробела.