#include<stdio.h> char f(int n){ char result; int k=0; k=(n>=93)+(n>=85)+(n>=80)+(n>=75)+(n>=70)+(n>=65)+(n>=60); switch(k){ case 0:result='F';break; case 1:result='D';break; case 2:result='C';break; case 3:result='C+';break; case 4:result='B';break; case 5:result='B+';break; case 6:result='A';break; case 7:result='A+';break; } return result; } int main(){ int N; printf("Name_f Name_l stu_id score retake GPA rank\n"); for(N=0; N<100; N++){ char lname,fname; int n,m,f1,f2; f1=n/100000000; scanf("%c",&lname); getchar(); scanf("%c",&fname); scanf("%d %d",&n,&m); if(n<202000000000 || n>202300000000) continue; if(f1=2022) f2=0; else f2=1; printf("%c %c %d %d %d %c\n",lname,fname,n,m,f2,f(n)); } return 0; }
时间: 2023-12-09 07:02:49 浏览: 121
这段代码有几个问题?
1. 函数f中,返回值类型为char,但是在 case 3 中返回了字符串 "C+",这是不正确的。
2. 在 main 函数中,f1 的值没有被初始化,应该在读入学号 n 后进行初始化,避免出现未定义行为。
3. 在判断 f1 是否等于 2022 的时候,应该使用等于号 "==" 而不是赋值运算符 "="。
4. 在输出 GPA 的时候,应该进行计算,而不是直接输出 f2 的值。
5. 在输出 GPA 和 rank 的时候,没有进行换行,这样输出的结果会比较混乱。
6. 在读入 lname 和 fname 的时候,应该使用 scanf("%c %c", &lname, &fname),这样可以避免在输入时出现空格。
7. 程序中没有进行错误处理,如果输入的数据格式不符合要求,程序会出现异常终止。应该在输入的时候进行错误处理,避免程序崩溃。
8. 在函数 f 中,变量 k 的初始值没有被赋值。虽然在后面的语句中会对 k 进行赋值,但是这种写法会让代码难以理解。应该在定义变量 k 的时候就对其进行初始化,避免出现问题。
9. 在函数 f 中,变量 result 的初始值没有被赋值。虽然在后面的语句中会对 result 进行赋值,但是这种写法会让代码难以理解。应该在定义变量 result 的时候就对其进行初始化,避免出现问题。
相关问题
#include <stdio.h> #include <stdlib.h> #include <ctype.h> #define MAX_FILENAME_LEN 256 #define MAX_LINE_LEN 1024 struct CountResult { int word_count; int letter_count; int digit_count; int space_count; int newline_count; int punct_count; int other_count; }; struct CountResult count_chars(const char* filename) { struct CountResult result = { 0, 0, 0, 0, 0, 0, 0 }; FILE* fp; char line[MAX_LINE_LEN]; int c; int i;
这段代码定义了一个名为 CountResult 的结构体,包含了单词数量、字母数量、数字数量、空格数量、换行数量、标点符号数量和其他字符数量这七个成员变量。然后定义了一个名为 count_chars 的函数,该函数接受一个文件名作为参数,返回一个 CountResult 结构体类型的结果。
在函数内部,首先定义了一个名为 result 的 CountResult 结构体变量,并将其所有成员变量初始化为 0。然后打开了该文件名对应的文件,并逐行读取文件内容。在每一行中,函数统计了字母、数字、空格、换行、标点符号和其他字符的数量,并将结果累加到 result 结构体变量的相应成员变量中。
最后,函数返回了统计结果 result。
分析代码:#include <stdio.h> #include <time.h> #include <stdlib.h> #include <errno.h> #include <unistd.h> #include <pthread.h> //char buf[] = "welcome"; void * handler(void *p)//void *p = buf; { getchar(); printf("%s\n", (char *)p); return p; pthread_exit(p); } void f(char **p)//char **p = &s; { char *q = "dadf"; *p = q; } int main(int argc, char *argv[]) { char *s = NULL; f(&s); printf("%s\n", s); #if 1 pthread_t thread; char buf[] = "welcome"; void *result; if (pthread_create(&thread, NULL, handler, (void *)buf)) exit(-1); pthread_join(thread, &result);//exit(0); waitpid(pid, &status, 0); printf("***\n"); printf("result:%s\n", (char *)result); while (1); #endif exit(0); }
这段代码主要涉及了线程以及指针的使用。
首先,在 `f` 函数中,使用了一个二级指针 `char **p`,并将其传入函数中。在函数中,又定义了一个指针 `q`,并将其指向了一个字符串常量。然后,将 `q` 的值赋给了 `p` 指向的内存地址,即 `s`,最后在 `main` 函数中输出了 `s` 的值。
在 `main` 函数中,定义了一个指针 `s`,并将其初始化为 `NULL`。然后,调用了 `f` 函数,并将 `s` 的地址传入。`f` 函数中将 `s` 指向了一个字符串常量,因此在 `main` 函数中输出 `s` 的值时,会输出 `dadf`。
接下来,使用了线程,在 `handler` 函数中,定义了一个指针 `p`,并将其强制类型转换为 `char*` 类型。然后,通过 `getchar()` 等待用户输入,最后将 `p` 返回。在 `main` 函数中,通过 `pthread_create` 函数创建了一个新的线程,并将 `handler` 函数作为线程入口函数,`buf` 的地址作为参数传入。然后,通过 `pthread_join` 函数等待线程的退出,并获取返回值。最后,在 `main` 函数中输出了返回值。
需要注意的是,代码中存在一个 `waitpid` 函数,但是在代码中并没有定义 `pid` 变量,因此这一行代码会导致编译错误。可以将其注释掉,或者在代码中定义 `pid` 变量并赋值。此外,代码中的 `pthread_exit(p)` 函数永远不会被执行,因为其位于 `return` 语句之后。
阅读全文