Clang
问题描述
本题要求你修改以下的 C 语言程序, 使其能够通过编译并且输出正确的内容. 程序包含多个子任务 (Task), 每个子任务需要修改指定的代码部分. 具体修改范围已通过注释标明, 任务部分位于 /* Task X */
的注释区域之间.
每个任务的预期输出也已在注释中说明, 例如:
// Expected: "x has the value 5"
printf("x has the value %\n", x);
那么执行到这里的时候, 你需要保证 x = 5
.
修改的方法可能不唯一, 只要输出与预期结果一致即可得分.这一类题目的目的是学会如何修复 C 语言开发中常见的错误, 如果你把所有代码删掉, 直接输出文本, 并不会影响得分, 但是缺少了一次锻炼机会.
需要修改的 C 语言代码
#include <stdio.h>
#include <stdlib.h>
void task1() {
// Task 1
/* Task 1 */
x = 5;
/* End Task 1 */
// Expected: "Task 1: x has the value 5"
printf("Task 1: x has the value %d\n", x);
}
void task2() {
// Task 2
/* Task 2 */
int x = 1;
x += 2;
// Expected: "Task 2: Number 3"
printf("Task 2: Number %f\n", x);
/* End Task 2 */
}
/* Task 3 */
void bigger(int a, int b) {
// Task 3
// Fix this function to return the bigger number!
}
/* End Task 3 */
void task3() {
// Task 3
// Expected: "Task 3: The bigger one is 5"
printf("Task 3: The bigger one is %d\n", bigger(3, 5));
}
void task4() {
// Task 4
/* Task 4 */
int is_evening; // You need to initialize this variable.
/* End Task 4 */
if (is_evening) {
// Expected: print Task 4: Good night!
printf("Task 4: Good evening!\n");
}
else {
printf("Task 4: Good night!\n");
}
}
void task5() {
// Task 5
/* Task 5 */
union unit {
char *name;
double age;
};
union unit person;
/* End Task 5 */
person.name = "Furry McFurson";
person.age = 3.5;
// Expected: "Task 5: Furry McFurson is 3.5 years old."
printf("Task 5: %s is %.1f years old.\n", person.name, person.age);
}
void task6() {
// Task 6
// Expected: "Task 6: 2 is the 2nd number in the tuple"
/* Task 6 */
int numbers[] = {1, 2, 3};
int second = numbers[2]; // Represents the second element
/* End Task 6 */
printf("Task 6: %d is the 2nd number in the tuple\n", second);
}
void task7() {
// Task 7
// Expected: "Task 7: The length is 3"
int a[] = {1, 2, 3};
/* Task 7 */
unsigned long size = sizeof(a);
/* End Task 7 */
printf("Task 7: The length is %lu\n", size);
}
void task8() {
// Task 8
// Expected: print clang
/* Task 8 */
char p[] = {'c', 'l', 'a', 'n', 'g'};
printf("Task 8: %s\n", p);
/* End Task 8 */
}
int **OnesMat(int size) {
int **ones = (int **)malloc(size * sizeof(int *));
for (int i=0; i<size; i++) {
ones[i] = (int *)malloc(size * sizeof(int));
}
for (int i=0; i<=size; i++){
for (int j=0; j<=size; j++){
ones[i][j] = 1;
}
}
return ones;
}
int *IntSeq(int begin, int end) {
int size = end - begin;
int *seq = (int *)malloc(size*sizeof(int));
seq[0] = begin;
for (int i=0; i<size; i++){
seq[i+1] = seq[i] + 1;
}
return seq;
}
void task9() {
//generate mat with one and integer sequence (without end)
int **mat = OnesMat(2);
// expected: [[1, 1], [1, 1]]
printf("Task 9: [[%d, %d], [%d, %d]]\n", mat[0][0], mat[0][1], mat[1][0], mat[1][1]);
int *vec = IntSeq(1, 4);
// expected: [1, 2, 3]
printf("Task 9: [%d, %d, %d]\n", vec[0], vec[1], vec[2]);
}
int *MatMulVec(int **A, int *x, int length) {
int *result = (int *)malloc(length*sizeof(int));
for (int i=0; i<length; i++){
for (int j=0; j<length; j++){
result[i] += A[i][j]*x[j];
}
}
return result;
}
void task10() {
// calculate Ax, A is mat (1, 1; 1, 1) x is vec (1, 2)^T
int **A = OnesMat(2);
int *x = IntSeq(1, 3);
int *result = MatMulVec(A, x, 2);
// expected: [3, 3]
printf("Task 10: [%d, %d]\n", result[0], result[1]);
}
int main() {
int input = scanf("%d", &input);
switch (input) {
case 1:
task1();
break;
case 2:
task2();
break;
case 3:
task3();
break;
case 4:
task4();
break;
case 5:
task5();
break;
case 6:
task6();
break;
case 7:
task7();
break;
case 8:
task8();
break;
case 9:
task9();
break;
case 10:
task10();
break;
default:
break;
}
return 0;
}
样例输入输出
输入格式
10 个样例点分别为 1-10, 对应 10 个任务.
样例 1 输入:
1
输出格式
输出内容应该与下面一致:
Task 1: x has the value 5
知识点
变量, 基本类型, 条件语句, 数组, 字符串, 指针, 结构体