陈粽子 发表于 2020-2-11 14:20:15

RE: S1E2:第一个程序 | 课后测试题及答案 [修改]

刘金鸿 发表于 2020-2-11 14:37:06

7

Given2001 发表于 2020-2-11 14:39:16

# S1E2:第一个程序

## 测试题

0. 为什么我们说计算机其实是“二傻子”?

1. CPU 唯一认识的语言是什么语言?

2. C 语言编写的源代码转换为汇编语言的过程叫什么?

3. 编译型语言和解释型语言的本质区别是什么?

4. 在 Linux 系统上用 C 语言编译的可执行程序,是否能在 Windows 系统上执行?

5. 解释型编程语言是如何实现跨平台的?

6. 莫斯密码的原理其实是什么?

7. 视频中小甲鱼“故弄玄虚”的那段密文还原后是什么内容(中文)?
![密文](https://xxx.ilovefishc.com/forum/201511/20/044245t00htlkyklecl7r7.png)

## 动动手

0. 不是说一个合格的程序员需要累积 10 万行的代码量嘛!
那么这节课的动动手环节就让大家写一个计算代码量的程序吧~
程序要求:统计当前目录及所有子目录下,C 语言源文件的代码总行数。

Linux 和 MacOS:

```c
#include <stdio.h>
#include <unistd.h>
#include <dirent.h>
#include <string.h>
#include <stdlib.h>
#include <sys/stat.h>

#define MAX 256

long total;

int countLines(const char *filename);
int isCode(const char *filename);
void findAllDirs(const char *path);

int countLines(const char *filename)
{
      FILE *fp;
      int count = 0;
      int temp;

      if ((fp = fopen(filename, "r")) == NULL)
      {
                fprintf(stderr, "Can not open the file: %s\n", filename);
                return 0;
      }

      while ((temp = fgetc(fp)) != EOF)
      {
                if (temp == '\n')
                {
                        count++;
                }
      }

      fclose(fp);

      return count;
}

int isCode(const char *filename)
{
      int length;

      length = strlen(filename);

      if (!strcmp(filename + (length - 2), ".c"))
      {
                return 1;
      }
      else
      {
                return 0;
      }
}

void findAllDirs(const char *path)
{
      DIR *dp;
      struct dirent *entry;
      struct stat statbuf;

      if ((dp = opendir(path)) == NULL)
      {
                fprintf(stderr, "The path %s is wrong!\n", path);
                return;
      }

      chdir(path);
      while ((entry = readdir(dp)) != NULL)
      {
                lstat(entry->d_name, &statbuf);

                if (!strcmp(".", entry->d_name) || !strcmp("..", entry->d_name))
                        continue;

                if (S_ISDIR(statbuf.st_mode))
                {
                        findAllDirs(entry->d_name);
                }
                else
                {
                        if (isCode(entry->d_name))
                        {
                              total += countLines(entry->d_name);
                        }
                }
      }

      chdir("..");
      closedir(dp);
}

int main()
{
      char path = ".";

      printf("计算中...\n");

      findAllDirs(path);

      printf("目前你总共写了 %ld 行代码!\n\n", total);

      return 0;
}
```

Windows:

```c

#include <io.h>
#include <direct.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX      256

long total;

int countLines(const char *filename);
void findAllCodes(const char *path);
void findALLFiles(const char *path);

int countLines(const char *filename)
{
      FILE *fp;
      int count = 0;
      int temp;

      if ((fp = fopen(filename, "r")) == NULL)
      {
                fprintf(stderr, "Can not open the file:%s\n", filename);
                return 0;
      }

      while ((temp = fgetc(fp)) != EOF)
      {
                if (temp == '\n')
                {
                        count++;
                }
      }

      fclose(fp);

      return count;
}

void findAllCodes(const char *path)
{
      struct _finddata_t fa;
      long handle;
      char thePath, target;

      strcpy(thePath, path);
      if((handle = _findfirst(strcat(thePath, "/*.c"), &fa)) != -1L)
      {
                do
                {
                        sprintf(target, "%s/%s", path, fa.name);
                        total += countLines(target);
                }while (_findnext(handle, &fa) == 0);
      }

      _findclose(handle);
}

void findALLDirs(const char *path)
{
      struct _finddata_t fa;
      long handle;
      char thePath;

      strcpy(thePath, path);
      if((handle = _findfirst(strcat(thePath, "/*"), &fa)) == -1L)
      {
            fprintf(stderr, "The path %s is wrong!\n",path);
            return;
      }

      do
      {
            if (!strcmp(fa.name, ".") || !strcmp(fa.name, ".."))
                continue;

            if( fa.attrib == _A_SUBDIR)
            {
                  sprintf(thePath, "%s/%s", path, fa.name);
                  findAllCodes(thePath);
                  findALLDirs(thePath);
            }
      }while (_findnext(handle, &fa) == 0);

      _findclose(handle);
}

int main()
{
      char path = ".";

      printf("计算中...\n");

      findAllCodes(path);
      findALLDirs(path);

      printf("目前你总共写了 %ld 行代码!\n\n", total);
      system("pause");

      return 0;
}
```

---豪 发表于 2020-2-11 14:43:53

nice

591426478 发表于 2020-2-11 14:47:33

打卡

迷hotel 发表于 2020-2-11 14:51:29

感谢分享

此食此刻 发表于 2020-2-11 15:09:25

{:10_277:}对于C语言希望能坚持下去!yoyoyo!!

Shengzzz 发表于 2020-2-11 15:11:57

1111

顾佶智 发表于 2020-2-11 15:32:39

666

Qiaki 发表于 2020-2-11 15:50:40

{:10_256:}

MakinoharaShoko 发表于 2020-2-11 16:04:04

I love FishC

我瘪了 发表于 2020-2-11 16:10:11

老打错

树藤相聚 发表于 2020-2-11 16:16:41

132

yaobuke7 发表于 2020-2-11 16:16:48

1

我瘪了 发表于 2020-2-11 16:21:13

我自己打的很多错,复制了原题目也编译不对是为什么{:10_247:}

ICEGRANDE 发表于 2020-2-11 16:29:41

回复

南乔7 发表于 2020-2-11 16:37:26

168行

马尔克斯 发表于 2020-2-11 16:42:39

谢谢楼主

还没想好啊啊 发表于 2020-2-11 16:57:48

答案在哪里???

憨憨. 发表于 2020-2-11 17:35:50

本帖最后由 憨憨. 于 2020-2-11 18:59 编辑

1因为它只懂得二进制0和1
2机器语言
3编译
4编译型语言直接翻译成机器码,解释型语言转换给中间代码在发送给解释器然后在编译给cpu
5解释型语言转换给中间代码在发送给解释器然后在编译给cpu
6查看摩斯密码表
7亲们趁敌人吃饭时发起进攻
代码第一次打不对,让后复制您的对照,您的运行后显示210行。。然后我对照好的保存后显示108行。。。
页: 551 552 553 554 555 556 557 558 559 560 [561] 562 563 564 565 566 567 568 569 570
查看完整版本: S1E2:第一个程序 | 课后测试题及答案