c语言从文件中读取城市名,编写函数对城市名进行升序排序

img


c语言从文件中读取城市名,编写函数对城市名进行升序排序,用户输入一个城市名,如果文件中有这个城市,则显示已查找到,如果没有则显示没有找到

img


/**字符串排序*/
#include<stdio.h>
#include<string.h>
#define N 10
void Sort_String(char arr[][50], int size)
{
    char tmp[50];
    if(arr == NULL || size < 2)//字符串个数小于2的直接返回,不用排序
        {return;}
    for(int i = 0; i < size - 1; i++)
    {
        for(int j = 0; j < size - i - 1; j++)
        {
            if(strcmp(arr[j], arr[j + 1]) > 0)
            {
                //利用冒泡的排序算法对字符串进行排序
                strcpy(tmp,arr[j]);
                strcpy(arr[j],arr[j + 1]);
                strcpy(arr[j + 1],tmp);
            }
        }
    }
}
void find(char arr[][50], int size){
    int i;
    char str[50];
    printf("请输入你要查找的城市:\n");
    scanf("%s",str);
    getchar();
    for(i=0;i<N;i++){
        if(strcmp(arr[i],str)==0){printf("已查找到!\n");return ;}
    }
    printf("没有找到!\n");
    return ;
}
int main(){
  
   int n,i;
   char arr[N][50];
   FILE *fp;
    fp=fopen("city.txt","r");
   if(fp==NULL)
   {
    printf("文件打开失败!\n");
   }
   else{
    for(i=0;i<N;i++)
    {
      fscanf(fp,"%s\n",arr[i]);
    }
   }
   fclose(fp);
   Sort_String(arr,N);
   printf("排序后:\n");
   for(i=0;i<N;i++){
    puts(arr[i]);
   }
   printf("\n");
   find(arr,N);
    return 0;
}

修改一下


#include <stdio.h>
#include <string.h>
#define CITYNUM 10
int main()
{
int i,j,k,num;
char city[CITYNUM][20];
char string[80];
num=0;//实际输入的城市数初始为0
for(i=0;i<CITYNUM;i++)
{printf("input the number of the %dth city:",i+1);
gets(str);//输入城市名
if(str[0]==0)//为空串,表示输入结束
break;
if(strlen(str)>19)//城市名字符串大于19时重输
{
i--;
continue;}
strcpy(city[i],str);//将输入的城市名保存到字符串数组中
num++;}
for(i=0;i<num-1;i++)
{
k=i;//k为当前城市名中最小的字符串数组中的下标,初始值假设为i
for(j=i+1;j<num;j++)、、查找比city[k]小的字符串的下标并放入k中
if(stricmp(city[k],city[j]>0)
k=j;
if (k!=i)//将最小城市名的字符串city[k]与city[i]交换
{
strcpy(str,city[i]);
strcpy(city[i],city[k]);
strcpy(city[k],str);
}
}
for (i=0;i<num;i++)//显示排序后的结果
printf("%S",city[i]);
printf("\n");
return 0;
}

示例代码如下,望采纳:

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

#define MAX_CITIES 100

// 城市名的最大长度
#define MAX_CITY_NAME_LEN 50

// 城市名结构体
typedef struct {
  char name[MAX_CITY_NAME_LEN];
} City;

// 从文件中读取城市名
int read_cities_from_file(const char *filename, City *cities, int max_cities) {
  FILE *fp = fopen(filename, "r");
  if (fp == NULL) {
    printf("Error: Unable to open file %s\n", filename);
    return 0;
  }

  int num_cities = 0;
  while (num_cities < max_cities && fscanf(fp, "%s", cities[num_cities].name) == 1) {
    num_cities++;
  }

  fclose(fp);
  return num_cities;
}

// 城市名比较函数,用于 qsort 函数
int compare_cities(const void *a, const void *b) {
  const City *city_a = (const City *)a;
  const City *city_b = (const City *)b;
  return strcmp(city_a->name, city_b->name);
}

// 在城市名数组中查找给定的城市名
int find_city(const City *cities, int num_cities, const char *city_name) {
  for (int i = 0; i < num_cities; i++) {
    if (strcmp(cities[i].name, city_name) == 0) {
      return i;
    }
  }
  return -1;
}

int main(int argc, char **argv) {
  if (argc < 2) {
    printf("Usage: %s cities_file\n", argv[0]);
    return 1;
  }

  // 从文件中读取城市名
  City cities[MAX_CITIES];
  int num_cities = read_cities_from_file(argv[1], cities, MAX_CITIES);
  if (num_cities == 0) {
    return 1;
  }

  // 对城市名进行升序排序
  qsort(cities, num_cities, sizeof(City), compare_cities);

  char city_name[MAX_CITY_NAME_LEN];
  printf("Enter a city name: ");
  // 读取用户输入的城市名
  scanf("%s", city_name);

  // 在城市名数组中查找给定的城市名
  int index = find_city(cities, num_cities, city_name);
  if (index >= 0) {
    printf("City found at index %d\n", index);
  } else {
    printf("City not found\n");
  }

  return 0;
}

详细代码实现如下,望采纳

#include <stdio.h>
#include <string.h>
#define N 100
// 声明函数
void sort(char (*city)[N], int n);
int search(char (city)[N], int n, char target);
int main() {
  // 从文件中读取城市名
  char city[N][N];
  int n = 0;
  FILE* fp = fopen("city.txt", "r");
  while(fgets(city[n], N, fp)) {
    city[n][strlen(city[n]) - 1] = '\0';
    // 去掉换行符
    n++;
  }
  fclose(fp);
  // 对城市名进行升序排序
  sort(city, n);
  // 用户输入一个城市名
  char target[N];
  printf("请输入要查找的城市名:");
  scanf("%s", target);
  // 在城市名中查找
  int result = search(city, n, target);
  if(result == -1) {
    printf("没有找到\n");
  } else {
    printf("已查找到\n");
  }
  return 0;
}
// 实现函数
void sort(char (*city)[N], int n) {
  // 冒泡排序
  for (int i = 0; i < n - 1; i++) {
    for (int j = 0; j < n - 1 - i; j++) {
      if(strcmp(city[j], city[j + 1]) > 0) {
        char tmp[N];
        strcpy(tmp, city[j]);
        strcpy(city[j], city[j + 1]);
        strcpy(city[j + 1], tmp);
      }
    }
  }
}
int search(char (city)[N], int n, char target) {
  // 二分查找
  int left = 0, right = n - 1;
  while(left <= right) {
    int mid = (left + right) / 2;
    if(strcmp(city[mid], target) == 0) {
      return mid;
    } else if(strcmp(city[mid], target) < 0) {
      left = mid + 1;
    } else {
      right = mid - 1;
    }
  }
  return -1;
}