【初心者歓迎】C/C++室 Ver.59【環境依存OK】 at TECH
[2ch|▼Menu]
[前50を表示]
950:デフォルトの名無しさん
08/04/23 16:19:37
>>944
最初に1文字目と異なる値 str[0]+1 で初期化しとけば良いんじゃね?
ってのは結構頭の良い発想。凡百の徒には嫌われるけどね。

でもそういうときの current_c は普通 prev_c だな。

951:デフォルトの名無しさん
08/04/23 16:22:12
>>950
そうか?ムダじゃね?

952:デフォルトの名無しさん
08/04/23 16:33:50
一つ目の文字が変わるっていう意味が分からんw

953:948
08/04/23 16:41:36
struct CTest{
  bool operator!=(const CTest& o){
    // ...
    return true;
  }
};
template<typename iter_t> void unique_each(iter_t begin, iter_t end){
  for(iter_t back,it=begin; it!=end; ++it){
    if(it==begin || *back!=*it){
      //処理
      back=it;
    }
  }
}
void f(){
  CTest v[10];
  // v[0] ...
  unique_each(v,v+sizeof(v)/sizeof(*v));
}

(∩゜д゜)アーアーきこえなーい

954:デフォルトの名無しさん
08/04/23 16:46:59
>>951
今回は文字だから 0 にしときゃ良いけど、
一般に先頭要素または直前のと異なる要素を
判定していくには良い方法だよ。

955:デフォルトの名無しさん
08/04/23 16:58:36
>>945の前提条件
nul終端文字列

>>947の前提条件
文字列

>>950の前提条件
コピーコンストラクタ
operator+
operator!=
を持っている型

>>953の前提条件
operator!=
を持っている型

956:デフォルトの名無しさん
08/04/23 17:04:34
>>955
もう>>944とは別世界に行ってるなw

957:デフォルトの名無しさん
08/04/23 17:31:55
PHPやperlでprint を使いながらデバッグするような方法をC++でもやりたいのですが、どうすればよいでしょうか??
そういうデバッグの仕方はC++では難しいのでしょうか。


958:デフォルトの名無しさん
08/04/23 17:32:34
>>944 ちょっとトリッキー、でもうまいやり方
>>945 一番シンプル
>>946 一番重要なレスw
>>953 汎用化し杉ワロタw

959:デフォルトの名無しさん
08/04/23 17:44:15
>>944
#include <algorithm>
#include <string>
#include <iostream>
#include <functional>

int main() {
  std::wstring src = L"ああいうええお";
  src.push_back(0);
  ::setlocale(LC_ALL, "ja_JP.UTF-8");
  for (std::wstring::iterator i = src.begin(); *i != 0; ++i) {
    i = std::adjacent_find(i, src.end(), std::not_equal_to<wchar_t>());
    std::wcout << i-src.begin() << *i << std::endl;;
  }
}

終端一つ加えて条件が逆のadjacent_find

>>957
エスパーするとコードを読ませて実行時に一時的な値を見るとかならデバッガ
gdbとVC付属のやつとか

960:デフォルトの名無しさん
08/04/23 17:44:31
>>944は、charの取りうる最大値を指していた場合
+1すると、オーバーする。

>>945は、処理内容次第では、\0がいきなり来た場合にヤバい。
が、あのプログラムの場合strlenの値がループの実行回数だからOK

>953は、恐らく>>944が本当に必要だったものではない可能性が高いw


961:デフォルトの名無しさん
08/04/23 17:47:00
>>959 さん
なるほどデバッガで変数に格納されてる値を見ることが出来るんですね。
ありがとうございましたm(_ _)m

962:デフォルトの名無しさん
08/04/23 17:51:55
>>>944は、charの取りうる最大値を指していた場合
>+1すると、オーバーする。

するってーと current_c=~str[0]; が適切?

963:デフォルトの名無しさん
08/04/23 17:53:43
オーバーフローしても大丈夫だろ。

964:デフォルトの名無しさん
08/04/23 17:55:39
あ、一文字目が処理されない

965:デフォルトの名無しさん
08/04/23 17:56:06
>>963
実動はともかく、規格的にはアウトだろ

966:959
08/04/23 18:12:21
リベンジ

#include <algorithm>
#include <string>
#include <iostream>
#include <functional>

int main() {
  std::wstring src = L"ああいうええお";
  ::setlocale(LC_ALL, "ja_JP.UTF-8");
  std::wstring::iterator i = src.begin();
  if (!src.empty()) {
    do {
      std::wcout << *i << std::distance(src.begin(), i) << std::endl;
      i = std::adjacent_find(i, src.end(), std::not_equal_to<wchar_t>());
    } while(i++ != src.end());
  }
}



967:デフォルトの名無しさん
08/04/23 18:15:31
そして通告されるeucJP

968:デフォルトの名無しさん
08/04/23 19:01:21
vectorの配列を作ろうと思い

vector<vector<string> > vecStrDim;
vector<string> vecStr;
string strTest = "test";

vecStr.push_back(strTest);
vecStrDim[0].push_back(vecStr);

とやってみました。コンパイルは通るのですが
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
とでて実行してもデバッグエラーになります

vecStrDim[0].push_back(vecStr);が悪いのはわかるのですが、方法が思いつきません
どうすればデバッグエラーを対処できるのでしょうか?

969:デフォルトの名無しさん
08/04/23 19:06:06
>>968
×vecStrDim[0].push_back(vecStr);
○vecStrDim.push_back(vecStr);

970:デフォルトの名無しさん
08/04/23 19:10:40
>>969
あわわ……とんでもなく馬鹿なことしてすみません
解決しました

971:デフォルトの名無しさん
08/04/23 19:14:36
そのコードがコンパイルが通ることが不思議だ…

972:デフォルトの名無しさん
08/04/23 19:29:14
シングルバイト限定なら、current_cをintか何かにして、charで表現できないデカい値にしとけばいい。

973:デフォルトの名無しさん
08/04/23 20:44:51
class内で、static付けたものは、配列にしたときコピーは作られないんですよね? すべて同じ物を参照するんですよね

974:デフォルトの名無しさん
08/04/24 00:27:08
まあ配列にしなくても1つしか実体が存在しないようになるけどな

975:デフォルトの名無しさん
08/04/24 00:49:34
#include <stdio.h>
void main(void)
{
int a;
pirntf("何か入力してください\n\n");
scanf("%d",&a);
while(1){
printf("ぐははははははは!!\n\a");
}
}
この程度しか俺は中なので書けません。プログラマーさん
お願いします。



976:デフォルトの名無しさん
08/04/24 00:50:21
↑MISSりました

#include<stdio.h>
void main(void)
{
int a,b,c;
printf("数字を入力してください\n");
scanf("%d",&a);
printf("数字をまた入力してください\n");
rewind(stdin);
scanf("%d",&b);
printf("数字をまたまた入力してください\n");
scanf("%d",&c);

if(a == b == c)
printf("等しいです,\n");
else
printf("等しくないです,\n");
}


これでa==b==cだったら"等しい"と表示させるように組んでるのに 1、1、1以外の数字は入力してもは全部"等しくないです"になるのは
なんででしょうか?

977:デフォルトの名無しさん
08/04/24 00:52:43
>>976
a == b == c は、(a == b) == c と解釈される。つまり、使い方が間違っている。
その場合、恐らくa == b && b == c でいいだろう。


978:デフォルトの名無しさん
08/04/24 00:57:13
980あたり、次スレたのむぜ

979:デフォルトの名無しさん
08/04/24 00:59:27
>>977
おおwなるほど!
ありがとうございました^^

980:デフォルトの名無しさん
08/04/24 01:11:37
>>990にパス

981:デフォルトの名無しさん
08/04/24 01:14:03
>>976
移動前のスレのコメントにもありましたが、
「君が参考にしてるものは信用しないほうがいい」
です。void main(...) はまずい。

982:デフォルトの名無しさん
08/04/24 01:17:45
void main は g++ でエラーになるしな。
gcc だと警告ですむけど。

983:981
08/04/24 01:34:22
rewind() も、あるのかわからない.....。stdin に対して rewind() ?

984:デフォルトの名無しさん
08/04/24 03:35:46
1〜100までの数字でひとつだけない数字があるのでそれを探すという問題なのですが
URLリンク(kansai2channeler.hp.infoseek.co.jp)
でひとつひとつ探す方法はあるのですが
他の方法で、まず
1〜50までの個数と51〜100までの個数を数えて
1〜50が49個
51〜100が50個で1〜50にあるとして
次は1〜25、26〜50とどんどん減らして
26〜38と39〜50の割り切れないときは13と12にしたりなどして
最後2つの数字にし
48が1個
49が0個で49がない数字とするプログラムを作りたいのですが
どなたか例みたいなものを書いていただけないでしょうか?

985:デフォルトの名無しさん
08/04/24 03:41:23
数えながら2つのファイル(小さい,大きい)に書き出していけばいいんじゃねの?

986:デフォルトの名無しさん
08/04/24 03:42:37
どこにあるのかわからないなら、ひとつひとつしらべるのが最善

987:デフォルトの名無しさん
08/04/24 03:48:07
問題でこのような方法で作りなさいとあるので作りたいんですがダメでしょうか?
#include<stdio.h>
#define N 100
int main(void){
int min , max , mid;
int count1, count2;
int data, i;
FILE *fp

ここまでの指定はあるのですが、今自力でやってみてるんですが
どう二つに分けそれ以降どのように区切っていけばいいのかよくわからないんです

988:デフォルトの名無しさん
08/04/24 04:42:58
物凄い無駄な処理だなw

再帰呼び出しを使うのが良いよ

989:988
08/04/24 04:46:09
ああ、ごめん。数字は順番に並んでるわけじゃないのか

990:デフォルトの名無しさん
08/04/24 04:54:26
諦めて全部足して5050から引け

991:デフォルトの名無しさん
08/04/24 05:18:22
#include <vector>

//trueならmidより上、falseなら下
bool hilow(int min, int mid, int max,
  std::vector<int> src, std::vector<int> dst)
{
dst.clear();
std::vector<int> hi, low;

//中間数超と以下でhi, lowに分ける
for(size_t c=min; c <= max; c++) {
if(src[c] <= mid) low.push_back(src[c]);
else hi.push_back(src[c]);
}

//個数が規定値か調べて多い方を返す
if(hi.size() == max - mid ) {
dst.swap(hi);
return ture;
}

dst.swap(low);
return false;
}


続く

992:デフォルトの名無しさん
08/04/24 05:33:54
続き
void main() {
std::vector<int> num;
//ファイルからnumに一度全部読み込む
//ここは自分で書けるでしょ?

int min, mid, max;
min = 1;
max = 100;

do {
(max - min + 1) % 2 ? mid = (max - min + 1) / 2 + 1 : mid = (max - min + 1) / 2;
if( hilow(min, mid, max, num, num) ) min = mid + 1;
else max = mid;
} while(max - min > 2);

//完了

}


993:デフォルトの名無しさん
08/04/24 05:36:05
あー色々間違ってたw

bool hilow(int min, int mid, int max,
  std::vector<int>& src, std::vector<int>& dst)

dst.clear(); は無し


f(hi.size() == max - mid ) {
dst.swap(low);
return false;
}
dst.swap(hi);
return true;
}

994:デフォルトの名無しさん
08/04/24 05:37:10
試してないけどこんな感じで良いと思うよ。
中間の出し方は微妙に間違ってるかもしれんので、自分で検証してね。

995:デフォルトの名無しさん
08/04/24 05:56:21
exeを逆アセンブルしてソースコードに組み込む定番のやり方教えて下さい

996:デフォルトの名無しさん
08/04/24 06:00:08
ソースコードでよくみかける10Lや1Lってなんのことなんでしょうか?
「1Lとは」などで検索したのですが見つかりません。
環境はC++、BCCです。どなたか回答頂ければ幸いです。

997:デフォルトの名無しさん
08/04/24 06:09:58
>>996
整数のあとにつくLはlong intであることを表す。
10はintの10。10Lはlong intの10。

998:デフォルトの名無しさん
08/04/24 06:31:33
>>997
ありがとうございます!
long intをキーワードに検索したら大体わかってきました。
long intを代入するときはLをつけるという解釈であってますか?

999:デフォルトの名無しさん
08/04/24 06:39:42
違うよ。整数リテラルそのものにも型があるの。

1 は int型
'1' は char型
1.0 は double型
1L は long型

1000:デフォルトの名無しさん
08/04/24 06:49:16
重ねてありがとうございます!
詳しい説明でよくわかりました(多分)。
単なる1でも勝手にintにされてるんですね。

1001:1001
Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。


最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4063日前に更新/246 KB
担当:undef