# Pembahasan CS3 Alprog Rabu
> Author: Misc/Dwi
> Waktu pengerjaan ~33 menit
## Pendekatan:
CS3: kita diberikan cypher geser dan beberapa tambahan enkripsi yaitu:
:::info
- String akan "digeser" sejauh input pengguna
- Modifikasi Upin Ipin mencakup beberapa karakter spesial yang harus diperhatikan:
1. A / a -> 4
(Contoh: Jika string sudah digeser dan outputnya berisi huruf A atau a, maka A / a tersebut akan diubah menjadi 4)
2. E / e -> 3
3. I / i -> 1 (satu)
4. U / u -> V
5. O / o -> 0
6. Spasi -> Spasi (tetap / diabaikan)
:::
Dalam bahasa c untuk menggeser sebuah character kita dapat langsung melakukan penjumlahan char dengan int untuk menggeser char sebanyak int
- Fungsi pertama untuk menggeser karakter dalam string sesuai input pengguna.
- Fungsi kedua untuk menerapkan modifikasi Upin & Ipin setelah pergeseran dilakukan.
<br>
## Breakdown fungsi
### Enkripsi geser:
Dalam modul ini, kita diwajibkan menggunakan **pointer**. Oleh karena itu, variabel `str` dalam fungsi ini akan digunakan sebagai pointer agar dapat langsung dimodifikasi tanpa perlu menggunakan variabel global.
Untuk menggeser karakter dalam string, kita cukup menambahkan nilai integer `shift` pada setiap karakter alfabet. Proses ini dilakukan dengan menggunakan perulangan **for** yang berjalan hingga mencapai akhir string (`\0`).
Setelah pergeseran dilakukan, kita perlu memastikan hasil geseran masih berada dalam **rentang karakter alfabet yang valid**. Jika tidak, program akan menampilkan pesan kesalahan dan langsung berhenti.
```c
void shiftCipher(char *str, int shift)
{
int i;
for (i = 0; str[i] != '\0'; i++)
{
char ch = str[i];
if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))
{
char shifted = ch + shift;
if (!((shifted >= 'A' && shifted <= 'Z') || (shifted >= 'a' && shifted <= 'z'))) //Memeriksa jika hasil geser diluar range
{
printf("Out of bounds!\n");
exit(0);
}
str[i] = shifted;
}
}
}
```
---
### Enkripsi upin ipin
Bagian ini cukup sederhana. Kita cukup melakukan perulangan pada seluruh karakter dalam string dan menggantinya jika sesuai dengan aturan modifikasi yang telah ditentukan.
sekali lagi kita menggunakan pointer untuk mengubah nilai str secara langsung
```c
void encrypt(char *str)
{
for (int i = 0; str[i] != '\0'; i++)
{
if (str[i] == 'A' || str[i] == 'a')
str[i] = '4';
else if (str[i] == 'E' || str[i] == 'e')
str[i] = '3';
else if (str[i] == 'I' || str[i] == 'i')
str[i] = '1';
else if (str[i] == 'O' || str[i] == 'o')
str[i] = '0';
else if (str[i] == 'U' || str[i] == 'u')
str[i] = 'V';
}
}
```
---
### Fungsi utama (main())
Terakhir, kita perlu menginisialisasi variabel yang digunakan, menerima input dari pengguna, dan memanggil fungsi-fungsi yang telah dibuat sebelumnya.
> **Catatan:** Kita tidak perlu menggunakan ampersand (`&`) saat membaca string karena nama array sudah merupakan **pointer** ke elemen pertamanya.
```c
int main()
{
char str[100];
int shift;
printf("Masukkan String: ");
scanf("%99[^\n]", str);
printf("Masukkan Jarak Geser: ");
scanf("%d", &shift);
shiftCipher(str, shift);
encrypt(str);
printf("String Cipher: %s\n", str);
}
```
---
### Full Code:
```c
#include <stdio.h>
#include <stdlib.h>
void shiftCipher(char *str, int shift)
{
for (int i = 0; str[i] != '\0'; i++)
{
char ch = str[i];
if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))
{
char shifted = ch + shift;
if (!((shifted >= 'A' && shifted <= 'Z') || (shifted >= 'a' && shifted <= 'z')))
{
printf("Out of bounds!\n");
exit(0);
}
str[i] = shifted;
}
}
}
void encrypt(char *str)
{
for (int i = 0; str[i] != '\0'; i++)
{
if (str[i] == 'A' || str[i] == 'a')
str[i] = '4';
else if (str[i] == 'E' || str[i] == 'e')
str[i] = '3';
else if (str[i] == 'I' || str[i] == 'i')
str[i] = '1';
else if (str[i] == 'O' || str[i] == 'o')
str[i] = '0';
else if (str[i] == 'U' || str[i] == 'u')
str[i] = 'V';
}
}
int main()
{
char str[100];
int shift;
printf("Masukkan String: ");
scanf("%99[^\n]", str);
printf("Masukkan Jarak Geser: ");
scanf("%d", &shift);
shiftCipher(str, shift);
encrypt(str);
printf("String Cipher: %s\n", str);
}
```
---
## Terima Kasih!