鱼C论坛

 找回密码
 立即注册
查看: 674|回复: 6

[已解决]输入不得重复

[复制链接]
发表于 2023-11-7 19:20:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Eat.随 于 2023-11-7 21:07 编辑

想要编写一个C语言程序,并实现以下功能
1.用户持续输入数字
2.当用户输入的数字与之前输入每一个的数字重复时,停止。
最佳答案
2023-11-7 20:33:34
sh-5.2$ cat main.c
#include "list.h"
#include <stdio.h>

size_t find(const list_t *list, int n) {
    for(size_t i = 0; i < list_size(list); ++i) {
        int x; list_get(list, i, &x, sizeof(x));
        if(x == n) return i;
    }
    return -1;
}

int main(void) {
    list_t *list = list_init();
    while(1) {
        int n; scanf("%d", &n);
        if(find(list, n) != -1) break;
        list_append(list, &n, sizeof(n));
    }
    list_deinit(list);
    return 0;
}
sh-5.2$ cat list.h
#ifndef _LIST_H_
#define _LIST_H_

#include <stddef.h>
#include <stdbool.h>

struct list_node_tag {
    void *data; size_t size;
    struct list_node_tag *next;
};

typedef struct {
    struct list_node_tag *head;
    size_t size;
} list_t;

list_t *list_init(void);
void list_deinit(list_t *list);
bool list_clean(list_t *list);
bool list_insert(list_t *list, size_t index, const void *data, size_t size);
bool list_delete(list_t *list, size_t index);
bool list_get(const list_t *list, size_t index, void *data, size_t size);
bool list_set(list_t *list, size_t index, const void *data, size_t size);
bool list_append(list_t *list, const void *data, size_t size);
size_t list_size(const list_t *list);
bool list_empty(const list_t *list);

#endif
sh-5.2$ cat list.c
#include "list.h"
#include <stdlib.h>
#include <string.h>

static struct list_node_tag *new_node(const void *data, size_t size) {
    struct list_node_tag *result = malloc(sizeof(*result));
    if(!result) return NULL;
    result->data = malloc(size);
    if(!result->data) {free(result); return NULL;}
    memcpy(result->data, data, size);
    result->size = size;
    result->next = NULL;
    return result;
}

static void free_node(struct list_node_tag *n) {
    free(n->data);
    free(n);
}

static struct list_node_tag *const *locate_node_const(const list_t *list, size_t index) {
    struct list_node_tag *const *result = &list->head;
    while(index--) result = &(*result)->next;
    return result;
}

static struct list_node_tag **locate_node(list_t *list, size_t index) {
    return (struct list_node_tag **)locate_node_const(list, index);
}

list_t *list_init(void) {
    list_t *list = malloc(sizeof(*list));
    if(!list) return NULL;
    list->head = NULL;
    list->size = 0;
    return list;
}

void list_deinit(list_t *list) {
    if(!list) return;
    list_clean(list);
    free(list);
}

bool list_clean(list_t *list) {
    if(!list) return false;
    while(!list_empty(list)) if(!list_delete(list, 0)) return false;
    return true;
}

bool list_insert(list_t *list, size_t index, const void *data, size_t size) {
    if(!list) return false;
    if(list_size(list) < index) return false;
    if(!data) return false;
    struct list_node_tag **current = locate_node(list, index);
    struct list_node_tag *node = new_node(data, size);
    if(!node) return false;
    node->next = *current;
    *current = node;
    ++list->size;
    return true;
}

bool list_delete(list_t *list, size_t index) {
    if(!list) return false;
    if(list_size(list) <= index) return false;
    struct list_node_tag **current = locate_node(list, index);
    struct list_node_tag *temp = *current;
    *current = temp->next;
    free_node(temp);
    --list->size;
    return true;
}

bool list_get(const list_t *list, size_t index, void *data, size_t size) {
    if(!list) return false;
    if(list_size(list) <= index) return false;
    if(!data) return false;
    struct list_node_tag *current = *locate_node_const(list, index);
    if(current->size > size) return false;
    memcpy(data, current->data, current->size);
    return true;
}

bool list_set(list_t *list, size_t index, const void *data, size_t size) {
    bool res = list_delete(list, index);
    return res ? list_insert(list, index, data, size) : res;
}

bool list_append(list_t *list, const void *data, size_t size) {
    if(!list) return false;
    return list_insert(list, list_size(list), data, size);
}

size_t list_size(const list_t *list) {
    if(!list) return 0;
    return list->size;
}

bool list_empty(const list_t *list) {
    if(!list) return true;
    return list_size(list) == 0;
}
sh-5.2$ ./main
1 2 3
1
sh-5.2$
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-7 19:20:57 | 显示全部楼层
你可以使用Python来实现这个功能。你可以使用一个集合(set)来存储用户输入的数字,并在每次输入后检查是否重复。下面是一个示例代码:
numbers = set()
while True:
    num = input("请输入一个数字:")
    if num in numbers:
        print("输入重复,程序停止。")
        break
    numbers.add(num)

在这个示例中,我们使用了一个集合(set)来存储用户输入的数字。每次用户输入一个数字后,我们都会检查这个数字是否已经在集合中出现过,如果是的话就停止程序。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-7 19:22:22 | 显示全部楼层
#include <stdio.h>int main() {    int prev_num = -1;  // 用于存储上一个输入的数字,初始值设为-1表示第一个输入不可能重复    int current_num;    printf("请输入数字:");    scanf("%d", ¤t_num);    while (current_num != prev_num) {        prev_num = current_num;  // 更新上一个输入的数字为当前输入的数字        printf("请输入数字:");        scanf("%d", ¤t_num);    }    printf("输入重复,程序终止。\n");    return 0;}
以上是一个简单的C语言程序,实现了用户持续输入数字,当用户输入的数字与之前输入的数字重复时,程序停止。希望能帮到你。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-7 19:24:48 | 显示全部楼层
Mike_python小 发表于 2023-11-7 19:22
以上是一个简单的C语言程序,实现了用户持续输入数字,当用户输入的数字与之前输入的数字重复时,程序停 ...

但是当我输入1,2,3,再次输入1,此时程序不会停止
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-7 20:32:31 | 显示全部楼层
sh-5.2$ cat main.cpp
#include <iostream>
#include <vector>
#include <algorithm>

using std::cin;
using std::vector;
using std::find;

int main() {
    vector<int> v;
    while(true) {
        int n; cin >> n;
        if(find(v.begin(), v.end(), n) != v.end()) break;
        v.push_back(n);
    }
    return 0;
}
sh-5.2$ ./main
1 2 3
1
sh-5.2$
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-7 20:33:34 | 显示全部楼层    本楼为最佳答案   
sh-5.2$ cat main.c
#include "list.h"
#include <stdio.h>

size_t find(const list_t *list, int n) {
    for(size_t i = 0; i < list_size(list); ++i) {
        int x; list_get(list, i, &x, sizeof(x));
        if(x == n) return i;
    }
    return -1;
}

int main(void) {
    list_t *list = list_init();
    while(1) {
        int n; scanf("%d", &n);
        if(find(list, n) != -1) break;
        list_append(list, &n, sizeof(n));
    }
    list_deinit(list);
    return 0;
}
sh-5.2$ cat list.h
#ifndef _LIST_H_
#define _LIST_H_

#include <stddef.h>
#include <stdbool.h>

struct list_node_tag {
    void *data; size_t size;
    struct list_node_tag *next;
};

typedef struct {
    struct list_node_tag *head;
    size_t size;
} list_t;

list_t *list_init(void);
void list_deinit(list_t *list);
bool list_clean(list_t *list);
bool list_insert(list_t *list, size_t index, const void *data, size_t size);
bool list_delete(list_t *list, size_t index);
bool list_get(const list_t *list, size_t index, void *data, size_t size);
bool list_set(list_t *list, size_t index, const void *data, size_t size);
bool list_append(list_t *list, const void *data, size_t size);
size_t list_size(const list_t *list);
bool list_empty(const list_t *list);

#endif
sh-5.2$ cat list.c
#include "list.h"
#include <stdlib.h>
#include <string.h>

static struct list_node_tag *new_node(const void *data, size_t size) {
    struct list_node_tag *result = malloc(sizeof(*result));
    if(!result) return NULL;
    result->data = malloc(size);
    if(!result->data) {free(result); return NULL;}
    memcpy(result->data, data, size);
    result->size = size;
    result->next = NULL;
    return result;
}

static void free_node(struct list_node_tag *n) {
    free(n->data);
    free(n);
}

static struct list_node_tag *const *locate_node_const(const list_t *list, size_t index) {
    struct list_node_tag *const *result = &list->head;
    while(index--) result = &(*result)->next;
    return result;
}

static struct list_node_tag **locate_node(list_t *list, size_t index) {
    return (struct list_node_tag **)locate_node_const(list, index);
}

list_t *list_init(void) {
    list_t *list = malloc(sizeof(*list));
    if(!list) return NULL;
    list->head = NULL;
    list->size = 0;
    return list;
}

void list_deinit(list_t *list) {
    if(!list) return;
    list_clean(list);
    free(list);
}

bool list_clean(list_t *list) {
    if(!list) return false;
    while(!list_empty(list)) if(!list_delete(list, 0)) return false;
    return true;
}

bool list_insert(list_t *list, size_t index, const void *data, size_t size) {
    if(!list) return false;
    if(list_size(list) < index) return false;
    if(!data) return false;
    struct list_node_tag **current = locate_node(list, index);
    struct list_node_tag *node = new_node(data, size);
    if(!node) return false;
    node->next = *current;
    *current = node;
    ++list->size;
    return true;
}

bool list_delete(list_t *list, size_t index) {
    if(!list) return false;
    if(list_size(list) <= index) return false;
    struct list_node_tag **current = locate_node(list, index);
    struct list_node_tag *temp = *current;
    *current = temp->next;
    free_node(temp);
    --list->size;
    return true;
}

bool list_get(const list_t *list, size_t index, void *data, size_t size) {
    if(!list) return false;
    if(list_size(list) <= index) return false;
    if(!data) return false;
    struct list_node_tag *current = *locate_node_const(list, index);
    if(current->size > size) return false;
    memcpy(data, current->data, current->size);
    return true;
}

bool list_set(list_t *list, size_t index, const void *data, size_t size) {
    bool res = list_delete(list, index);
    return res ? list_insert(list, index, data, size) : res;
}

bool list_append(list_t *list, const void *data, size_t size) {
    if(!list) return false;
    return list_insert(list, list_size(list), data, size);
}

size_t list_size(const list_t *list) {
    if(!list) return 0;
    return list->size;
}

bool list_empty(const list_t *list) {
    if(!list) return true;
    return list_size(list) == 0;
}
sh-5.2$ ./main
1 2 3
1
sh-5.2$
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-7 20:53:51 | 显示全部楼层
本帖最后由 jackz007 于 2023-11-7 20:58 编辑
#include <stdio.h>
#include <conio.h>

int main(void)
{
        char c , s[2048]                    ;
        int  k , n , m                      ;
        for(k = m = 0 ; k < 2048 ;) {
                c = getch()                 ;
                n = 0                       ;
                while(n < m) {
                        if(s[n] == c) break ;
                        n ++                ;
                }
                if(n == m) {
                        s[m ++] = c         ;
                        putch(c)            ;
                } else {
                        break               ;
                }
        }
        putch('\r')                         ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-6 14:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表