#include<stdio.h> #include<stdlib.h> int Binary_search(int *s,int length,int key);//二分查找函数 void sort(int *s,int length);//对数组进行排序函数 int main() { int m; int i; int key; int n[100];//待排序数组 scanf("%d",&m); for(i=0;i<m;i++) scanf("%d",&n[i]); sort(n,m); printf("数据递增排序的结果:\n"); for(i=0;i<m;i++) printf("%d ",n[i]); printf("\n"); scanf("%d",&key); int pos=Binary_search(n,m,key); if(pos==-1) printf("没有找到需要查询的数据:\n"); else printf("数据%d的索引位置 %d\n",key,pos); return 0; } void sort(int *s,int length)//对数组进行排序函数 { //改进版的冒泡排序算法 递增排序 int i=length-1;//比较的次数 int j; int t; int flag=1; while(flag) { flag=0; for(j=0;j<i;j++) { if(s[j]>s[j+1]) { t=s[j]; ; s[j+1]=t;//交换数据 flag=1; } } i--; } } int Binary_search(int *s,int length,int key)//二分查找函数 { int L,H,M; L=0; H=length-1; while(L<=H) { ; if(s[M]==key) return M; if(key<s[M]) H= ; else L=M+1; } return -1; }请将下面二分查找程序补充完整。
时间: 2024-03-14 16:45:54 浏览: 22
下面是完整的二分查找程序:
```c
int Binary_search(int *s, int length, int key)
{
int L, H, M;
L = 0;
H = length - 1;
while (L <= H) {
M = (L + H) / 2;
if (s[M] == key)
return M;
if (key < s[M])
H = M - 1;
else
L = M + 1;
}
return -1;
}
```
二分查找的思路是:首先将待查找的区间的左端点L设为0,将右端点H设为n-1(n为数组长度),然后计算中间位置M。如果要查找的值等于s[M],则查找成功,返回M;否则,如果要查找的值小于s[M],则在左半区间继续查找;如果要查找的值大于s[M],则在右半区间继续查找。每次查找都将待查找区间缩小一半,直到找到要查找的值或者区间缩小到只有一个元素为止。如果最终没有找到要查找的值,则返回-1表示查找失败。
相关问题
先依次输入元素为简单类型(int、char)的数个数据元素建立顺序存储的线性表,然后以该线性表为查找表进行顺序查找;再用冒泡排序对该线性表按某个关键字值进行排序,在排序之后的线性表之上进行折半查找。用C语言实现
好的,以下是实现代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义线性表结构体
typedef struct {
int* data; // 数据指针
int length; // 线性表长度
} SqList;
// 初始化线性表
void InitList(SqList* L, int length) {
L->data = (int*)malloc(sizeof(int) * length); // 申请内存
L->length = length;
printf("请输入 %d 个整数:\n", length);
for (int i = 0; i < length; i++) {
scanf("%d", &(L->data[i])); // 逐个输入数据元素
}
}
// 顺序查找
int SequentialSearch(SqList L, int key) {
for (int i = 0; i < L.length; i++) {
if (L.data[i] == key) {
return i; // 找到返回下标
}
}
return -1; // 未找到返回-1
}
// 冒泡排序
void BubbleSort(SqList* L) {
for (int i = 0; i < L->length - 1; i++) {
for (int j = 0; j < L->length - i - 1; j++) {
if (L->data[j] > L->data[j + 1]) {
int temp = L->data[j];
L->data[j] = L->data[j + 1];
L->data[j + 1] = temp;
}
}
}
}
// 折半查找
int BinarySearch(SqList L, int key) {
int left = 0, right = L.length - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (L.data[mid] == key) {
return mid;
} else if (L.data[mid] < key) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1; // 未找到返回-1
}
int main() {
SqList L;
int length, key;
printf("请输入线性表长度:\n");
scanf("%d", &length);
InitList(&L, length);
printf("请输入要查找的关键字:\n");
scanf("%d", &key);
int index = SequentialSearch(L, key);
if (index != -1) {
printf("在顺序表中找到了关键字 %d,下标为 %d\n", key, index);
} else {
printf("在顺序表中未找到关键字 %d\n", key);
}
BubbleSort(&L);
printf("排序后的线性表为:\n");
for (int i = 0; i < L.length; i++) {
printf("%d ", L.data[i]);
}
printf("\n请输入要查找的关键字:\n");
scanf("%d", &key);
index = BinarySearch(L, key);
if (index != -1) {
printf("在排序后的线性表中找到了关键字 %d,下标为 %d\n", key, index);
} else {
printf("在排序后的线性表中未找到关键字 %d\n", key);
}
free(L.data); // 释放内存
return 0;
}
```
希望可以帮到你!
写一个c语言读二进制文件通过websocket 发包函数
以下是一个简单的C语言函数,可以读取二进制文件并将其通过WebSocket发送出去:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <openssl/sha.h>
#include <openssl/bio.h>
#include <openssl/evp.h>
#include <openssl/buffer.h>
#define BUF_SIZE 4096
char *base64_encode(const unsigned char *buffer, size_t length) {
BIO *bio, *b64;
BUF_MEM *bufferPtr;
b64 = BIO_new(BIO_f_base64());
bio = BIO_new(BIO_s_mem());
bio = BIO_push(b64, bio);
BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL);
BIO_write(bio, buffer, length);
BIO_flush(bio);
BIO_get_mem_ptr(bio, &bufferPtr);
char *outputBuffer = (char *)calloc(1, bufferPtr->length + 1);
memcpy(outputBuffer, bufferPtr->data, bufferPtr->length);
outputBuffer[bufferPtr->length] = '\0';
BIO_free_all(bio);
return outputBuffer;
}
int send_file(char *filename, char *host, int port, char *path) {
FILE *fp;
char buf[BUF_SIZE];
int sock;
struct sockaddr_in serv_addr;
// 打开文件
fp = fopen(filename, "rb");
if (fp == NULL) {
perror("Error opening file");
return 1;
}
// 创建socket
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == -1) {
perror("Error creating socket");
return 1;
}
// 设置服务器地址
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(host);
serv_addr.sin_port = htons(port);
// 连接服务器
if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1) {
perror("Error connecting to server");
return 1;
}
// 构造WebSocket头部
char *ws_header = "GET %s HTTP/1.1\r\n"
"Host: %s:%d\r\n"
"Upgrade: websocket\r\n"
"Connection: Upgrade\r\n"
"Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
"Sec-WebSocket-Version: 13\r\n\r\n";
char *request = (char *)calloc(1, strlen(path) + strlen(ws_header) + 20);
sprintf(request, ws_header, path, host, port);
// 发送WebSocket头部
send(sock, request, strlen(request), 0);
// 接收服务器返回的WebSocket头部
char response[BUF_SIZE];
recv(sock, response, BUF_SIZE, 0);
// 读取文件内容并发送
while (1) {
size_t bytes_read = fread(buf, 1, BUF_SIZE, fp);
if (bytes_read == 0) {
break;
}
// 将数据转换为WebSocket帧
unsigned char *frame = (unsigned char *)calloc(1, bytes_read + 10);
frame[0] = 0x82; // FIN + Binary
frame[1] = bytes_read;
memcpy(frame + 2, buf, bytes_read);
// 发送WebSocket帧
send(sock, frame, bytes_read + 2, 0);
free(frame);
}
// 关闭socket和文件
fclose(fp);
close(sock);
return 0;
}
int main(int argc, char *argv[]) {
if (argc != 5) {
printf("Usage: %s filename host port path\n", argv[0]);
return 1;
}
char *filename = argv[1];
char *host = argv[2];
int port = atoi(argv[3]);
char *path = argv[4];
send_file(filename, host, port, path);
return 0;
}
```
该函数使用了WebSocket协议将二进制文件发送给服务器。在函数中,我们首先打开文件,然后创建一个socket并连接到服务器。接下来,我们构造一个WebSocket头部,包含了文件内容的相关信息,并将其发送到服务器。
然后,我们读取文件内容,将其转换为WebSocket帧,并发送到服务器。最后,我们关闭socket和文件。
需要注意的是,该函数使用了OpenSSL库中的base64编码函数,因此需要在编译时链接OpenSSL库。可以使用以下命令编译该程序:
```bash
gcc send_file.c -o send_file -lssl -lcrypto
```
其中,`-lssl`和`-lcrypto`参数表示链接OpenSSL库。