只用c语言,不用c++,写一个函数int f(char*s1,char*s2),按字典顺序比较字符串s1和s2的大小,如果sl>s2返回整数,ssl=s2返回0,sl<s2返回负数,要求不能使用strcmp函数。
时间: 2023-08-03 18:04:53 浏览: 94
可以使用以下代码实现:
```c
int f(char *s1, char *s2) {
while (*s1 && *s2 && (*s1 == *s2)) { // 遍历两个字符串,直到出现不同字符或者有一个字符串结束
s1++;
s2++;
}
return *s1 - *s2; // 返回差值
}
```
这个函数会先遍历两个字符串,直到出现不同的字符或者有一个字符串结束。如果 s1 > s2,则返回正数;如果 s1 = s2,则返回 0;如果 s1 < s2,则返回负数。
相关问题
strcmpn能比较c语言风格字符串和c++语言风格字符串吗
`strcmp`函数是C语言标准库中的一个函数,用于比较两个C风格的字符串。其原型如下:
```c
int strcmp(const char *s1, const char *s2);
```
它会根据ASCII值比较两个字符串`s1`和`s2`,如果`s1`在字典序上小于`s2`,则返回负值;如果`s1`等于`s2`,则返回0;如果`s1`大于`s2`,则返回正值。
C++风格的字符串通常是`std::string`类型,它有自己的比较操作符重载,可以直接使用比较运算符(如`<`, `==`, `>`)来比较两个`std::string`对象。
`strcmp`函数不能直接用于比较C++风格的字符串,因为它们是不同的类型。但是,你可以使用C++提供的转换方法,如`std::string::c_str()`,来获取C++字符串对象内部的C风格字符串指针,然后用`strcmp`进行比较:
```cpp
std::string cpp_str = "Hello";
const char *c_str = cpp_str.c_str();
if (strcmp(c_str, "Hello") == 0) {
// 字符串相等
}
```
请注意,使用`strcmp`进行比较时,如果字符串包含非ASCII字符(如中文字符),可能无法正确比较,因为`strcmp`是基于ASCII值进行比较的。在C++中,处理非ASCII字符的字符串比较,应该使用`std::string`的比较方法,它们考虑了字符编码,可以正确处理多字节字符。
设计一个学生成绩查询统计系统 内容要求: (1)分析数据的逻辑结构。 (2)设计数据的存储结构。(诸如一个记录应包括哪些字段数据,每个字段的数据是什么类型的,应用什么数据结构来保存众多的记录) (3)根据学生姓名进行字典排序。 (4)根据成绩进行由高到低排序。(用冒泡算法) (5)根据学号或姓名查找学生成绩。(采用二分查找法,并实现查找结构的打印) (6)统计各分数段(≥90分、80-89分、70-79分、60-69分、60分以下)的学生人数及其所占比例,并打印统计的结果。 (7)编写主要的C语言代码,尤其是对函数头部涉及的主要参数要进行注释说明。 (8)系统的程序结构可以考虑采用多文件组合框架,也可以采用单文件多模块组合框架。
分析数据的逻辑结构:
该系统需要存储每个学生的信息,包括学号、姓名、语文成绩、数学成绩、英语成绩等字段。每个学生的信息可以看作一个记录。
设计数据的存储结构:
可以采用结构体数组的方式来存储学生的信息,每个结构体包含一个学生的所有信息。具体实现如下:
```c
typedef struct student {
char id[20];
char name[20];
float chinese;
float math;
float english;
float total; // 总分
} Student;
Student students[100]; // 最多存储100个学生的信息
int count = 0; // 学生数量
```
根据学生姓名进行字典排序:
可以采用字符串比较的方式,使用strcmp()函数进行比较。具体实现如下:
```c
int cmp_by_name(const void* a, const void* b) {
Student* s1 = (Student*)a;
Student* s2 = (Student*)b;
return strcmp(s1->name, s2->name);
}
// 排序
qsort(students, count, sizeof(Student), cmp_by_name);
```
根据成绩进行由高到低排序:
可以采用冒泡排序的方式,具体实现如下:
```c
void sort_by_total() {
for (int i = 0; i < count - 1; i++) {
for (int j = 0; j < count - i - 1; j++) {
if (students[j].total < students[j + 1].total) {
swap(&students[j], &students[j + 1]);
}
}
}
}
// 交换两个学生的信息
void swap(Student* s1, Student* s2) {
Student temp = *s1;
*s1 = *s2;
*s2 = temp;
}
```
根据学号或姓名查找学生成绩:
可以采用二分查找法,需要先将学生信息按照学号或姓名进行排序。具体实现如下:
```c
int cmp_by_id(const void* a, const void* b) {
Student* s1 = (Student*)a;
Student* s2 = (Student*)b;
return strcmp(s1->id, s2->id);
}
// 排序
qsort(students, count, sizeof(Student), cmp_by_id);
// 二分查找
int binary_search(char* key, int type) {
int left = 0;
int right = count - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (type == 0) {
if (strcmp(students[mid].id, key) == 0) {
return mid;
} else if (strcmp(students[mid].id, key) < 0) {
left = mid + 1;
} else {
right = mid - 1;
}
} else if (type == 1) {
if (strcmp(students[mid].name, key) == 0) {
return mid;
} else if (strcmp(students[mid].name, key) < 0) {
left = mid + 1;
} else {
right = mid - 1;
}
}
}
return -1; // 没有找到
}
```
统计各分数段的学生人数及其所占比例:
可以遍历所有学生信息,根据分数段进行统计。具体实现如下:
```c
void count_by_score() {
int a = 0, b = 0, c = 0, d = 0, e = 0;
for (int i = 0; i < count; i++) {
if (students[i].total >= 90) {
a++;
} else if (students[i].total >= 80) {
b++;
} else if (students[i].total >= 70) {
c++;
} else if (students[i].total >= 60) {
d++;
} else {
e++;
}
}
printf(">=90: %d, %.2f%%\n", a, a * 100.0 / count);
printf("80-89: %d, %.2f%%\n", b, b * 100.0 / count);
printf("70-79: %d, %.2f%%\n", c, c * 100.0 / count);
printf("60-69: %d, %.2f%%\n", d, d * 100.0 / count);
printf("<60: %d, %.2f%%\n", e, e * 100.0 / count);
}
```
完整代码如下:
阅读全文