หัวกดโค้ด C


12

สถานการณ์: คุณเป็นครูมัธยมสอนวิธีการเขียนโปรแกรม C อย่างไรก็ตามเนื่องจากเป็นเพียงจุดเริ่มต้นของคำศัพท์คุณจึงไม่ได้สอนพวกเขาเกี่ยวกับความสำคัญของการเยื้องและการเว้นวรรค ในขณะที่คุณกำลังทำเครื่องหมายงานของพวกเขาดวงตาของคุณเจ็บปวดมากจนคุณกรีดร้องด้วยความเจ็บปวดและตระหนักว่าสิ่งนี้ไม่สามารถดำเนินต่อไปได้

ภารกิจ: คุณได้ตัดสินใจที่จะเขียนโปรแกรมในภาษาใด ๆ ที่ใช้ซอร์สโค้ด C ที่ถูกต้องเป็นอินพุตและเอาต์พุตในรูปแบบที่เหมาะสม คุณควรตัดสินใจว่าโค้ดที่จัดรูปแบบเป็นอย่างไรเนื่องจากเป็นการประกวดความนิยม คุณได้รับการสนับสนุนให้ใช้งานคุณลักษณะต่างๆได้มากเท่าที่จะทำได้ดังตัวอย่างต่อไปนี้:

  • เพิ่มการเยื้องที่เหมาะสมที่ด้านหน้าของแต่ละบรรทัด
  • เพิ่มช่องว่างหลัง,และผู้ประกอบการอื่น ๆ เช่นการแปลงไปint a[]={1,2,3}; int a[] = {1, 2, 3};จำไม่ได้ว่าจะดำเนินการกับผู้ประกอบการภายในตัวอักษรสตริงแม้ว่า
  • ลบช่องว่างต่อท้ายหลังแต่ละบรรทัด
  • การแยกข้อความออกเป็นหลายบรรทัดเช่นนักเรียนอาจเขียนtmp=a;a=b;b=tmp;หรือint f(int n){if(n==1||n==2)return 1;else return f(n-1)+f(n-2);}ทั้งหมดในหนึ่งบรรทัดคุณสามารถแยกมันออกเป็นหลายบรรทัดได้ ระวังforลูปแม้ว่าพวกเขาจะมีเครื่องหมายอัฒภาคในพวกเขา แต่ฉันไม่คิดว่าคุณควรแยกพวกเขาออก
  • เพิ่มบรรทัดใหม่หลังจากกำหนดแต่ละฟังก์ชั่น
  • คุณสมบัติอื่น ๆ ที่คุณจะได้รับจากความช่วยเหลือที่คุณเข้าใจรหัสนักเรียน

เกณฑ์การชนะ: นี่คือการประกวดความนิยมดังนั้นคำตอบที่มีผู้โหวตมากที่สุดจะเป็นผู้ชนะ ในกรณีที่เสมอกันคำตอบที่มีคุณสมบัติส่วนใหญ่จะนำไปใช้ชนะ หากเป็นเน็คไทอีกครั้งรหัสที่สั้นที่สุดจะเป็นผู้ชนะ

คุณควรที่จะรวมรายการฟีเจอร์ที่คุณนำไปใช้ในคำตอบรวมทั้งตัวอย่างอินพุตและเอาท์พุต

แก้ไข: ตามที่ร้องขอในความคิดเห็นที่นี่เป็นตัวอย่างอินพุต แต่โปรดจำไว้ว่ามันเป็นเพียงสำหรับการอ้างอิงและคุณขอแนะนำให้ใช้คุณสมบัติมากที่สุดเท่าที่จะทำได้

การป้อนข้อมูล:

#include <stdio.h>
#include<string.h>
int main() {
int i;
char s[99];
     printf("----------------------\n;;What is your name?;;\n----------------------\n"); //Semicolon added in the string just to annoy you
             /* Now we take the input: */
    scanf("%s",s);
    for(i=0;i<strlen(s);i++){if(s[i]>='a'&&s[i]<='z'){
        s[i]-=('a'-'A'); //this is same as s[i]=s[i]-'a'+'A'
}}printf("Your name in upper case is:\n%s\n",s);
   return 0;}

นี่คือวิธีที่ฉันจะจัดรูปแบบรหัสนี้ตามปกติ: (ฉันเป็นคนขี้เกียจ)

#include <stdio.h>
#include <string.h>
int main() {
    int i;
    char s[99];
    printf("----------------------\n;;What is your name?;;\n----------------------\n"); //Semicolon added in the string just to annoy you
    /* Now we take the input: */
    scanf("%s",s);
    for(i=0;i<strlen(s);i++) {
        if(s[i]>='a'&&s[i]<='z') {
            s[i]-=('a'-'A'); //this is same as s[i]=s[i]-'a'+'A'
        }
    }
    printf("Your name in upper case is:\n%s\n",s);
    return 0;
}

นี่คือวิธีที่ฉันคิดว่าอ่านง่ายกว่า:

#include <stdio.h>
#include <string.h>
int main() {
    int i;
    char s[99];
    printf("----------------------\n;;What is your name?;;\n----------------------\n"); //Semicolon added in the string just to annoy you
    /* Now we take the input: */
    scanf("%s", s);
    for(i = 0; i < strlen(s); i++) {
        if(s[i] >= 'a' && s[i] <= 'z') {
            s[i] -= ('a' - 'A'); //this is same as s[i]=s[i]-'a'+'A'
        }
    }
    printf("Your name in upper case is:\n%s\n", s);
    return 0;
}




นอกจากนี้เมื่อฉันเริ่มมีคำตอบคำตอบที่มีการนับคะแนนสูงสุดจะได้รับการยอมรับ 5 วันหลังจากคำตอบสุดท้ายคือถ้าไม่มีคำตอบใหม่ภายใน 5 วันการประกวดนี้จะสิ้นสุด


2
เหตุผลใดสำหรับการลงคะแนนเสียง?
user12205

1
ฉันสามารถลบช่องว่างที่ไม่จำเป็นทั้งหมด ( s/\s+/ /) และเรียกมันว่าวันละ
วงล้อประหลาด

1
@ วงล้อประหลาดคุณทำได้ แต่ฉันไม่คิดว่านี่จะเป็นคำตอบที่มีจำนวนมาก upvotes
user12205

1
@Quincunx ขอบคุณสำหรับการตั้งค่าเงินรางวัล ฉันคิดว่าคำถามของฉันถูกดูด
user12205

1
@CousinCocaine: นี่เป็นบริบทความนิยม พวกเขาไม่ได้ออกแบบมาเพื่อแก้ปัญหาในลักษณะที่สง่างามหรือมาตรฐาน พวกเขาถูกออกแบบมาเพื่อแก้ปัญหาในวิธีที่เจ๋งที่สุดที่คุณสามารถจินตนาการ
SztupY

คำตอบ:


21

เพราะเรากำลังพูดถึงการเยื้องและการเว้นวรรคเราเพียงแค่ต้องเขียนโค้ดในการเขียนโปรแกรมภาษาที่ได้รับการออกแบบรอบ ๆช่องว่างตามที่จะต้องง่ายที่สุดใช่มั้ย?

ดังนั้นทางออกคือ:




















































































































































































































































































































































































































































นี่มันอยู่ใน base64:

ICAgCQogICAgCgkJICAgIAkgCiAgICAKCQkgICAgCQkKICAgIAoJCSAgICAJICAKICAgIAoJCSAgICAJIAkKICAgIAoJCSAKIAogCQoKICAgCSAKICAgCQoJCQkgICAJCQkgCQkKCSAgCQoJICAJICAKICAgCQoJCQkgICAJIAkgCgkgIAkKCSAgCSAJCiAgIAkKCQkJICAgCSAgCQoJICAJCgkgIAkgCQogICAJCgkJCSAgIAkgICAgIAoJICAJCgkgIAkgCQogICAJCgkJCSAgIAkJCQkJIAkKCSAgCQoJICAJCSAKICAgCQoJCQkgICAJICAgCSAKCSAgCQoJICAJICAgIAogICAJCgkJCSAgIAkgCSAgIAoJICAJCgkgIAkgICAJCQogICAJCgkJCSAgIAkgCSAgCQoJICAJCgkgIAkgIAkgIAogICAJIAogICAJCgkJIAogCSAJCQkKICAgCQoJCQkJCiAgCgkKCiAgIAkgIAogICAJCgkJCQkKICAKCQoKICAgCSAJCgoJCgogICAJCSAKICAgCQkKICAgCQkKCQkJICAgCQoJICAJCQkgICAgCSAKICAgCQoJCSAKIAkgCQkJCiAgIAkKCQkJCQogIAoJCgogICAJICAgIAogICAJIAogICAJIAoJCSAKIAkgCQkJCiAgIAkKCQkJCQogIAoJCgogICAJICAgCQkKICAgCSAJCiAgIAkgCQoJCQkgICAJCgkgICAJCSAgICAJIAogICAJCgkJIAogCSAJCQkKICAgCQoJCQkJCiAgCgkKCiAgIAkgIAkgIAogICAJIAkKICAgCSAJCgkJCSAgIAkKCSAgCQkJICAgIAkgCiAgIAkKCQkgCiAJIAkJCQogICAJCgkJCQkKICAKCQoKICAgCQkKICAgCQoJCQkgICAJIAkgCgkgIAkKCSAgCQkgIAogICAJCgkJCSAgIAkJCQkgCQkKCSAgCQoJICAJCSAJCiAgIAkKCQkJICAgCQkJCQkgCQoJICAJCgkgIAkJCSAKICAgCQoJCQkgICAJCQkgCQkKCSAgCQoJICAJCQkJCiAgIAkKCQkJICAgCSAgIAkgCgkgIAkKCSAgCQkgCQkKICAgCQoJCQkgICAJIAkgCSAKCSAgCQoJICAJCQkgIAogICAJCgkJCSAgIAkgCQkJCQoJICAJCgkgIAkJCSAJCiAgIAkKCQkJICAgCSAJICAgCgkgIAkKCSAgCSAgCSAJCiAgIAkKCQkJICAgCSAJICAJCgkgIAkKCSAgCSAgCQkgCiAgIAkKCQkJCQogIAoJCgogICAJCSAgCiAgIAkgCiAgICAKCQkgCgkKCiAgIAkJIAkKICAgCQoJCQkJCiAgICAgCSAKICAgIAoJCSAgICAJCQogICAJCQoJCQkgICAJCgkgICAJCSAKCQoKICAgCQkJIAogICAJCQogICAJCQoJCQkgICAJCgkgIAkJCSAKIAkgCQkJCiAgIAkKCQkJCQogICAgIAkgCiAgICAKCQkgCgkKCiAgIAkJCQkKICAgCQoJCQkJCiAgICAgCSAJCgkJCQoJICAJIAkgCgoJCgogICAJICAJCQkKICAgCSAKICAgIAoJCSAKCQoKICAgCQkgCQkKICAgCQoJCQkJCiAgICAgCSAKICAgCSAKCQkgCgkKCiAgIAkJCSAgCiAgIAkgIAoJCQkgICAJIAkJCQkKCSAgCQoJICAJCQkJIAogICAJCgkJCQkKICAKCQoKICAgCQkJIAkKICAgCSAgCgkJCSAgIAkgCQkJCQoJICAJCgkgIAkJCQkJCiAgIAkKCQkJCQogIAoJCgogICAJCQkJIAogICAJCgkJCQkKICAgICAJIAogICAJCQoJCSAKCQoKICAgCQkJCQkKICAgCQoJCQkJCiAgICAgCSAKICAgCSAgCgkJIAoJCgogICAJICAJIAkKICAgCSAJCiAgIAkgCQoJCQkgICAJCgkgICAJCSAgICAJCgkJCQkKICAKCQoKICAgCSAgCQkgCiAgIAkgCQogICAJIAkKCQkJICAgCQoJICAJCQkgICAgCQoJCQkJCiAgCgkKCiAgIAkJCQogICAJIAkgCgkKICAgICAJCQoJCQkKICAgCSAgCQogCiAKCSAgCSAgIAogCiAKCQkgCSAgIAogICAJICAgICAKCQogICAgIAkgICAgIAoJCiAgICAgCQoJICAJCiAKIAkgIAkKCiAgIAkgICAKCgkKCiAgIAkgCSAJCiAgIAkKCQkJICAgCSAJIAoJICAJCgkgIAkJICAgCiAgIAkKCQkJICAgCSAgIAkgCgkgIAkKCSAgCQkgIAkKICAgCQoJCQkJCiAgCgkKCiAgIAkJICAgCiAgIAkgCiAgICAKCQkgCgkKCiAgIAkJICAJCiAgIAkgIAoJCQkgICAJIAkJCSAgCgkgIAkKCSAgCQkgCSAKICAgCSAKICAgCQoJCSAgICAJCgkJCQkKICAKCQoKICAgCQkgCSAKICAgCQoJCQkJCiAgCgkKCiAgIAkgCQkgCiAgIAkKCQkJICAgCSAJCQkJCgkgIAkKCSAgCSAgICAgCiAgIAkKCQkJCQogIAoJCgogICAJICAgICAKICAgCSAgCgkJCSAgIAkgCSAJIAoJICAJCgkgIAkgICAgCQogICAJCgkJCQkKICAKCQoKICAgCSAgICAJCiAgIAkKCQkJCQogICAgIAkgCiAgIAkKCQkgCgkKCiAgIAkgCQkJCiAgIAkKCQkJICAgCSAJIAoJICAJCgkgIAkgICAJIAogICAJCgkJCQkKICAKCQoKICAgCSAgIAkgCiAgIAkgCiAgICAKCQkgCgkKCiAgIAkKICAgCSAgCiAgIAkKCQkJCQkgICAgCQoJCgkgICAgCSAKCQkJCgkgIAkgCSAKICAgCSAKCQkJICAgCQoJICAJCgkgIAkgICAJCiAgIAkgCgkJCSAgIAkgCgkgIAkKCSAgCSAgCSAKICAgCSAKCQkJICAgCQkKCSAgCQoJICAJICAJCQogICAJIAoJCQkgICAJICAKCSAgCQoJICAJIAkgIAoKICAgCSAgIAkKCiAJIAkJCgogCiAJIAkJCgogICAJIAkgCgogCSAJIAoKIAogCSAJCQoKICAgCSAgCSAKCiAJIAkgCSAJCgogCiAJIAkJCgogICAJICAJCQoKIAkgCSAJCSAKCiAKIAkgCQkKCiAgIAkgCSAgCgogCSAJIAkJCQoKICAgCSAJCQoKIAogCQoKCgo=

สำหรับผู้ที่มีปัญหาในการพิมพ์รหัสบนกระดาษนี่เป็นรุ่นที่มีคำอธิบายประกอบ (คุณสามารถค้นหาคอมไพเลอร์สำหรับสิ่งนี้ในตอนท้ายของคำตอบ):

# heap structure:
# 1: read buffer
# 2: parser state
#   0: before indentation
#   1: after indentation
#   2: inside a string literal
#   3: inside a multiline comment
#   4: inside a single line comment
# 3: identation
# 4: old read buffer
# 5: parenthesis nesting amount

# -------------------
# initialize heap
# -------------------
SS 1 | SS 0 | TTS # [1] := 0
SS 2 | SS 0 | TTS # [2] := 0
SS 3 | SS 0 | TTS # [3] := 0
SS 4 | SS 0 | TTS # [4] := 0
SS 5 | SS 0 | TTS # [5] := 0
LSL 1 # goto L1

# -------------------
# sub: determine what to do in state 0
# -------------------
LSS 2 # LABEL L2
SS 1 | TTT | SS  59 | TSST | LTS 4 # if [1] == ; GOTO L4
SS 1 | TTT | SS  10 | TSST | LTS 5 # if [1] == \n GOTO L5
SS 1 | TTT | SS   9 | TSST | LTS 5 # if [1] == \t GOTO L5
SS 1 | TTT | SS  32 | TSST | LTS 5 # if [1] == ' ' GOTO L5
SS 1 | TTT | SS 125 | TSST | LTS 6 # if [1] == } GOTO L6
SS 1 | TTT | SS  34 | TSST | LTS 16 # if [1] == " GOTO L16
SS 1 | TTT | SS  40 | TSST | LTS 35 # if [1] == ( GOTO L35
SS 1 | TTT | SS  41 | TSST | LTS 36 # if [1] == ) GOTO L36

SS 2 | SS 1 | TTS # [2] := 1
LST 7 # call L7
SS 1 | TTT | TLSS # print [1]
LTL # return

LSS 4 # label L4 - ; handler
SS 1 | TTT | TLSS # print [1]
LTL # return

LSS 5 # label L5 - WS handler
LTL # return

LSS 6 # label L6 - } handler
# decrease identation by one
SS 3 | SS 3 | TTT | SS 1 | TSST | TTS # [3] := [3] - 1
SS 2 | SS 1 | TTS # [2] := 1
LST 7 # call L7
SS 1 | TTT | TLSS # print [1]
LTL # return

LSS 16 # label L16 - " handler
SS2 | SS 2 | TTS # [2] := 2
LST 7 # call L7
SS1 | TTT | TLSS # print [1]
LTL

LSS 35
SS 5 | SS 5 | TTT | SS 1 | TSSS | TTS # [5] := [5] + 1
SS 2 | SS 1 | TTS # [2] := 1
LST 7 # call L7
SS1 | TTT | TLSS # print [1]
LTL

LSS 36
SS 5 | SS 5 | TTT | SS 1 | TSST | TTS # [5] := [5] - 1
SS 2 | SS 1 | TTS # [2] := 1
LST 7 # call L7
SS1 | TTT | TLSS # print [1]
LTL

# -------------------
# sub: determine what to do in state 1
# -------------------
LSS 3 # LABEL L3
SS 1 | TTT | SS  10 | TSST | LTS 12 # if [1] == \n GOTO L12
SS 1 | TTT | SS 123 | TSST | LTS 13 # if [1] == { GOTO L13
SS 1 | TTT | SS 125 | TSST | LTS 14 # if [1] == } GOTO L14
SS 1 | TTT | SS  59 | TSST | LTS 15 # if [1] == ; GOTO L15
SS 1 | TTT | SS  34 | TSST | LTS 27 # if [1] == " GOTO L27
SS 1 | TTT | SS  42 | TSST | LTS 28 # if [1] == * GOTO L28
SS 1 | TTT | SS  47 | TSST | LTS 29 # if [1] == / GOTO L29
SS 1 | TTT | SS  40 | TSST | LTS 37 # if [1] == ( GOTO L37
SS 1 | TTT | SS  41 | TSST | LTS 38 # if [1] == ) GOTO L38
SS 1 | TTT | TLSS # print [1]
LTL # return

LSS 12 # LABEL L12 - \n handler
SS 2 | SS 0 | TTS # [2] := 0
LTL # return

LSS 13 # LABEL L13 - { handler
SS 1 | TTT | TLSS # print [1]
SS 2 | SS 0 | TTS # [2] := 0
SS 3 | SS 3 | TTT | SS 1 | TSSS | TTS # [3] := [3] + 1
LTL # return

LSS 14 # LABEL L14 - } handler
SS 3 | SS 3 | TTT | SS 1 | TSST | TTS # [3] := [3] - 1
LST 7 # call L7
SS 1 | TTT | TLSS # print [1]
SS 2 | SS 0 | TTS # [2] := 0
LTL # return

LSS 15 # LABEL L15 - ; handler
SS 1 | TTT | TLSS # print [1]
SS 5 | TTT | LTS 10 # if [5] == 0 GOTO L39
LTL

LSS 39
SS 2 | SS 0 | TTS # [2] := 0
LTL # return

LSS 27 # label L27 - " handler
SS1 | TTT | TLSS # print [1]
SS2 | SS 2 | TTS # [2] := 2
LTL

LSS 28 # label L28 - * handler - this might start a comment
SS 4 | TTT | SS  47 | TSST | LTS 30 # if [4] == / GOTO L30
SS1 | TTT | TLSS # print [1]
LTL

LSS 29 # label L29 - / handler - this might start a comment
SS 4 | TTT | SS  47 | TSST | LTS 31 # if [4] == / GOTO L31
SS1 | TTT | TLSS # print [1]
LTL

LSS 30 # label L30 - /* handler
SS1 | TTT | TLSS # print [1]
SS2 | SS 3 | TTS # [2] := 3
LTL

LSS 31 # label L31 - // handler
SS1 | TTT | TLSS # print [1]
SS2 | SS 4 | TTS # [2] := 4
LTL

LSS 37
SS 5 | SS 5 | TTT | SS 1 | TSSS | TTS # [5] := [5] + 1
SS1 | TTT | TLSS # print [1]
LTL

LSS 38
SS 5 | SS 5 | TTT | SS 1 | TSST | TTS # [5] := [5] - 1
SS1 | TTT | TLSS # print [1]
LTL

# -------------------
# sub: print identation
# -------------------
LSS 7 # label L7 - print identation
SS 10 | TLSS # print \n
SS 3 | TTT # push [3]
LSS 9 # label L9 - start loop
SLS | LTS 8 # if [3] == 0 GOTO L8
SLS | LTT 8 # if [3] < 0 GOTO L8 - for safety
SS 32 | TLSS # print ' '
SS 32 | TLSS # print ' '
SS 1  | TSST # i := i - 1
LSL 9 # GOTO L9
LSS 8 # label L8 - end loop
LTL #

# -------------------
# sub: L21 - string literal handler
# -------------------
LSS 21
SS 1 | TTT | SS  10 | TSST | LTS 24 # if [1] == \n GOTO L24
SS 1 | TTT | SS  34 | TSST | LTS 25 # if [1] == " GOTO L25
SS 1 | TTT | TLSS # print [1]
LTL

LSS 24 # \n handler - this should never happen, but let's be prepared and reset the parser
SS 2 | SS 0 | TTS # [2] := 0
LTL # return

LSS 25 # " handler - this might be escaped, so be prepared
SS 4 | TTT | SS  92 | TSST | LTS 26 # if [4] == \ GOTO L26
SS 2 | SS 1 | TTS # [2] := 1
SS 1 | TTT | TLSS # print [1]
LTL

LSS 26 # \\" handler - escaped quotes don't finish the literal
SS 1 | TTT | TLSS # print [1]
LTL

# -------------------
# sub: L22 - multiline comment handler
# -------------------
LSS 22
SS 1 | TTT | SS  47 | TSST | LTS 32 # if [1] == / GOTO L32
SS 1 | TTT | TLSS # print [1]
LTL

LSS 32
SS 4 | TTT | SS  42 | TSST | LTS 33 # if [4] == * GOTO L33
SS 1 | TTT | TLSS # print [1]
LTL

LSS 33
SS 1 | TTT | TLSS # print [1]
SS 2 | SS 1 | TTS # [2] := 1
LTL
# -------------------
# sub: L23 - singleline comment handler
# -------------------
LSS 23
SS 1 | TTT | SS  10 | TSST | LTS 34 # if [1] == \n GOTO L34
SS 1 | TTT | TLSS # print [1]
LTL

LSS 34
SS 2 | SS 0 | TTS # [2] := 0
LTL

# -------------------
# main loop
# -------------------
LSS 1 # LABEL L1
SS 4 | SS 1 | TTT | TTS # [4] := [1]
SS 1 | TLTS # [1] := read

SS 2 | TTT | LTS 10 # if [2] == 0 GOTO L10
SS 2 | TTT | SS 1 | TSST | LTS 17 # if [2] == 1 GOTO L17
SS 2 | TTT | SS 2 | TSST | LTS 18 # if [2] == 2 GOTO L18
SS 2 | TTT | SS 3 | TSST | LTS 19 # if [2] == 3 GOTO L19
SS 2 | TTT | SS 4 | TSST | LTS 20 # if [2] == 4 GOTO L20

LSS 17
LST 3  # call L3
LSL 11 # GOTO L11

LSS 10 # label L10
LST 2  # call L2
LSL 11

LSS 18
LST 21
LSL 11

LSS 19
LST 22
LSL 11

LSS 20
LST 23

LSS 11 # label L11
LSL 1  # goto L1
LLL # END

ยังคงอยู่ในระหว่างการดำเนินการถึงแม้ว่าหวังว่ามันจะผ่านเกณฑ์ส่วนใหญ่!

คุณสมบัติที่รองรับในปัจจุบัน:

  • ระบุการแก้ไขตาม{และ}ตัวละคร
  • เพิ่มบรรทัดใหม่หลังจาก ;
  • จัดการกับตัวอักษรการเยื้องภายในตัวอักษรของสตริง (รวมถึงความจริงที่ว่าตัวอักษรของสตริงไม่ได้ถูกปิดเมื่อพบ a \")
  • จัดการกับตัวอักษรการเยื้องภายในความคิดเห็นเดียวและหลายบรรทัด
  • ไม่เพิ่มอักขระขึ้นบรรทัดใหม่หากอยู่ในวงเล็บ (เช่นforบล็อก)

ตัวอย่างการป้อนข้อมูล (ฉันเพิ่มบางกรณีตามความคิดเห็นของ Quincunx เพื่อให้คุณสามารถตรวจสอบว่ามันทำงานอย่างถูกต้อง):

    /* Hai Worldz. This code is to prevent formatting: if(this_code_is_touched){,then+your*program_"doesn't({work)}correctl"y.} */
#include<stdio.h>
#include<string.h>
int main() {
int i;
char s[99];
     printf("----------------------\n;;What is your name?;;\n----------------------\n\""); //Semicolon added in the {;} string just to annoy you
             /* Now we take the {;} input: */
    scanf("%s",s);
    for(i=0;i<strlen(s);i++){if(s[i]>='a'&&s[i]<='z'){
        s[i]-=('a'-'A'); //this is same as s[i]=s[i]-'a'+'A'
}}printf("Your \"name\" in upper case is:\n%s\n",s);
   return 0;}

ตัวอย่างผลลัพธ์:

[~/projects/indent]$ cat example.c | ./wspace indent.ws 2>/dev/null

/* Hai Worldz. This code is to prevent formatting: if(this_code_is_touched){,then+your*program_"doesn't({work)}correctl"y.} */
#include<stdio.h>
#include<string.h>
int main() {
  int i;;
  char s[99];;
  printf("----------------------\n;;What is your name?;;\n----------------------\n\"");; //Semicolon added in the {;} string just to annoy you
  /* Now we take the {;} input: */
  scanf("%s",s);;
  for(i=0;i<strlen(s);i++){
    if(s[i]>='a'&&s[i]<='z'){
      s[i]-=('a'-'A');; //this is same as s[i]=s[i]-'a'+'A'
    }
  }
  printf("Your \"name\" in upper case is:\n%s\n",s);;
  return 0;;
}

โปรดทราบว่าเนื่องจากช่องว่างไม่รองรับ EOF การตรวจสอบผู้บุกรุกจึงเกิดข้อยกเว้นซึ่งเราต้องระงับ เนื่องจากไม่มีช่องว่างในการตรวจสอบ EOF (เท่าที่ฉันรู้เนื่องจากเป็นโปรแกรมช่องว่างแรกของฉัน) นี่เป็นสิ่งที่หลีกเลี่ยงไม่ได้ฉันหวังว่าโซลูชันจะยังคงมีอยู่

นี่คือสคริปต์ที่ฉันใช้ในการรวบรวมรุ่นที่มีคำอธิบายประกอบเป็นช่องว่างที่เหมาะสม:

#!/usr/bin/env ruby
ARGF.each_line do |line|
  data = line.gsub(/'.'/) { |match| match[1].ord }
  data = data.gsub(/[^-LST0-9#]/,'').split('#').first
  if data
    data.tr!('LST',"\n \t")
    data.gsub!(/[-0-9]+/){|m| "#{m.to_i<0?"\t":" "}#{m.to_i.abs.to_s(2).tr('01'," \t")}\n" }
    print data
  end
end

วิ่ง:

./wscompiler.rb annotated.ws > indent.ws

หมายเหตุว่านี้นอกเหนือจากการแปลงS, LและTตัวอักษรนอกจากนี้ยังให้ความคิดเห็นบรรทัดเดียวกับ#โดยอัตโนมัติและสามารถแปลงตัวเลขและตัวอักษรของตัวละครที่ง่ายในการเป็นตัวแทนช่องว่างของพวกเขา รู้สึกอิสระที่จะใช้มันสำหรับโครงการช่องว่างอื่น ๆ ถ้าคุณต้องการ


ไม่เลว! :) แต่มันจะดีกว่าถ้ามันไม่แบ่ง a สำหรับลูปเป็นสามบรรทัด (ในความคิดของฉันอย่างน้อย ... มันยังขึ้นอยู่กับผู้มีสิทธิเลือกตั้งในการตัดสินใจ) เพื่อเป็นการเตือนความจำสำหรับลูปใน C มีไวยากรณ์for(i=0;i<10;i++)
user12205

2
@ace: เนื่องจากช่องว่างไม่ใช่ภาษาระดับสูงที่เพิ่มข้อยกเว้นเหล่านี้ไม่ใช่เรื่องง่าย ที่กล่าวว่าฉันยังคงพยายามที่จะแก้ไขปัญหาทั้งสองด้วยความคิดเห็นและตัวอักษรและพยายามจัดการเพื่อแก้ไขลูปเช่นกัน (ฉันคิดว่าการเพิกเฉย;ภายใน(/ )บล็อกจะเพียงพอ) ฉันคิดว่าสิ่งเหล่านั้นควรจะเพียงพอที่จะพิจารณาวิธีการแก้ปัญหา "ใช้งานได้"
SztupY

1
@ace: ฉันคิดว่าฉันจัดการเพื่อเพิ่มข้อยกเว้นดังนั้นตอนนี้รหัสที่สร้างขึ้นดูเหมือนจะถูกเยื้องอย่างถูกต้อง เปลี่ยนตัวอย่างเป็นหนึ่งของคุณ
SztupY

9

VIM วิธีที่ง่ายในทางเทคนิคโดยใช้เพียงตัวละครตัวหนึ่ง:=

ฉันไม่ได้เป็นกูรูที่ไร้เดียงสา แต่ฉันไม่เคยประมาทว่ามันมีพลังและบางคนคิดว่ามันเป็นภาษาการเขียนโปรแกรม สำหรับฉันทางออกนี้เป็นผู้ชนะอยู่ดี

เปิดไฟล์เป็นกลุ่ม:

vim file.c

ภายในกลุ่มกดปุ่มต่อไปนี้

gg=G

คำอธิบาย:

gg ไปที่ด้านบนของไฟล์

= เป็นคำสั่งเพื่อแก้ไขการเยื้อง

G บอกให้ดำเนินการจนสิ้นสุดไฟล์

คุณสามารถบันทึกและออกด้วย :wq

เป็นไปได้ที่จะให้vimรันคำสั่งจากบรรทัดคำสั่งดังนั้นสิ่งนี้สามารถทำได้ในหนึ่งซับ แต่ฉันปล่อยให้คนที่รู้vimดีกว่าฉัน


เป็นกลุ่มตัวอย่าง ไฟล์อินพุตที่ถูกต้อง (fibonacci.c) ที่มีการเยื้องที่ไม่ดี

/* Fibonacci Series c language */
#include<stdio.h>

int main()
{
int n, first = 0, second = 1, next, c;

            printf("Enter the number of terms\n");
scanf("%d",&n);
  printf("First %d terms of Fibonacci series are :-\n",n);

          for ( c = 0 ; c < n ; c++ )
   {
if ( c <= 1 )
         next = c;
 else
                                     {
next = first +    second;
              first = second;
        second = next;
      }
      printf("%d\n",next);
   }
 return 0;
}

เปิดเป็นกลุ่ม: vim fibonacci.cกดgg=G

/* Fibonacci Series c language */
#include<stdio.h>

int main()
{
  int n, first = 0, second = 1, next, c;

  printf("Enter the number of terms\n");
  scanf("%d",&n);
  printf("First %d terms of Fibonacci series are :-\n",n);

  for ( c = 0 ; c < n ; c++ )
  {
    if ( c <= 1 )
      next = c;
    else
    {
      next = first +    second;
      first = second;
      second = next;
    }
    printf("%d\n",next);
  }
  return 0;
}


สิ่งนี้สามารถย่อให้เล็กลง=GZZได้ (เป็นกลุ่มกอล์ฟ ftw!)
Doorknob

7

เนื่องจากสิ่งนี้จะถูกใช้เพื่อช่วยให้ครูเข้าใจรหัสของนักเรียนดีขึ้นจึงเป็นสิ่งสำคัญที่จะต้องทำความสะอาดข้อมูลที่ป้อนให้ถูกต้อง คำสั่งของตัวประมวลผลล่วงหน้านั้นไม่จำเป็นเนื่องจากพวกเขาเป็นเพียงผู้บุกรุกและแมโครยังสามารถแนะนำโค้ดที่เป็นอันตรายลงในไฟล์ได้ เราไม่ต้องการมัน! นอกจากนี้ยังไม่จำเป็นอย่างสมบูรณ์ในการเก็บความคิดเห็นดั้งเดิมที่นักเรียนเขียนไว้เนื่องจากอาจไร้ประโยชน์โดยสิ้นเชิง

แต่เนื่องจากทุกคนรู้รหัสที่ดีต้องมีความคิดเห็นที่ดีนอกเหนือจากการแก้ไขการเยื้องและโครงสร้างทำไมไม่เพิ่มความคิดเห็นที่มีประโยชน์บางอย่างรอบจุดหลักของรหัสเพื่อให้ได้ผลลัพธ์ที่เข้าใจได้มากขึ้น! สิ่งนี้จะช่วยครูในการประเมินงานที่นักเรียนทำ!

ดังนั้นจากนี้

    /* Hai Worldz. This code is to prevent formatting: if(this_code_is_touched){,then+your*program_"doesn't({work)}correctl"y.} */
#include<stdio.h>
#include<string.h>
int main() {
int i;
char s[99];
     printf("----------------------\n;;What is your name?;;\n----------------------\n\""); //Semicolon added in the {;} string just to annoy you
             /* Now we take the {;} input: */
    scanf("%s",s);
    for(i=0;i<strlen(s);i++){if(s[i]>='a'&&s[i]<='z'){
        s[i]-=('a'-'A'); //this is same as s[i]=s[i]-'a'+'A'
}}printf("Your \"name\" in upper case is:\n%s\n",s);
   return 0;}

ผลิตสิ่งนี้กัน:

int main() {
    /* This will declare i. */
    int i;
    /* This will declare s[99]. */
    char s[99];
    /* This will call the function called printf with 1 parameters */
    printf("----------------------\n;;What is your name?;;\n----------------------\n\"");
    /* This will call the function called scanf with 2 parameters */
    scanf("%s", s);
    /* This will start a for loop, with initializator i = 0. It will loop until i < strlen(s), and will i++ at each iteration */
    for (i = 0; i < strlen(s); i++) {
        /* This will check, whether s[i] >= 'a' && s[i] <= 'z' is true or not. */
        if (s[i] >= 'a' && s[i] <= 'z') {
            s[i] -= 'a' - 'A';
        }
    }
    /* This will call the function called printf with 2 parameters */
    printf("Your \"name\" in upper case is:\n%s\n", s);
    /* This will return from the function. */
    return 0;
}

มันดีกว่านี้หรือเปล่ากับความคิดเห็นที่เป็นประโยชน์ทั้งหมดรอบ ๆ นิพจน์?


ดังนั้นนี่คือทับทิมวิธีการแก้ปัญหาการใช้castอัญมณีซึ่งเป็น parser C (ใช่ฉันโกง) เช่นนี้จะแยกรหัสและพิมพ์ซ้ำตั้งแต่เริ่มต้นหมายความว่าผลจะถูกเยื้องอย่างสมบูรณ์และสอดคล้องกันเช่น:

  • เยื้องที่เหมาะสมในรหัสตามระดับบล็อก
  • การเว้นวรรคอย่างสอดคล้องกันรอบสำนวนคำสั่งเงื่อนไข ฯลฯ
  • ดำเนินการเยื้องใหม่โดยสมบูรณ์ตามโครงสร้างของโค้ด
  • เป็นต้น

และมันจะมีความคิดเห็นที่มีประโยชน์อย่างมากเกี่ยวกับวิธีการทำงานของรหัสซึ่งจะมีประโยชน์อย่างยิ่งสำหรับทั้งนักเรียนและครู!

indent.rb

#!/usr/bin/env ruby
require 'cast'

code = ''
ARGF.each_line do |line|
  if line=~/\A#/
    code << "// #{line.strip}\n"
  else
    code << line
  end
end

class Comment < C::Literal
  field :val
  initializer :val
  def to_s
    "/* #{val} */"
  end
end

tree = C.parse(code)
tree.preorder do |n|
  break if n.kind_of?(Comment)
  if n.kind_of?(C::Declaration)
    dd = []
    n.declarators.each do |d|
      dd << "declare #{d.indirect_type ? d.indirect_type.to_s(d.name) : d.name}"
      dd.last << " and set it to #{d.init}" if d.init
    end
    unless dd.empty?
      n.insert_prev(Comment.new("This will #{dd.join(", ")}."))
    end
  end rescue nil
  n.parent.insert_prev(Comment.new("This will call the function called #{n.expr} with #{n.args.length} parameters")) if n.kind_of?(C::Call) rescue nil
  n.insert_prev(Comment.new("This will start a for loop, with initializator #{n.init}. It will loop until #{n.cond}, and will #{n.iter} at each iteration")) if n.kind_of?(C::For) rescue nil
  n.insert_prev(Comment.new("This will check, whether #{n.cond} is true or not.")) if n.kind_of?(C::If) rescue nil
  n.insert_prev(Comment.new("This will return from the function.")) if n.kind_of?(C::Return) rescue nil
end

puts tree

Gemfile

source "http://rubygems.org"
gem 'cast', '0.2.1'

3
+1 สำหรับit is completely unnecessary to retain the original comments the student wrote, as they are probably completely useless anyway
SeinopSys

ความคิดเห็นเหล่านั้นไม่ได้อธิบายถึงฉัน พวกเขาแนะนำความยุ่งเหยิงเพราะเพียงแค่ย้ำบรรทัดต่อไปนี้
Justin

@Quincunx ฉันคิดว่าคุณพลาดแท็กประชดประชัน นี่คือการประกวดความนิยม
SztupY

5

Bash, 35 ตัวอักษร

ไฟล์อินพุตต้องมีชื่อว่า "input.c" และวางในไดเร็กทอรีการทำงานปัจจุบัน

sh <(wget -q -O- http://x.co/3snpk)

ตัวอย่างผลลัพธ์ที่ได้รับการป้อนข้อมูลในคำถามเดิม: http://i.imgur.com/JEI8wa9.png

อาจใช้เวลาสองสามวินาทีในการทำงานขึ้นอยู่กับฮาร์ดแวร์ของคุณดังนั้นโปรดอดทนรอ :)


คุณรู้ไหมว่านี่ไม่ใช่โค้ดกอล์ฟใช่มั้ย
Justin

1
+1 สำหรับการดาวน์โหลดและรวบรวม AStyle ในทันที Oo คุณจะไม่ปล่อยให้ AStyle อยู่ที่นั่นเพื่อความสะดวกของผู้ใช้หรือไม่? ดังนั้นเอาrm?
tomsmeding

เนื่องจากนี่ไม่ใช่ code-golf ฉันคิดว่ามันจะเป็นการดีกว่าถ้าคุณใส่เนื้อหาของ pastebin ของคุณที่นี่เนื่องจากมองอย่างรวดเร็วฉันไม่ได้สังเกตว่าคุณกำลังจัดรูปแบบรหัสอย่างถูกต้องด้วยคำสั่งจากภายนอก
SztupY

@Quincunx: มันควรจะเป็นคำตอบที่หมุนรอบ: P
Riot

@tomsmeding: ฉันจะไม่ต้องการรหัสของฉันที่จะมีผลข้างเคียงเช่นการเพิ่มพื้นที่ว่างในดิสก์ของผู้ใช้โดยไม่คาดคิด ...
ศึก

3

ทับทิม

code = DATA.read

# first, we need to replace strings and comments with tilde escapes to avoid parsing them
code.gsub! '~', '~T'
lineComments = []
code.gsub!(/\/\/.*$/) { lineComments.push $&; '~L' }
multilineComments = []
code.gsub!(/\/\*.*?\*\//m) { multilineComments.push $&; '~M' }
strs = []
code.gsub!(/"(\\.|[^"])*"|'.'/) { strs.push $&; '~S' } # character literals are considered strings

# also, chop out preprocessor stuffs
preprocessor = ''
code.gsub!(/(^#.*\n)+/) { preprocessor = $&; '' }

# clean up newlines and excess whitespace
code.gsub! "\n", ' '
code.gsub! /\s+/, ' '
code.gsub!(/[;{}]/) { "#{$&}\n" }
code.gsub!(/[}]/) { "\n#{$&}" }
code.gsub! /^\s*/, ''
code.gsub! /\s+$/, ''

# fix for loops (with semicolons)
code.gsub!(/^for.*\n.*\n.*/) { $&.gsub ";\n", '; ' }

# now it's time for indenting; add indent according to {}
indentedCode = ''
code.each_line { |l|
    indentedCode += ('    ' * [indentedCode.count('{') - indentedCode.count('}') - (l =~ /^\}/ ? 1 : 0), 0].max) + l
}
code = indentedCode

# finally we're adding whitespace for more readability. first get a list of all operators
opsWithEq = '= + - * / % ! > < & | ^ >> <<'
opsNoEq = '++ -- && ||'
ops = opsWithEq.split + opsWithEq.split.map{|o| o + '=' } + opsNoEq.split
ops = ops.sort_by(&:length).reverse
# now whitespace-ize them
code.gsub!(/(.)(#{ops.map{|o| Regexp.escape o }.join '|'})(.)/m) { "#{$1 == ' ' ? ' ' : ($1 + ' ')}#{$2}#{$3 == ' ' ? ' ' : (' ' + $3)}" }

# special-cases: only add whitespace to the right
ops = ','.split
code.gsub!(/(#{ops.map{|o| Regexp.escape o }.join '|'})(.)/m) { "#{$1}#{$2 == ' ' ? ' ' : (' ' + $2)}" }
# special-cases: only add whitespace to the left
ops = '{'.split
code.gsub!(/(.)(#{ops.map{|o| Regexp.escape o }.join '|'})/m) { "#{$1 == ' ' ? ' ' : ($1 + ' ')}#{$2}" }

# replace the tilde escapes and preprocessor stuffs
stri = lci = mci = -1
code.gsub!(/~(.)/) {
    case $1
    when 'T'
        '~'
    when 'S'
        strs[stri += 1]
    when 'L'
        lineComments[lci += 1] + "\n#{code[0, $~.begin(0)].split("\n").last}"
    when 'M'
        multilineComments[mci += 1]
    end
}
code = (preprocessor + "\n" + code).gsub /^ +\n/, ''

puts code
__END__
    /* Hai Worldz. This code is to prevent formatting: if(this_code_is_touched){,then+your*program_"doesn't({work)}correctl"y.} */
#include<stdio.h>
#include<string.h>
int main() {
int i;
char s[99];
     printf("----------------------\n;;What is your name?;;\n----------------------\n\""); //Semicolon added in the {;} string just to annoy you
             /* Now we take the {;} input: */
    scanf("%s",s);
    for(i=0;i<strlen(s);i++){if(s[i]>='a'&&s[i]<='z'){
        s[i]-=('a'-'A'); //this is same as s[i]=s[i]-'a'+'A'
}}printf("Your \"name\" in upper case is:\n%s\n",s);
   return 0;}

เอาท์พุท:

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

int main() {
    int i;
    char s[99];
    printf("----------------------\n;;What is your name?;;\n----------------------\n");
    //Semicolon added in the string just to annoy you
     /* Now we take the input: */ scanf("%s", s);
    for(i = 0; i < strlen(s); i ++ ) {
        if(s[i] >= 'a' && s[i] <= 'z') {
            s[i] -= ('a' - 'A');
            //this is same as s[i]=s[i]-'a'+'A'
        }
    }
    printf("Your name in upper case is:\n%s\n", s);
    return 0;
}

เอาต์พุตสำหรับอินพุตเคสของ @ SztupY:

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

/* Hai Worldz. This code is to prevent formatting: if(this_code_is_touched){,then+your*program_"doesn't({work)}correctl"y.} */ int main() {
    int i;
    char s[99];
    printf("----------------------\n;;What is your name?;;\n----------------------\n\"");
    //Semicolon added in the {;} string just to annoy you
     /* Now we take the {;} input: */ scanf("%s", s);
    for(i = 0; i < strlen(s); i ++ ) {
        if(s[i] >= 'a' && s[i] <= 'z') {
            s[i] -= ('a' - 'A');
            //this is same as s[i]=s[i]-'a'+'A'
        }
    }
    printf("Your \"name\" in upper case is:\n%s\n", s);
    return 0;
}

จนถึงตอนนี้:

  • [x] เพิ่มการเยื้องที่เหมาะสมที่ด้านหน้าของแต่ละบรรทัด
  • [x]เพิ่มช่องว่างหลัง,และผู้ประกอบการอื่น ๆ เช่นการแปลงไปint a[]={1,2,3}; int a[] = {1, 2, 3};จำไม่ได้ว่าจะดำเนินการกับผู้ประกอบการภายในตัวอักษรสตริงแม้ว่า
  • [x] ลบช่องว่างต่อท้ายหลังแต่ละบรรทัด
  • [x]การแยกข้อความออกเป็นหลายบรรทัดเช่นนักเรียนอาจเขียนtmp=a;a=b;b=tmp;หรือint f(int n){if(n==1||n==2)return 1;else return f(n-1)+f(n-2);}ทั้งหมดในหนึ่งบรรทัดคุณสามารถแยกมันออกเป็นหลายบรรทัดได้ ระวังforลูปแม้ว่าพวกเขาจะมีเครื่องหมายอัฒภาคในพวกเขา แต่ฉันไม่คิดว่าคุณควรแยกพวกเขาออก
  • [ ] เพิ่มบรรทัดใหม่หลังจากกำหนดแต่ละฟังก์ชั่น
  • [ ] คุณสมบัติอื่น ๆ ที่คุณจะได้รับจากความช่วยเหลือที่คุณเข้าใจรหัสนักเรียน

3

สิ่งนี้เขียนด้วยไพ ธ อนและใช้มาตรฐานการเข้ารหัสของ GNU

จนถึงตอนนี้:

  • เยื้องบล็อก
  • เส้นแบ่ง (อาจแยกสิ่งที่ไม่ควรเป็น)
  • นิยามฟังก์ชันของ GNU

รหัส:

import sys

file_in = sys.argv[1]

# Functions, for, if, while, and switch statements
def func_def(string):
    ret = ["", "", ""]
    func_name = ""
    paren_level = -1
    consume_id = False

    for x in string[::-1]:
        if x == "{":
            ret[2] = "{"
        elif ret[1] == "":
            if x == "(":
                paren_level -= 1
                func_name += x
            elif x == ")":
                paren_level += 1
                func_name += x
            elif paren_level == -1 and x.isspace():
                if consume_id:
                    ret[1] = func_name[::-1]
            elif paren_level == -1:
                consume_id = True
                func_name += x
            else:
                func_name += x
        else:
            # Return Type
            ret[0] += x
    else:
        ret[1] = func_name[::-1]

    ret[0] = ret[0][::-1]

    # Handle the case in which this is just a statement
    if ret[1].split("(")[0].strip() in ["for", "if", "while", "switch"]:
        ret = [ret[1], ret[2]] # Don't print an extra line

    return ret

with open(file_in) as file_obj_in:
    line_len = 0
    buffer = ""
    in_str = False
    no_newline = False
    indent_level = 0
    tab = " " * 4
    no_tab = False
    brace_stack = [-1]

    while True:
        buffer += file_obj_in.read(1)
        if buffer == "":
            break
        elif "\n" in buffer:
            if not no_newline:
                print(("" if no_tab else indent_level * tab) + buffer, end="")
                buffer = ""
                line_len = indent_level * 4
                no_tab = False
                continue
            else:
                buffer = ""
                line_len = indent_level * 4
                no_newline = False
                continue
        elif buffer[-1] == '"':
            in_str = not in_str
        elif buffer.isspace():
            buffer = ""
            continue

        if "){" in "".join(buffer.split()) and not in_str:
            for x in func_def(buffer):
                print(indent_level * tab + x)
            buffer = ""
            line_len = indent_level * 4
            no_newline = True
            indent_level += 1
            brace_stack[0] += 1
            brace_stack.append((brace_stack[0], True))
            continue
        elif buffer[-1] == "}" and not in_str:
            brace_stack[0] -= 1
            if brace_stack[-1][1]: # If we must print newline and indent
                if not buffer == "}":
                    print(indent_level * tab + buffer[:-1].rstrip("\n"))
                indent_level -= 1
                print(indent_level * tab + "}")
                buffer = ""
                line_len = indent_level * 4
            else:
                pass
            brace_stack.pop()
        line_len += 1

        if line_len == 79 and not in_str:
            print(indent_level * tab + buffer)
            buffer = ""
            line_len = indent_level * 4
            continue
        elif line_len == 78 and in_str:
            print(indent_level * tab + buffer + "\\")
            buffer = ""
            line_len = indent_level * 4
            no_tab = True
            continue

อินพุตตัวอย่าง (ส่งชื่อไฟล์เป็นอาร์กิวเมนต์):

#include <stdio.h>
#include<string.h>
int main() {
int i;
char s[99];
     printf("----------------------\n;;What is your name?;;\n----------------------\n"); //Semicolon added in the string just to annoy you
             /* Now we take the input: */
    scanf("%s",s);
    for(i=0;i<strlen(s);i++){if(s[i]>='a'&&s[i]<='z'){
        s[i]-=('a'-'A'); //this is same as s[i]=s[i]-'a'+'A'
}}printf("Your name in upper case is:\n%s\n",s);
   return 0;}

ตัวอย่างผลลัพธ์:

#include <stdio.h>
#include<string.h>
int
main()
{
    int i;
    char s[99];
    printf("----------------------\n;;What is your name?;;\n------------------\
----\n"); //Semicolon added in the string just to annoy you
    /* Now we take the input: */
    scanf("%s",s);
    for(i=0;i<strlen(s);i++)
    {
        if(s[i]>='a'&&s[i]<='z')
        {
            s[i]-=('a'-'A'); //this is same as s[i]=s[i]-'a'+'A'
        }
    }
    printf("Your name in upper case is:\n%s\n",s);
    return 0;
}

นี้จะมีข้อบกพร่อง


0

.สุทธิ

เปิดไฟล์นั้นโดยใช้ Visual Studio

การป้อนข้อมูล:

#include<stdio.h>
#include<string.h>
int main() {
int i;
char s[99];
     printf("----------------------\n;;What is your name?;;\n----------------------\n\""); //Semicolon added in the {;} string just to annoy you
             /* Now we take the {;} input: */
    scanf("%s",s);
    for(i=0;i<strlen(s);i++){if(s[i]>='a'&&s[i]<='z'){
            s[i]-=('a'-'A'); //this is same as s[i]=s[i]-'a'+'A'
    }
}printf("Your \"name\" in upper case is:\n%s\n",s);
       return 0;}

เอาท์พุท:

ป้อนคำอธิบายรูปภาพที่นี่


2
นี่เป็นความคิดที่ดี แต่ความท้าทายคือการประกวดเขียนโปรแกรม คุณสามารถเขียนโปรแกรมที่เปิดไฟล์นี้ด้วย visual studio แล้วบันทึกเป็นไฟล์ที่สวยได้หรือไม่?
Justin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.